def __call__(self, environ, start_response): wsgi_status = str(self) for morsel in self.headers.cookie.values(): self.headers.add('Set-Cookie', morsel.OutputString()) wsgi_headers = [] for k, vals in self.headers.iteritems(): try: # XXX This is a hack. It's red hot, baby. k = k.encode('US-ASCII') except UnicodeEncodeError: k = ascii_dammit(k) raise ValueError("Header key %s must be US-ASCII.") for v in vals: try: # XXX This also is a hack. It is also red hot, baby. v = v.encode('US-ASCII') except UnicodeEncodeError: v = ascii_dammit(v) raise ValueError("Header value %s must be US-ASCII.") wsgi_headers.append((k, v)) start_response(wsgi_status, wsgi_headers) body = self.body if isinstance(body, basestring): body = [body] body = (x.encode('ascii') if isinstance(x, unicode) else x for x in body) return CloseWrapper(self.request, body)
def __getitem__(self, name): """Given a name, return the last value or raise Response(400). """ try: return dict.__getitem__(self, name)[-1] except KeyError: from aspen import Response raise Response(400, "Missing key: %s" % ascii_dammit(name))
def set(self, name, raw, from_unicode, context, name_in_context): error = None try: value = raw if isinstance(value, str): value = raw.decode('US-ASCII') hydrated = from_unicode(value) except UnicodeDecodeError, error: value = ascii_dammit(value) error_detail = "Configuration values must be US-ASCII."
def __new__(cls, raw): if raw not in STANDARD_METHODS: # fast for 99.999% case for i, byte in enumerate(raw): if (i == 64) or (byte not in BYTES_ALLOWED_IN_METHOD): # "This is the appropriate response when the server does # not recognize the request method and is not capable of # supporting it for any resource." # # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html safe = ascii_dammit(raw) raise Response(501, "Your request-method violates RFC " "2616: %s" % safe) obj = super(Method, cls).__new__(cls, raw.decode("ASCII")) obj.raw = raw return obj
def __new__(cls, raw): version = versions.get(raw, None) if version is None: # fast for 99.999999% case safe = ascii_dammit(raw) if version_re.match(raw) is None: raise Response(400, "Bad HTTP version: %s." % safe) else: raise Response(505, "HTTP Version Not Supported: %s. This " "server supports HTTP/0.9, HTTP/1.0, and " "HTTP/1.1." % safe) version, decoded = version obj = super(Version, cls).__new__(cls, decoded) obj.major = version[0] # 1 obj.minor = version[1] # 1 obj.info = version # (1, 1) obj.raw = raw # 'HTTP/1.1' return obj
def __new__(cls, raw): version = versions.get(raw, None) if version is None: # fast for 99.999999% case safe = ascii_dammit(raw) if version_re.match(raw) is None: raise Response(400, "Bad HTTP version: %s." % safe) else: raise Response( 505, "HTTP Version Not Supported: %s. This " "server supports HTTP/0.9, HTTP/1.0, and " "HTTP/1.1." % safe) version, decoded = version obj = super(Version, cls).__new__(cls, decoded) obj.major = version[0] # 1 obj.minor = version[1] # 1 obj.info = version # (1, 1) obj.raw = raw # 'HTTP/1.1' return obj
def __new__(cls, raw): if raw not in STANDARD_METHODS: # fast for 99.999% case for i, byte in enumerate(raw): if (i == 64) or (byte not in BYTES_ALLOWED_IN_METHOD): # "This is the appropriate response when the server does # not recognize the request method and is not capable of # supporting it for any resource." # # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html safe = ascii_dammit(raw) raise Response( 501, "Your request-method violates RFC " "2616: %s" % safe) obj = super(Method, cls).__new__(cls, raw.decode('ASCII')) obj.raw = raw return obj
def test_ascii_dammit_works(): actual = ascii_dammit(b"comet: \xe2\x98\x84") assert actual == r"comet: \xe2\x98\x84"
def test_ascii_dammit_works(): actual = ascii_dammit("comet: \xe2\x98\x84") assert actual == r"comet: \xe2\x98\x84", actual