def check_content_type(status, headers): code = int(status.split(None, 1)[0]) # @@: need one more person to verify this interpretation of RFC 2616 # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html NO_MESSAGE_BODY = (201, 204, 304) NO_MESSAGE_TYPE = (204, 304) length = None for name, value in headers: str_name = to_string(name) if str_name.lower() == 'content-length' and value.isdigit(): length = int(value) for name, value in headers: str_name = to_string(name) if str_name.lower() == 'content-type': if code not in NO_MESSAGE_TYPE: return elif length == 0: warnings.warn(("Content-Type header found in a %s response, " "which not return content.") % code, WSGIWarning) return else: assert 0, (("Content-Type header found in a %s response, " "which must not return content.") % code) if code not in NO_MESSAGE_BODY and length is not None and length > 0: assert 0, "No Content-Type header found in headers (%s)" % headers
def check_headers(headers): assert type(headers) is list, ( "Headers (%r) must be of type list: %r" % (headers, type(headers))) for item in headers: assert type(item) is tuple, ( "Individual headers (%r) must be of type tuple: %r" % (item, type(item))) assert len(item) == 2 name, value = item if type(name) is str: try: name.encode('latin1') except UnicodeEncodeError: raise AssertionError(( "Headers name must be latin1 string or bytes." "%r is not a valid latin1 string" % (name,))) str_name = to_string(name) assert str_name.lower() != 'status', ( "The Status header cannot be used; it conflicts with CGI " "script, and HTTP status is not given through headers " "(value: %r)." % value) assert '\n' not in str_name and ':' not in str_name, ( "Header names may not contain ':' or '\\n': %r" % name) assert header_re.search(str_name), "Bad header name: %r" % name assert not str_name.endswith('-') and not str_name.endswith('_'), ( "Names may not end in '-' or '_': %r" % name) if type(value) is str: try: value.encode('latin1') except UnicodeEncodeError: raise AssertionError(( "Headers values must be latin1 string or bytes." "%r is not a valid latin1 string" % (value,))) str_value = to_string(value) assert not bad_header_value_re.search(str_value), ( "Bad header value: %r (bad char: %r)" % (str_value, bad_header_value_re.search(str_value).group(0)))