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