Blob Blame Raw

from config import config
from server import Server
from request import Request
import db.holder
import exception


server = Server(config)


def application(env, start_response):
  try:
    request = Request(server, env)
    if request.method != 'GET' and request.method != 'POST':
      result = request.answer.complete_error('405 Method Not Allowed')
      return result.complete(start_response)
    if request.path is None:
      raise exception.HttpNotFound()
    if request.path and request.path[0] == 'repo':
      result = request.server.repoproxy.process(request, request.path[1:])
      return result.complete(start_response)

    if request.method == 'POST':
      request.read_postvars()
      action = request.server.actions.get(request.action)
      
      if not action:
        raise exception.HttpForbidden()
      try:
        with db.holder.Holder(request.server.dbpool, readonly = action.readonly) as connection:
          request.create_model(connection)
          result = action.process(request)
          return result.complete(start_response)
      except exception.ActionError as e:
        postvars = request.postvars
        request = Request(server, env)
        request.answer.fields.update(postvars)
        request.answer.errors += e.messages
        
    with db.holder.Holder(request.server.dbpool, readonly = True) as connection:
      request.create_model(connection)
      result = request.server.pageroot.process(request, request.path, list())
      return result.complete(start_response)
  except exception.HttpForbidden:
    result = request.server.pageforbidden.process(request, list(), list())
    return result.complete(start_response)
  except exception.HttpNotFound:
    result = request.server.pagenotfound.process(request, list(), list())
    return result.complete(start_response)