mirror of
https://github.com/kennethreitz/requests.git
synced 2026-06-05 22:50:18 +00:00
8da100f652
This change is in response to issue #879.
102 lines
3.7 KiB
Python
102 lines
3.7 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import codecs
|
|
import os
|
|
import sys
|
|
import unittest
|
|
import random
|
|
|
|
# Path hack.
|
|
sys.path.insert(0, os.path.abspath('..'))
|
|
from requests.utils import get_environ_proxies
|
|
import requests.utils
|
|
from requests.compat import is_py3, bytes
|
|
|
|
|
|
if is_py3:
|
|
unichr = chr
|
|
byteschr = lambda c: bytes([c])
|
|
else:
|
|
byteschr = chr
|
|
|
|
|
|
class UtilityTests(unittest.TestCase):
|
|
"""Tests for the JSON UTF encoding guessing code."""
|
|
|
|
codecs = (
|
|
'utf-8', 'utf-8-sig',
|
|
'utf-16', 'utf-16-le', 'utf-16-be',
|
|
'utf-32', 'utf-32-le', 'utf-32-be'
|
|
)
|
|
|
|
def test_guess_encoding(self):
|
|
# Throw 4-character ASCII strings (encoded to a UTF encoding)
|
|
# at the guess routine; it should correctly guess all codecs.
|
|
guess = requests.utils.guess_json_utf
|
|
for c in range(33, 127): # printable only
|
|
sample = unichr(c) * 4
|
|
for codec in self.codecs:
|
|
res = guess(sample.encode(codec))
|
|
self.assertEqual(res, codec)
|
|
|
|
def test_smoke_encoding(self):
|
|
# Throw random 4-byte strings at the guess function.
|
|
# Any guess for a UTF encoding is verified, a decode exception
|
|
# is a test failure.
|
|
guess = requests.utils.guess_json_utf
|
|
for i in range(1000):
|
|
sample = bytes().join(
|
|
[byteschr(random.randrange(256)) for _ in range(4)])
|
|
res = guess(sample)
|
|
if res is not None:
|
|
# This should decode without errors if this is *really*
|
|
# something in this encoding. However, UTF-8 is a lot
|
|
# more picky, so we expect errors there. UTF-16 surrogate
|
|
# pairs also fail
|
|
try:
|
|
sample.decode(res)
|
|
except UnicodeDecodeError as e:
|
|
self.assertEqual(e.args[0].replace('-', '').lower(),
|
|
res.replace('-', '').lower())
|
|
if res == 'utf-8':
|
|
self.assertTrue(e.args[-1], (
|
|
'invalid continuation byte',
|
|
'invalid start byte'))
|
|
continue
|
|
if res == 'utf-16':
|
|
self.assertEqual(e.args[-1], 'unexpected end of data')
|
|
self.assertTrue(sample[:2] in (
|
|
codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE))
|
|
# the second two bytes are in the range \ud800-\udfff
|
|
# if someone wants to add tests for that as well. I don't
|
|
# see the need; we are not testing UTF decoding here.
|
|
continue
|
|
raise
|
|
|
|
def test_get_environ_proxies_respects_no_proxy(self):
|
|
'''This test confirms that the no_proxy environment setting is
|
|
respected by get_environ_proxies().'''
|
|
|
|
# Set up some example environment settings.
|
|
os.environ['http_proxy'] = 'http://www.example.com/'
|
|
os.environ['no_proxy'] = r'localhost,.0.0.1:8080'
|
|
|
|
# Set up expected proxy return values.
|
|
proxy_yes = {'http': 'http://www.example.com/'}
|
|
proxy_no = {}
|
|
|
|
# Check that we get the right things back.
|
|
self.assertEqual(proxy_yes,
|
|
get_environ_proxies('http://www.google.com/'))
|
|
self.assertEqual(proxy_no,
|
|
get_environ_proxies('http://localhost/test'))
|
|
self.assertEqual(proxy_no,
|
|
get_environ_proxies('http://127.0.0.1:8080/'))
|
|
self.assertEqual(proxy_yes,
|
|
get_environ_proxies('http://127.0.0.1:8081/'))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|