def __call__(self, environ, start_response): # we override this here to ensure that this header, and only this # header, is trusted to reduce the number of potential # misconfigurations between wsgi application servers (e.g. gunicorn # which trusts three different headers out of the box for this) and # haproxy (which won't clean out bad headers by default) forwarded_proto = environ.get("HTTP_X_FORWARDED_PROTO", "http").lower() assert forwarded_proto in ("http", "https") request.environ["wsgi.url_scheme"] = forwarded_proto true_client_ip = environ.get('HTTP_TRUE_CLIENT_IP') ip_hash = environ.get('HTTP_TRUE_CLIENT_IP_HASH') forwarded_for = environ.get('HTTP_X_FORWARDED_FOR', ()) remote_addr = environ.get('REMOTE_ADDR') if (g.ip_hash and true_client_ip and ip_hash and hashlib.md5(true_client_ip + g.ip_hash).hexdigest() \ == ip_hash.lower()): request.ip = true_client_ip elif g.trust_local_proxies and forwarded_for and is_local_address(remote_addr): request.ip = forwarded_for.split(',')[-1] else: request.ip = environ['REMOTE_ADDR'] #if x-dont-decode is set, pylons won't unicode all the paramters if environ.get('HTTP_X_DONT_DECODE'): request.charset = None request.get = storify(request.GET) request.post = storify(request.POST) request.referer = environ.get('HTTP_REFERER') request.user_agent = environ.get('HTTP_USER_AGENT') request.fullpath = environ.get('FULLPATH', request.path) request.fullurl = request.host_url + request.fullpath request.port = environ.get('request_port') if_modified_since = environ.get('HTTP_IF_MODIFIED_SINCE') if if_modified_since: request.if_modified_since = read_http_date(if_modified_since) else: request.if_modified_since = None #set the function to be called action = request.environ['pylons.routes_dict'].get('action') if action: meth = request.method.upper() if meth == 'HEAD': meth = 'GET' if meth != 'OPTIONS': handler_name = meth + '_' + action else: handler_name = meth request.environ['pylons.routes_dict']['action_name'] = action request.environ['pylons.routes_dict']['action'] = handler_name return WSGIController.__call__(self, environ, start_response)
def __call__(self, environ, start_response): true_client_ip = environ.get('HTTP_TRUE_CLIENT_IP') ip_hash = environ.get('HTTP_TRUE_CLIENT_IP_HASH') forwarded_for = environ.get('HTTP_X_FORWARDED_FOR', ()) remote_addr = environ.get('REMOTE_ADDR') if (g.ip_hash and true_client_ip and ip_hash and hashlib.md5(true_client_ip + g.ip_hash).hexdigest() \ == ip_hash.lower()): request.ip = true_client_ip elif remote_addr in g.proxy_addr and forwarded_for: request.ip = forwarded_for.split(',')[-1] else: request.ip = environ['REMOTE_ADDR'] #if x-dont-decode is set, pylons won't unicode all the paramters if environ.get('HTTP_X_DONT_DECODE'): request.charset = None request.get = storify(request.GET) request.post = storify(request.POST) request.referer = environ.get('HTTP_REFERER') request.path = environ.get('PATH_INFO') request.user_agent = environ.get('HTTP_USER_AGENT') request.fullpath = environ.get('FULLPATH', request.path) request.port = environ.get('request_port') if_modified_since = environ.get('HTTP_IF_MODIFIED_SINCE') if if_modified_since: request.if_modified_since = read_http_date(if_modified_since) else: request.if_modified_since = None #set the function to be called action = request.environ['pylons.routes_dict'].get('action') if action: meth = request.method.upper() if meth == 'HEAD': meth = 'GET' request.environ['pylons.routes_dict']['action'] = \ meth + '_' + action c.thread_pool = environ['paste.httpserver.thread_pool'] c.response = Response() try: res = WSGIController.__call__(self, environ, start_response) except Exception as e: if g.exception_logging: try: log_exception(e, *sys.exc_info()) except Exception as f: print "log_exception() freaked out: %r" % f print "sorry for breaking the stack trace:" raise return res
def __call__(self, environ, start_response): true_client_ip = environ.get('HTTP_TRUE_CLIENT_IP') ip_hash = environ.get('HTTP_TRUE_CLIENT_IP_HASH') forwarded_for = environ.get('HTTP_X_FORWARDED_FOR', ()) remote_addr = environ.get('REMOTE_ADDR') if (g.ip_hash and true_client_ip and ip_hash and hashlib.md5(true_client_ip + g.ip_hash).hexdigest() \ == ip_hash.lower()): request.ip = true_client_ip elif g.trust_local_proxies and forwarded_for and is_local_address( remote_addr): request.ip = forwarded_for.split(',')[-1] else: request.ip = environ['REMOTE_ADDR'] #if x-dont-decode is set, pylons won't unicode all the paramters if environ.get('HTTP_X_DONT_DECODE'): request.charset = None request.get = storify(request.GET) request.post = storify(request.POST) request.referer = environ.get('HTTP_REFERER') request.user_agent = environ.get('HTTP_USER_AGENT') request.fullpath = environ.get('FULLPATH', request.path) request.fullurl = environ.get('FULLURL', request.url) request.port = environ.get('request_port') if_modified_since = environ.get('HTTP_IF_MODIFIED_SINCE') if if_modified_since: request.if_modified_since = read_http_date(if_modified_since) else: request.if_modified_since = None #set the function to be called action = request.environ['pylons.routes_dict'].get('action') if action: meth = request.method.upper() if meth == 'HEAD': meth = 'GET' if meth != 'OPTIONS': handler_name = meth + '_' + action else: handler_name = meth request.environ['pylons.routes_dict']['action_name'] = action request.environ['pylons.routes_dict']['action'] = handler_name return WSGIController.__call__(self, environ, start_response)
def input(*requireds, **defaults): """ Returns a `storage` object with the GET and POST arguments. See `storify` for how `requireds` and `defaults` work. """ from cStringIO import StringIO def dictify(fs): return dict([(k, fs[k]) for k in fs.keys()]) _method = defaults.pop('_method', 'both') e = ctx.env.copy() out = {} if _method.lower() in ['both', 'post']: a = {} if e['REQUEST_METHOD'] == 'POST': a = cgi.FieldStorage(fp=StringIO(data()), environ=e, keep_blank_values=1) a = dictify(a) out = dictadd(out, a) if _method.lower() in ['both', 'get']: e['REQUEST_METHOD'] = 'GET' a = dictify(cgi.FieldStorage(environ=e, keep_blank_values=1)) out = dictadd(out, a) try: return storify(out, *requireds, **defaults) except KeyError: badrequest() raise StopIteration
def __call__(self, environ, start_response): true_client_ip = environ.get('HTTP_TRUE_CLIENT_IP') ip_hash = environ.get('HTTP_TRUE_CLIENT_IP_HASH') forwarded_for = environ.get('HTTP_X_FORWARDED_FOR', ()) remote_addr = environ.get('REMOTE_ADDR') if (g.ip_hash and true_client_ip and ip_hash and md5.new(true_client_ip + g.ip_hash).hexdigest() \ == ip_hash.lower()): request.ip = true_client_ip elif remote_addr == g.proxy_addr and forwarded_for: request.ip = forwarded_for.split(',')[0] else: request.ip = environ['REMOTE_ADDR'] #if x-dont-decode is set, pylons won't unicode all the paramters if environ.get('HTTP_X_DONT_DECODE'): request.charset = None request.get = storify(request.GET) request.post = storify(request.POST) request.referer = environ.get('HTTP_REFERER') request.path = _force_utf8(environ.get('PATH_INFO')) # Enforce only valid utf8 chars in request path request.user_agent = environ.get('HTTP_USER_AGENT') request.fullpath = environ.get('FULLPATH', request.path) request.port = environ.get('request_port') if_modified_since = environ.get('HTTP_IF_MODIFIED_SINCE') if if_modified_since: request.if_modified_since = read_http_date(if_modified_since) else: request.if_modified_since = None #set the function to be called action = request.environ['pylons.routes_dict'].get('action') if action: meth = request.method.upper() if meth == 'HEAD': meth = 'GET' request.environ['pylons.routes_dict']['action'] = \ meth + '_' + action c.response = Response() res = WSGIController.__call__(self, environ, start_response) return res
def input(*requireds, **defaults): _method = defaults.pop('_method', 'both') out = rawinput(_method) try: defaults.setdefault('_unicode', True) # force unicode conversion by default. return storify(out, *requireds, **defaults) except KeyError: raise badrequest()
def cookies(*requireds, **defaults): cookie = Cookie.SimpleCookie() cookie.load(ctx.env.get('HTTP_COOKIE', '')) try: d = storify(cookie, *requireds, **defaults) for k, v in d.items(): d[k] = v and urllib.unquote(v) return d except KeyError: badrequest() raise StopIteration
def cookies(*requireds, **defaults): """ Returns a `storage` object with all the cookies in it. See `storify` for how `requireds` and `defaults` work. """ cookie = Cookie.SimpleCookie() cookie.load(ctx.env.get('HTTP_COOKIE', '')) try: return storify(cookie, *requireds, **defaults) except KeyError: badrequest() raise StopIteration
def input(*requireds, **defaults): """ Returns a `storage` object with the GET and POST arguments. See `storify` for how `requireds` and `defaults` work. """ _method = defaults.pop('_method', 'both') out = rawinput(_method) try: defaults.setdefault('_unicode', True) # force unicode conversion by default. return storify(out, *requireds, **defaults) except KeyError: raise badrequest()
def cookies(*requireds, **defaults): """ Returns a `storage` object with all the cookies in it. See `storify` for how `requireds` and `defaults` work. """ cookie = Cookie.SimpleCookie() cookie.load(ctx.env.get('HTTP_COOKIE', '')) try: d = storify(cookie, *requireds, **defaults) for k, v in d.items(): d[k] = v and urllib.unquote(v) return d except KeyError: badrequest() raise StopIteration
def input(*requireds, **defaults): """ Returns a `storage` object with the GET and POST arguments. See `storify` for how `requireds` and `defaults` work. """ from cStringIO import StringIO def dictify(fs): # hack to make web.input work with enctype='text/plain. if fs.list is None: fs.list = [] return dict([(k, fs[k]) for k in fs.keys()]) _method = defaults.pop('_method', 'both') e = ctx.env.copy() a = b = {} if _method.lower() in ['both', 'post', 'put']: if e['REQUEST_METHOD'] in ['POST', 'PUT']: if e.get('CONTENT_TYPE', '').lower().startswith('multipart/'): # since wsgi.input is directly passed to cgi.FieldStorage, # it can not be called multiple times. Saving the FieldStorage # object in ctx to allow calling web.input multiple times. a = ctx.get('_fieldstorage') if not a: fp = e['wsgi.input'] a = cgi.FieldStorage(fp=fp, environ=e, keep_blank_values=1) ctx._fieldstorage = a else: fp = StringIO(data()) a = cgi.FieldStorage(fp=fp, environ=e, keep_blank_values=1) a = dictify(a) if _method.lower() in ['both', 'get']: e['REQUEST_METHOD'] = 'GET' b = dictify(cgi.FieldStorage(environ=e, keep_blank_values=1)) out = dictadd(b, a) try: defaults.setdefault('_unicode', True) # force unicode conversion by default. return storify(out, *requireds, **defaults) except KeyError: raise badrequest()
def cookies(*requireds, **defaults): r"""Returns a `storage` object with all the request cookies in it. See `storify` for how `requireds` and `defaults` work. This is forgiving on bad HTTP_COOKIE input, it tries to parse at least the cookies it can. The values are converted to unicode if _unicode=True is passed. """ # If _unicode=True is specified, use decode_cookie to convert cookie value to unicode if defaults.get("_unicode") is True: defaults['_unicode'] = decode_cookie # parse cookie string and cache the result for next time. if '_parsed_cookies' not in ctx: http_cookie = ctx.env.get("HTTP_COOKIE", "") ctx._parsed_cookies = parse_cookies(http_cookie) try: return storify(ctx._parsed_cookies, *requireds, **defaults) except KeyError: badrequest() raise StopIteration
def action(self): return storify(self.info['action'])
def state(self): return storify(self.state_dict)
def scenes(self): return storify(self.info['scenes'])
def pointsymbol(self): return storify(self.info['pointsymbol'])
w = Wrapped(foo=1, bar=2) assert (w.foo == 1) assert (w.bar == 2) class Foo(Wrapped): defaults = dict(foo=1, bar=3) def t2(): f = Foo(bar=2) assert (f.foo == 1) assert (f.bar == 2) l1 = storify({'bar': 1}) l2 = storify({'bar': 2, 'baz': 3}) def t3(): f = Foo(l1, l2, ok=1) assert (f.bar == 1) assert (f.baz == 3) assert (f.ok == 1) #assert(f.blah == 5) def t4(): x = Wrapped(Foo()) assert (x.foo == 1) assert (x.bar == 3)
def __call__(self, environ, start_response): # we override this here to ensure that this header, and only this # header, is trusted to reduce the number of potential # misconfigurations between wsgi application servers (e.g. gunicorn # which trusts three different headers out of the box for this) and # haproxy (which won't clean out bad headers by default) forwarded_proto = environ.get("HTTP_X_FORWARDED_PROTO", "http").lower() assert forwarded_proto in ("http", "https") request.environ["wsgi.url_scheme"] = forwarded_proto true_client_ip = environ.get('HTTP_TRUE_CLIENT_IP') ip_hash = environ.get('HTTP_TRUE_CLIENT_IP_HASH') forwarded_for = environ.get('HTTP_X_FORWARDED_FOR', ()) remote_addr = environ.get('REMOTE_ADDR') if (g.ip_hash and true_client_ip and ip_hash and hashlib.md5(true_client_ip + g.ip_hash).hexdigest() \ == ip_hash.lower()): request.ip = true_client_ip elif g.trust_local_proxies and forwarded_for and is_local_address( remote_addr): request.ip = forwarded_for.split(',')[-1] else: request.ip = environ['REMOTE_ADDR'] #if x-dont-decode is set, pylons won't unicode all the paramters if environ.get('HTTP_X_DONT_DECODE'): request.charset = None request.get = storify(request.GET) request.post = storify(request.POST) request.referer = environ.get('HTTP_REFERER') request.user_agent = environ.get('HTTP_USER_AGENT') request.fullpath = environ.get('FULLPATH', request.path) request.fullurl = request.host_url + request.fullpath request.port = environ.get('request_port') if_modified_since = environ.get('HTTP_IF_MODIFIED_SINCE') if if_modified_since: request.if_modified_since = read_http_date(if_modified_since) else: request.if_modified_since = None #set the function to be called action = request.environ['pylons.routes_dict'].get('action') if action: meth = request.method.upper() if meth == 'HEAD': meth = 'GET' if meth != 'OPTIONS': handler_name = meth + '_' + action else: handler_name = meth request.environ['pylons.routes_dict']['action_name'] = action request.environ['pylons.routes_dict']['action'] = handler_name return WSGIController.__call__(self, environ, start_response)
def config(self): return storify(self.state['config'])