mirror of
https://github.com/kennethreitz/requests.git
synced 2026-06-05 22:50:18 +00:00
c02520ed99
Turns out nose runs all the tests in one process, so changing the os.environ dictionary makes everything go horribly wrong.
123 lines
4.3 KiB
Python
123 lines
4.3 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().'''
|
|
|
|
# Store the current environment settings.
|
|
try:
|
|
old_http_proxy = os.environ['http_proxy']
|
|
except KeyError:
|
|
old_http_proxy = None
|
|
|
|
try:
|
|
old_no_proxy = os.environ['no_proxy']
|
|
except KeyError:
|
|
old_no_proxy = None
|
|
|
|
# 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/'))
|
|
|
|
# Return the settings to what they were.
|
|
if old_http_proxy:
|
|
os.environ['http_proxy'] = old_http_proxy
|
|
else:
|
|
del os.environ['http_proxy']
|
|
|
|
if old_no_proxy:
|
|
os.environ['no_proxy'] = old_no_proxy
|
|
else:
|
|
del os.environ['no_proxy']
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|