Revision 7e9760c3 daemons/ganeti-rapi

b/daemons/ganeti-rapi
39 39
import ganeti.http.server
40 40

  
41 41

  
42
class RemoteApiRequestContext(object):
43
  """Data structure for Remote API requests.
44

  
45
  """
46
  def __init__(self):
47
    self.handler = None
48
    self.handler_fn = None
49

  
50

  
42 51
class RemoteApiHttpServer(http.server.HttpServer):
43 52
  """REST Request Handler Class.
44 53

  
......
47 56
    http.server.HttpServer.__init__(self, *args, **kwargs)
48 57
    self._resmap = connector.Mapper()
49 58

  
59
  def _GetRequestContext(self, req):
60
    """Returns the context for a request.
61

  
62
    The context is cached in the req.private variable.
63

  
64
    """
65
    if req.private is None:
66
      (HandlerClass, items, args) = self._resmap.getController(req.request_path)
67

  
68
      ctx = RemoteApiRequestContext()
69
      ctx.handler = HandlerClass(items, args, req)
70

  
71
      method = req.request_method.upper()
72
      try:
73
        ctx.handler_fn = getattr(ctx.handler, method)
74
      except AttributeError, err:
75
        raise http.HttpBadRequest()
76

  
77
      req.private = ctx
78

  
79
    return req.private
80

  
50 81
  def HandleRequest(self, req):
51 82
    """Handles a request.
52 83

  
53 84
    """
54
    (HandlerClass, items, args) = self._resmap.getController(req.request_path)
55
    handler = HandlerClass(items, args, req)
56

  
57
    method = req.request_method.upper()
58
    try:
59
      fn = getattr(handler, method)
60
    except AttributeError, err:
61
      raise http.HttpBadRequest()
85
    ctx = self._GetRequestContext(req)
62 86

  
63 87
    try:
64
      result = fn()
65
      sn = handler.getSerialNumber()
88
      result = ctx.handler_fn()
89
      sn = ctx.handler.getSerialNumber()
66 90
      if sn:
67 91
        req.response_headers[http.HTTP_ETAG] = str(sn)
68 92
    except:

Also available in: Unified diff