External Exam Download Resources Web Applications Games Recycle Bin

Web Server Algorithm - Modularity

A "main" algorithm for a web server could use modularity to improve its design:

BEGIN
  CLEAR session variable
  WHILE True

    INPUT request
    IF "home" IN request.querystring THEN
      RETURN home.html
    ENDIF

    IF "login" IN request.querystring THEN
      RETURN login.html
    ENDIF

    IF "login_post" IN request.querystring AND request.method == "POST" THEN
      authenticated = Login(request.form('username'), request.form('password'))
      IF authenticated THEN
        session['authenticated'] = True 
        REDIRECT request.querystring = "home"
      ELSE
        REDIRECT request.querystring = "login"
      ENDIF
    ENDIF

    IF "search" IN request.querystring THEN
      term = request.parameter('q')
      results = Search(term)
      page = Render(results)
      RETURN page
    ENDIF

    ...

  ENDWHILE
END

Accompanying this algorithm are the modular functions Login, Search and Render:

BEGIN Login (uname, pword)
  row = EXECUTE SQL "SELECT username, password FROM Users WHERE username == ?", (uname, )
  IF LENGTH(row) > 0 THEN
    IF row['password'] == HASH(pword) THEN
      RETURN True
    ELSE
      RETURN False
    ENDIF
  ELSE
    RETURN False
  ENDIF
END

BEGIN Search (term)
  RETURN EXECUTE SQL "SELECT * FROM Products WHERE category LIKE '%?%' OR productName LIKE '%?%'", (term, term)
END

BEGIN Render (data)
  IF LENGTH(data) > 0 THEN
    html = "<ul>"
    FOR counter = 0 TO LENGTH(data)
      html = html + "<li>" + data[counter] + "</li>"
    NEXT counter
    ENDFOR
    html = html + "</ul>"
    
  ELSE
    html = "<p>No results found.</p>"
  ENDIF
  RETURN html
END

Some points of interest:


Once implemented, the modules may function as follows:

def Login (uname, pword):
  row = [('admin','abcd1234')] #EXECUTE SQL "SELECT ...
  if len(row) > 0:
    if row[0][1] == pword: #row['password'] == HASH(pword)
      return True
    else:
      return False #uname correct, pword incorrect
  else:
    return False #uname incorrect
        
def Search (term):
  return [('phones','Apple iPhone 13'), #EXECUTE SQL "SELECT ...
          ('phones','Galaxy Samsung S21'),
          ('accessories','phone case')]

def Render (data):
  if len(data) > 0:
    html = "<ul>"
    for counter, text in enumerate(data):
      html = html + "<li>" + str(data[counter]) + "</li>" #alt: + text
    html = html + "</ul>"
  else:
    html = "<p>No results found.</p>"
  return html

authenticated = Login(uname='admin', pword='abcd1234')
print('authenticated:', authenticated)
results = Search('phone')
page = Render(results)
print('search results:')
print(page) #RETURN page