Example #1
0
    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)
Example #2
0
    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)
Example #3
0
 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))
Example #4
0
 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))
Example #5
0
 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."
Example #6
0
    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
Example #7
0
    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
Example #8
0
    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
Example #9
0
    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
Example #10
0
def test_ascii_dammit_works():
    actual = ascii_dammit(b"comet: \xe2\x98\x84")
    assert actual == r"comet: \xe2\x98\x84"
Example #11
0
def test_ascii_dammit_works():
    actual = ascii_dammit("comet: \xe2\x98\x84")
    assert actual == r"comet: \xe2\x98\x84", actual