179
178
self._sock.bind(('127.0.0.1', 0))
180
179
self.host, self.port = self._sock.getsockname()
181
180
self._ready = threading.Event()
182
self._thread = test_server.TestThread(
183
sync_event=self._ready, target=self._accept_read_and_reply)
181
self._thread = test_server.ThreadWithException(
182
event=self._ready, target=self._accept_read_and_reply)
184
183
self._thread.start()
185
184
if 'threads' in tests.selftest_debug_flags:
186
185
sys.stderr.write('Thread started: %s\n' % (self._thread.ident,))
255
254
self.assertEqual('realm="Thou should not pass"', remainder)
258
class TestHTTPRangeParsing(tests.TestCase):
261
super(TestHTTPRangeParsing, self).setUp()
262
# We focus on range parsing here and ignore everything else
263
class RequestHandler(http_server.TestingHTTPRequestHandler):
264
def setup(self): pass
265
def handle(self): pass
266
def finish(self): pass
268
self.req_handler = RequestHandler(None, None, None)
270
def assertRanges(self, ranges, header, file_size):
271
self.assertEquals(ranges,
272
self.req_handler._parse_ranges(header, file_size))
274
def test_simple_range(self):
275
self.assertRanges([(0,2)], 'bytes=0-2', 12)
278
self.assertRanges([(8, 11)], 'bytes=-4', 12)
280
def test_tail_bigger_than_file(self):
281
self.assertRanges([(0, 11)], 'bytes=-99', 12)
283
def test_range_without_end(self):
284
self.assertRanges([(4, 11)], 'bytes=4-', 12)
286
def test_invalid_ranges(self):
287
self.assertRanges(None, 'bytes=12-22', 12)
288
self.assertRanges(None, 'bytes=1-3,12-22', 12)
289
self.assertRanges(None, 'bytes=-', 12)
292
257
class TestHTTPServer(tests.TestCase):
293
258
"""Test the HTTP servers implementations."""
390
355
def test_abs_url(self):
391
356
"""Construction of absolute http URLs"""
392
t = self._transport('http://example.com/bzr/bzr.dev/')
357
t = self._transport('http://bazaar-vcs.org/bzr/bzr.dev/')
393
358
eq = self.assertEqualDiff
394
eq(t.abspath('.'), 'http://example.com/bzr/bzr.dev')
395
eq(t.abspath('foo/bar'), 'http://example.com/bzr/bzr.dev/foo/bar')
396
eq(t.abspath('.bzr'), 'http://example.com/bzr/bzr.dev/.bzr')
359
eq(t.abspath('.'), 'http://bazaar-vcs.org/bzr/bzr.dev')
360
eq(t.abspath('foo/bar'), 'http://bazaar-vcs.org/bzr/bzr.dev/foo/bar')
361
eq(t.abspath('.bzr'), 'http://bazaar-vcs.org/bzr/bzr.dev/.bzr')
397
362
eq(t.abspath('.bzr/1//2/./3'),
398
'http://example.com/bzr/bzr.dev/.bzr/1/2/3')
363
'http://bazaar-vcs.org/bzr/bzr.dev/.bzr/1/2/3')
400
365
def test_invalid_http_urls(self):
401
366
"""Trap invalid construction of urls"""
402
self._transport('http://example.com/bzr/bzr.dev/')
367
self._transport('http://bazaar-vcs.org/bzr/bzr.dev/')
403
368
self.assertRaises(errors.InvalidURL,
405
'http://http://example.com/bzr/bzr.dev/')
370
'http://http://bazaar-vcs.org/bzr/bzr.dev/')
407
372
def test_http_root_urls(self):
408
373
"""Construction of URLs from server root"""
409
t = self._transport('http://example.com/')
374
t = self._transport('http://bzr.ozlabs.org/')
410
375
eq = self.assertEqualDiff
411
376
eq(t.abspath('.bzr/tree-version'),
412
'http://example.com/.bzr/tree-version')
377
'http://bzr.ozlabs.org/.bzr/tree-version')
414
379
def test_http_impl_urls(self):
415
380
"""There are servers which ask for particular clients to connect"""
1108
1070
Only the urllib implementation is tested here.
1074
tests.TestCase.setUp(self)
1076
self.addCleanup(self._restore_env)
1078
def _install_env(self, env):
1079
for name, value in env.iteritems():
1080
self._old_env[name] = osutils.set_or_unset_env(name, value)
1082
def _restore_env(self):
1083
for name, value in self._old_env.iteritems():
1084
osutils.set_or_unset_env(name, value)
1111
1086
def _proxied_request(self):
1112
1087
handler = _urllib2_wrappers.ProxyHandler()
1113
request = _urllib2_wrappers.Request('GET', 'http://baz/buzzle')
1088
request = _urllib2_wrappers.Request('GET','http://baz/buzzle')
1114
1089
handler.set_proxy(request, 'http')
1117
def assertEvaluateProxyBypass(self, expected, host, no_proxy):
1118
handler = _urllib2_wrappers.ProxyHandler()
1119
self.assertEquals(expected,
1120
handler.evaluate_proxy_bypass(host, no_proxy))
1122
1092
def test_empty_user(self):
1123
self.overrideEnv('http_proxy', 'http://bar.com')
1124
request = self._proxied_request()
1125
self.assertFalse(request.headers.has_key('Proxy-authorization'))
1127
def test_user_with_at(self):
1128
self.overrideEnv('http_proxy',
1129
'http://username@domain:password@proxy_host:1234')
1093
self._install_env({'http_proxy': 'http://bar.com'})
1130
1094
request = self._proxied_request()
1131
1095
self.assertFalse(request.headers.has_key('Proxy-authorization'))
1133
1097
def test_invalid_proxy(self):
1134
1098
"""A proxy env variable without scheme"""
1135
self.overrideEnv('http_proxy', 'host:1234')
1099
self._install_env({'http_proxy': 'host:1234'})
1136
1100
self.assertRaises(errors.InvalidURL, self._proxied_request)
1138
def test_evaluate_proxy_bypass_true(self):
1139
"""The host is not proxied"""
1140
self.assertEvaluateProxyBypass(True, 'example.com', 'example.com')
1141
self.assertEvaluateProxyBypass(True, 'bzr.example.com', '*example.com')
1143
def test_evaluate_proxy_bypass_false(self):
1144
"""The host is proxied"""
1145
self.assertEvaluateProxyBypass(False, 'bzr.example.com', None)
1147
def test_evaluate_proxy_bypass_unknown(self):
1148
"""The host is not explicitly proxied"""
1149
self.assertEvaluateProxyBypass(None, 'example.com', 'not.example.com')
1150
self.assertEvaluateProxyBypass(None, 'bzr.example.com', 'example.com')
1152
def test_evaluate_proxy_bypass_empty_entries(self):
1153
"""Ignore empty entries"""
1154
self.assertEvaluateProxyBypass(None, 'example.com', '')
1155
self.assertEvaluateProxyBypass(None, 'example.com', ',')
1156
self.assertEvaluateProxyBypass(None, 'example.com', 'foo,,bar')
1159
1103
class TestProxyHttpServer(http_utils.TestCaseWithTwoWebservers):
1160
1104
"""Tests proxy server.
1189
1133
self.no_proxy_host = self.server_host_port
1190
1134
# The secondary server is the proxy
1191
1135
self.proxy_url = self.get_secondary_url()
1193
1138
def _testing_pycurl(self):
1194
1139
# TODO: This is duplicated for lots of the classes in this file
1195
1140
return (features.pycurl.available()
1196
1141
and self._transport == PyCurlTransport)
1198
def assertProxied(self):
1199
t = self.get_readonly_transport()
1200
self.assertEqual('proxied contents of foo\n', t.get('foo').read())
1202
def assertNotProxied(self):
1203
t = self.get_readonly_transport()
1204
self.assertEqual('contents of foo\n', t.get('foo').read())
1143
def _install_env(self, env):
1144
for name, value in env.iteritems():
1145
self._old_env[name] = osutils.set_or_unset_env(name, value)
1147
def _restore_env(self):
1148
for name, value in self._old_env.iteritems():
1149
osutils.set_or_unset_env(name, value)
1151
def proxied_in_env(self, env):
1152
self._install_env(env)
1153
t = self.get_readonly_transport()
1155
self.assertEqual('proxied contents of foo\n', t.get('foo').read())
1159
def not_proxied_in_env(self, env):
1160
self._install_env(env)
1161
t = self.get_readonly_transport()
1163
self.assertEqual('contents of foo\n', t.get('foo').read())
1206
1167
def test_http_proxy(self):
1207
self.overrideEnv('http_proxy', self.proxy_url)
1208
self.assertProxied()
1168
self.proxied_in_env({'http_proxy': self.proxy_url})
1210
1170
def test_HTTP_PROXY(self):
1211
1171
if self._testing_pycurl():
1214
1174
# about. Should we ?)
1215
1175
raise tests.TestNotApplicable(
1216
1176
'pycurl does not check HTTP_PROXY for security reasons')
1217
self.overrideEnv('HTTP_PROXY', self.proxy_url)
1218
self.assertProxied()
1177
self.proxied_in_env({'HTTP_PROXY': self.proxy_url})
1220
1179
def test_all_proxy(self):
1221
self.overrideEnv('all_proxy', self.proxy_url)
1222
self.assertProxied()
1180
self.proxied_in_env({'all_proxy': self.proxy_url})
1224
1182
def test_ALL_PROXY(self):
1225
self.overrideEnv('ALL_PROXY', self.proxy_url)
1226
self.assertProxied()
1183
self.proxied_in_env({'ALL_PROXY': self.proxy_url})
1228
1185
def test_http_proxy_with_no_proxy(self):
1229
self.overrideEnv('no_proxy', self.no_proxy_host)
1230
self.overrideEnv('http_proxy', self.proxy_url)
1231
self.assertNotProxied()
1186
self.not_proxied_in_env({'http_proxy': self.proxy_url,
1187
'no_proxy': self.no_proxy_host})
1233
1189
def test_HTTP_PROXY_with_NO_PROXY(self):
1234
1190
if self._testing_pycurl():
1235
1191
raise tests.TestNotApplicable(
1236
1192
'pycurl does not check HTTP_PROXY for security reasons')
1237
self.overrideEnv('NO_PROXY', self.no_proxy_host)
1238
self.overrideEnv('HTTP_PROXY', self.proxy_url)
1239
self.assertNotProxied()
1193
self.not_proxied_in_env({'HTTP_PROXY': self.proxy_url,
1194
'NO_PROXY': self.no_proxy_host})
1241
1196
def test_all_proxy_with_no_proxy(self):
1242
self.overrideEnv('no_proxy', self.no_proxy_host)
1243
self.overrideEnv('all_proxy', self.proxy_url)
1244
self.assertNotProxied()
1197
self.not_proxied_in_env({'all_proxy': self.proxy_url,
1198
'no_proxy': self.no_proxy_host})
1246
1200
def test_ALL_PROXY_with_NO_PROXY(self):
1247
self.overrideEnv('NO_PROXY', self.no_proxy_host)
1248
self.overrideEnv('ALL_PROXY', self.proxy_url)
1249
self.assertNotProxied()
1201
self.not_proxied_in_env({'ALL_PROXY': self.proxy_url,
1202
'NO_PROXY': self.no_proxy_host})
1251
1204
def test_http_proxy_without_scheme(self):
1252
self.overrideEnv('http_proxy', self.server_host_port)
1253
1205
if self._testing_pycurl():
1254
1206
# pycurl *ignores* invalid proxy env variables. If that ever change
1255
1207
# in the future, this test will fail indicating that pycurl do not
1256
1208
# ignore anymore such variables.
1257
self.assertNotProxied()
1209
self.not_proxied_in_env({'http_proxy': self.server_host_port})
1259
self.assertRaises(errors.InvalidURL, self.assertProxied)
1211
self.assertRaises(errors.InvalidURL,
1212
self.proxied_in_env,
1213
{'http_proxy': self.server_host_port})
1262
1216
class TestRanges(http_utils.TestCaseWithWebserver):
1263
1217
"""Test the Range header in GET methods."""
1265
1219
scenarios = multiply_scenarios(
1266
vary_by_http_client_implementation(),
1220
vary_by_http_client_implementation(),
1267
1221
vary_by_http_protocol_version(),
1760
1716
def get_user_transport(self, user, password):
1761
self.overrideEnv('all_proxy', self.get_user_url(user, password))
1717
self._install_env({'all_proxy': self.get_user_url(user, password)})
1762
1718
return TestAuth.get_user_transport(self, user, password)
1720
def _install_env(self, env):
1721
for name, value in env.iteritems():
1722
self._old_env[name] = osutils.set_or_unset_env(name, value)
1724
def _restore_env(self):
1725
for name, value in self._old_env.iteritems():
1726
osutils.set_or_unset_env(name, value)
1764
1728
def test_empty_pass(self):
1765
1729
if self._testing_pycurl():
1796
1760
class SmartHTTPTunnellingTest(tests.TestCaseWithTransport):
1798
1762
scenarios = multiply_scenarios(
1799
vary_by_http_client_implementation(),
1763
vary_by_http_client_implementation(),
1800
1764
vary_by_http_protocol_version(),
1803
1767
def setUp(self):
1804
1768
super(SmartHTTPTunnellingTest, self).setUp()
1805
1769
# We use the VFS layer as part of HTTP tunnelling tests.
1806
self.overrideEnv('BZR_NO_SMART_VFS', None)
1770
self._captureVar('BZR_NO_SMART_VFS', None)
1807
1771
self.transport_readonly_server = http_utils.HTTPServerWithSmarts
1808
1772
self.http_server = self.get_readonly_server()