|
| 1 | +#!/usr/bin/python |
| 2 | +# -*- coding: utf-8 -*- |
| 3 | + |
| 4 | +import types |
| 5 | + |
| 6 | +import util |
| 7 | + |
| 8 | +class Request(object): |
| 9 | + |
| 10 | + ALIAS = ("token",) |
| 11 | + SESSIONS = {} |
| 12 | + |
| 13 | + def __init__(self, method, path, params = {}, data_j = {}, environ = {}): |
| 14 | + self.method = method |
| 15 | + self.path = path |
| 16 | + self.params = params |
| 17 | + self.data_j = data_j |
| 18 | + self.environ = environ |
| 19 | + self.session = {} |
| 20 | + self.cookies = {} |
| 21 | + self.in_headers = {} |
| 22 | + self.out_headers = {} |
| 23 | + self.warnings = [] |
| 24 | + |
| 25 | + def warning(self, message): |
| 26 | + message_t = type(message) |
| 27 | + |
| 28 | + if message_t in types.StringTypes: |
| 29 | + message = dict(message = message) |
| 30 | + elif not message_t == types.DictType: |
| 31 | + raise RuntimeError("Invalid message type '%s'", message_t) |
| 32 | + |
| 33 | + self.warnings.append(message) |
| 34 | + |
| 35 | + def get_param(self, name, default = None): |
| 36 | + if not name in self.params: return default |
| 37 | + value = self.params[name] |
| 38 | + return value[0] if value else default |
| 39 | + |
| 40 | + def set_params(self, params): |
| 41 | + self.params = params |
| 42 | + |
| 43 | + def set_json(self, data_j): |
| 44 | + self.data_j = data_j |
| 45 | + |
| 46 | + def set_header(self, name, value): |
| 47 | + self.out_headers[name] = value |
| 48 | + |
| 49 | + def resolve_params(self): |
| 50 | + self.params = self._resolve_p(self.params) |
| 51 | + |
| 52 | + def load_session(self): |
| 53 | + self.load_cookies() |
| 54 | + self.set_alias() |
| 55 | + self.set_session() |
| 56 | + |
| 57 | + def load_cookies(self): |
| 58 | + cookie_s = self.environ.get("HTTP_COOKIE", "") |
| 59 | + |
| 60 | + cookies = [cookie.strip() for cookie in cookie_s.split(";")] |
| 61 | + for cookie in cookies: |
| 62 | + if not "=" in cookie: cookie += "=" |
| 63 | + name, value = cookie.split("=", 1) |
| 64 | + self.cookies[name] = value |
| 65 | + |
| 66 | + def set_alias(self): |
| 67 | + for alias in Request.ALIAS: |
| 68 | + if not alias in self.params: continue |
| 69 | + self.params["sid"] = self.params[alias] |
| 70 | + |
| 71 | + def set_session(self, create = False): |
| 72 | + sid = self.cookies.get("sid", None) |
| 73 | + sid = self.params.get("sid", (None,))[0] or sid |
| 74 | + self.session = Request.SESSIONS.get(sid, {}) |
| 75 | + |
| 76 | + if not self.session and create: |
| 77 | + sid = util.gen_token() |
| 78 | + self.session = dict(sid = sid) |
| 79 | + Request.SESSIONS[sid] = self.session |
| 80 | + |
| 81 | + return self.session |
| 82 | + |
| 83 | + def get_warnings(self): |
| 84 | + return self.warnings |
| 85 | + |
| 86 | + def get_headers(self): |
| 87 | + return self.out_headers.items() |
0 commit comments