def test_uri_encode(self): url = "http://example.com/v1/fizbit/messages?limit=3&echo=true" self.assertEqual(uri.encode(url), url) url = "http://example.com/v1/fiz bit/messages" expected = "http://example.com/v1/fiz%20bit/messages" self.assertEqual(uri.encode(url), expected) url = u"http://example.com/v1/fizbit/messages?limit=3&e\u00e7ho=true" expected = "http://example.com/v1/fizbit/messages" "?limit=3&e%C3%A7ho=true" self.assertEqual(uri.encode(url), expected)
def test_uri_encode(self): url = 'http://example.com/v1/fizbit/messages?limit=3&echo=true' self.assertEqual(uri.encode(url), url) url = 'http://example.com/v1/fiz bit/messages' expected = 'http://example.com/v1/fiz%20bit/messages' self.assertEqual(uri.encode(url), expected) url = u'http://example.com/v1/fizbit/messages?limit=3&e\u00e7ho=true' expected = ('http://example.com/v1/fizbit/messages' '?limit=3&e%C3%A7ho=true') self.assertEqual(uri.encode(url), expected)
def test_uri_encode(self): url = 'http://example.com/v1/fizbit/messages?limit=3&echo=true' assert uri.encode(url) == url url = 'http://example.com/v1/fiz bit/messages' expected = 'http://example.com/v1/fiz%20bit/messages' assert uri.encode(url) == expected url = u'http://example.com/v1/fizbit/messages?limit=3&e\u00e7ho=true' expected = ('http://example.com/v1/fizbit/messages' '?limit=3&e%C3%A7ho=true') assert uri.encode(url) == expected
def test_uri_encode(self): url = 'http://example.com/v1/fizbit/messages?limit=3&echo=true' assert uri.encode(url) == url url = 'http://example.com/v1/fiz bit/messages' expected = 'http://example.com/v1/fiz%20bit/messages' assert uri.encode(url) == expected url = 'http://example.com/v1/fizbit/messages?limit=3&e\u00e7ho=true' expected = ('http://example.com/v1/fizbit/messages' '?limit=3&e%C3%A7ho=true') assert uri.encode(url) == expected
def test_uri_encode(self): url = 'http://example.com/v1/fizbit/messages?limit=3&echo=true' assert uri.encode(url) == url url = 'http://example.com/v1/fiz bit/messages' expected = 'http://example.com/v1/fiz%20bit/messages' assert uri.encode(url) == expected url = 'http://example.com/v1/fizbit/messages?limit=3&e\u00e7ho=true' expected = 'http://example.com/v1/fizbit/messages?limit=3&e%C3%A7ho=true' assert uri.encode(url) == expected # NOTE(minesja): Addresses #1872 assert uri.encode('%26') == '%2526' assert uri.decode(uri.encode('%26')) == '%26'
def __init__(self, status, title=None, description=None, headers=None, href=None, href_text=None, code=None): self.status = status # TODO(kgriffs): HTTP/2 does away with the "reason phrase". Eventually # we'll probably switch over to making everything code-based to more # easily support HTTP/2. When that happens, should we continue to # include the reason phrase in the title? self.title = title or status self.description = description self.headers = headers self.code = code if href: link = self.link = OrderedDict() link['text'] = (href_text or 'Documentation related to this error') link['href'] = uri.encode(href) link['rel'] = 'help' else: self.link = None
def test_prop_uri_encode_models_stdlib_quote(self): equiv_quote = functools.partial( six.moves.urllib.parse.quote, safe=uri._ALL_ALLOWED ) for case in self.uris: expect = equiv_quote(case) actual = uri.encode(case) self.assertEqual(expect, actual)
def test_prop_uri_encode_models_stdlib_quote(self): equiv_quote = functools.partial( quote, safe=uri._ALL_ALLOWED ) for case in self.uris: expect = equiv_quote(case) actual = uri.encode(case) assert expect == actual
def __init__(self, status, title=None, description=None, headers=None, href=None, href_text=None, code=None): self.status = status self.title = title self.description = description self.headers = headers self.code = code if href: link = self.link = OrderedDict() link['text'] = (href_text or 'Documentation related to this error') link['href'] = uri.encode(href) link['rel'] = 'help' else: self.link = None
def format_content_disposition(value): """Formats a Content-Disposition header given a filename.""" # NOTE(vytas): RFC 6266, Appendix D. # Include a "filename" parameter when US-ASCII ([US-ASCII]) is # sufficiently expressive. if isascii(value): return 'attachment; filename="' + value + '"' # NOTE(vytas): RFC 6266, Appendix D. # * Include a "filename*" parameter where the desired filename cannot be # expressed faithfully using the "filename" form. Note that legacy # user agents will not process this, and will fall back to using the # "filename" parameter's content. # * When a "filename*" parameter is sent, to also generate a "filename" # parameter as a fallback for user agents that do not support the # "filename*" form, if possible. # * When a "filename" parameter is included as a fallback (as per above), # "filename" should occur first, due to parsing problems in some # existing implementations. return "attachment; filename=%s; filename*=UTF-8''%s" % ( secure_filename(value), uri.encode(value))
def test_uri_encode_double(self): url = 'http://example.com/v1/fiz bit/messages' expected = 'http://example.com/v1/fiz%20bit/messages' assert uri.encode(uri.encode(url)) == expected url = u'http://example.com/v1/fizbit/messages?limit=3&e\u00e7ho=true' expected = ('http://example.com/v1/fizbit/messages' '?limit=3&e%C3%A7ho=true') assert uri.encode(uri.encode(url)) == expected url = 'http://example.com/v1/fiz%bit/mess%ages/%' expected = 'http://example.com/v1/fiz%25bit/mess%25ages/%25' assert uri.encode(uri.encode(url)) == expected url = 'http://example.com/%%' expected = 'http://example.com/%25%25' assert uri.encode(uri.encode(url)) == expected # NOTE(kgriffs): Specific example cited in GH issue url = 'http://something?redirect_uri=http%3A%2F%2Fsite' assert uri.encode(url) == url hex_digits = 'abcdefABCDEF0123456789' for c1 in hex_digits: for c2 in hex_digits: url = 'http://example.com/%' + c1 + c2 encoded = uri.encode(uri.encode(url)) assert encoded == url
def add_link(self, target, rel, title=None, title_star=None, anchor=None, hreflang=None, type_hint=None): """ Add a link header to the response. See also: https://tools.ietf.org/html/rfc5988 Note: Calling this method repeatedly will cause each link to be appended to the Link header value, separated by commas. Note: So-called "link-extension" elements, as defined by RFC 5988, are not yet supported. See also Issue #288. Args: target (str): Target IRI for the resource identified by the link. Will be converted to a URI, if necessary, per RFC 3987, Section 3.1. rel (str): Relation type of the link, such as "next" or "bookmark". See also http://goo.gl/618GHr for a list of registered link relation types. Kwargs: title (str): Human-readable label for the destination of the link (default ``None``). If the title includes non-ASCII characters, you will need to use `title_star` instead, or provide both a US-ASCII version using `title` and a Unicode version using `title_star`. title_star (tuple of str): Localized title describing the destination of the link (default ``None``). The value must be a two-member tuple in the form of (*language-tag*, *text*), where *language-tag* is a standard language identifier as defined in RFC 5646, Section 2.1, and *text* is a Unicode string. Note: *language-tag* may be an empty string, in which case the client will assume the language from the general context of the current request. Note: *text* will always be encoded as UTF-8. If the string contains non-ASCII characters, it should be passed as a ``unicode`` type string (requires the 'u' prefix in Python 2). anchor (str): Override the context IRI with a different URI (default None). By default, the context IRI for the link is simply the IRI of the requested resource. The value provided may be a relative URI. hreflang (str or iterable): Either a single *language-tag*, or a ``list`` or ``tuple`` of such tags to provide a hint to the client as to the language of the result of following the link. A list of tags may be given in order to indicate to the client that the target resource is available in multiple languages. type_hint(str): Provides a hint as to the media type of the result of dereferencing the link (default ``None``). As noted in RFC 5988, this is only a hint and does not override the Content-Type header returned when the link is followed. """ # PERF(kgriffs): Heuristic to detect possiblity of an extension # relation type, in which case it will be a URL that may contain # reserved characters. Otherwise, don't waste time running the # string through uri.encode # # Example values for rel: # # "next" # "http://example.com/ext-type" # "https://example.com/ext-type" # "alternate http://example.com/ext-type" # "http://example.com/ext-type alternate" # if '//' in rel: if ' ' in rel: rel = ('"' + ' '.join([uri.encode(r) for r in rel.split()]) + '"') else: rel = '"' + uri.encode(rel) + '"' value = '<' + uri.encode(target) + '>; rel=' + rel if title is not None: value += '; title="' + title + '"' if title_star is not None: value += ("; title*=UTF-8'" + title_star[0] + "'" + uri.encode_value(title_star[1])) if type_hint is not None: value += '; type="' + type_hint + '"' if hreflang is not None: if isinstance(hreflang, six.string_types): value += '; hreflang=' + hreflang else: value += '; ' value += '; '.join(['hreflang=' + lang for lang in hreflang]) if anchor is not None: value += '; anchor="' + uri.encode(anchor) + '"' _headers = self._headers if 'link' in _headers: _headers['link'] += ', ' + value else: _headers['link'] = value
def add_link(self, target, rel, title=None, title_star=None, anchor=None, hreflang=None, type_hint=None): """ Add a link header to the response. See also: https://tools.ietf.org/html/rfc5988 Note: Calling this method repeatedly will cause each link to be appended to the Link header value, separated by commas. Note: So-called "link-extension" elements, as defined by RFC 5988, are not yet supported. See also Issue #288. Args: target (str): Target IRI for the resource identified by the link. Will be converted to a URI, if necessary, per RFC 3987, Section 3.1. rel (str): Relation type of the link, such as "next" or "bookmark". See also http://goo.gl/618GHr for a list of registered link relation types. Kwargs: title (str): Human-readable label for the destination of the link (default None). If the title includes non-ASCII characters, you will need to use `title_star` instead, or provide both a US-ASCII version using `title` and a Unicode version using `title_star`. title_star (tuple of str): Localized title describing the destination of the link (default None). The value must be a two-member tuple in the form of (*language-tag*, *text*), where *language-tag* is a standard language identifier as defined in RFC 5646, Section 2.1, and *text* is a Unicode string. Note: *language-tag* may be an empty string, in which case the client will assume the language from the general context of the current request. Note: *text* will always be encoded as UTF-8. If the string contains non-ASCII characters, it should be passed as a "unicode" type string (requires the 'u' prefix in Python 2). anchor (str): Override the context IRI with a different URI (default None). By default, the context IRI for the link is simply the IRI of the requested resource. The value provided may be a relative URI. hreflang (str or iterable): Either a single *language-tag*, or a list or tuple of such tags to provide a hint to the client as to the language of the result of following the link. A list of tags may be given in order to indicate to the client that the target resource is available in multiple languages. type_hint(str): Provides a hint as to the media type of the result of dereferencing the link (default None). As noted in RFC 5988, this is only a hint and does not override the Content-Type header returned when the link is followed. """ # PERF(kgriffs): Heuristic to detect possiblity of an extension # relation type, in which case it will be a URL that may contain # reserved characters. Otherwise, don't waste time running the # string through uri.encode # # Example values for rel: # # "next" # "http://example.com/ext-type" # "https://example.com/ext-type" # "alternate http://example.com/ext-type" # "http://example.com/ext-type alternate" # if '//' in rel: if ' ' in rel: rel = ('"' + ' '.join([uri.encode(r) for r in rel.split()]) + '"') else: rel = '"' + uri.encode(rel) + '"' value = '<' + uri.encode(target) + '>; rel=' + rel if title is not None: value += '; title="' + title + '"' if title_star is not None: value += ("; title*=UTF-8'" + title_star[0] + "'" + uri.encode_value(title_star[1])) if type_hint is not None: value += '; type="' + type_hint + '"' if hreflang is not None: if isinstance(hreflang, six.string_types): value += '; hreflang=' + hreflang else: value += '; ' value += '; '.join(['hreflang=' + lang for lang in hreflang]) if anchor is not None: value += '; anchor="' + uri.encode(anchor) + '"' _headers = self._headers if 'link' in _headers: _headers['link'] += ', ' + value else: _headers['link'] = value
def test_uri_encode_double(self): url = 'http://example.com/v1/fiz bit/messages' expected = 'http://example.com/v1/fiz%20bit/messages' assert uri.encode(uri.encode(url)) == expected url = 'http://example.com/v1/fizbit/messages?limit=3&e\u00e7ho=true' expected = ('http://example.com/v1/fizbit/messages' '?limit=3&e%C3%A7ho=true') assert uri.encode(uri.encode(url)) == expected url = 'http://example.com/v1/fiz%bit/mess%ages/%' expected = 'http://example.com/v1/fiz%25bit/mess%25ages/%25' assert uri.encode(uri.encode(url)) == expected url = 'http://example.com/%%' expected = 'http://example.com/%25%25' assert uri.encode(uri.encode(url)) == expected # NOTE(kgriffs): Specific example cited in GH issue url = 'http://something?redirect_uri=http%3A%2F%2Fsite' assert uri.encode(url) == url hex_digits = 'abcdefABCDEF0123456789' for c1 in hex_digits: for c2 in hex_digits: url = 'http://example.com/%' + c1 + c2 encoded = uri.encode(uri.encode(url)) assert encoded == url