blob: 5b5ae2ef49af1977d5389001f2a31b5e75e3ed61 [file] [log] [blame]
Senthil Kumaranaa5f49e2010-10-03 18:26:07 +00001import httplib
Antoine Pitrou72481782009-09-29 17:48:18 +00002import array
Jeremy Hylton79fa2b62001-04-13 14:57:44 +00003import httplib
4import StringIO
Facundo Batista07c78be2007-03-23 18:54:07 +00005import socket
Victor Stinner2c6aee92010-07-24 02:46:16 +00006import errno
Jeremy Hylton121d34a2003-07-08 12:36:58 +00007
Gregory P. Smith9d325212010-01-03 02:06:07 +00008import unittest
9TestCase = unittest.TestCase
Jeremy Hylton2c178252004-08-07 16:28:14 +000010
11from test import test_support
Jeremy Hylton79fa2b62001-04-13 14:57:44 +000012
Trent Nelsone41b0062008-04-08 23:47:30 +000013HOST = test_support.HOST
14
Jeremy Hylton79fa2b62001-04-13 14:57:44 +000015class FakeSocket:
Jeremy Hylton121d34a2003-07-08 12:36:58 +000016 def __init__(self, text, fileclass=StringIO.StringIO):
Jeremy Hylton79fa2b62001-04-13 14:57:44 +000017 self.text = text
Jeremy Hylton121d34a2003-07-08 12:36:58 +000018 self.fileclass = fileclass
Martin v. Löwis040a9272006-11-12 10:32:47 +000019 self.data = ''
Jeremy Hylton79fa2b62001-04-13 14:57:44 +000020
Jeremy Hylton2c178252004-08-07 16:28:14 +000021 def sendall(self, data):
Antoine Pitrou72481782009-09-29 17:48:18 +000022 self.data += ''.join(data)
Jeremy Hylton2c178252004-08-07 16:28:14 +000023
Jeremy Hylton79fa2b62001-04-13 14:57:44 +000024 def makefile(self, mode, bufsize=None):
25 if mode != 'r' and mode != 'rb':
Neal Norwitz28bb5722002-04-01 19:00:50 +000026 raise httplib.UnimplementedFileMode()
Jeremy Hylton121d34a2003-07-08 12:36:58 +000027 return self.fileclass(self.text)
28
Victor Stinner2c6aee92010-07-24 02:46:16 +000029class EPipeSocket(FakeSocket):
30
31 def __init__(self, text, pipe_trigger):
32 # When sendall() is called with pipe_trigger, raise EPIPE.
33 FakeSocket.__init__(self, text)
34 self.pipe_trigger = pipe_trigger
35
36 def sendall(self, data):
37 if self.pipe_trigger in data:
38 raise socket.error(errno.EPIPE, "gotcha")
39 self.data += data
40
41 def close(self):
42 pass
43
Jeremy Hylton121d34a2003-07-08 12:36:58 +000044class NoEOFStringIO(StringIO.StringIO):
45 """Like StringIO, but raises AssertionError on EOF.
46
47 This is used below to test that httplib doesn't try to read
48 more from the underlying file than it should.
49 """
50 def read(self, n=-1):
51 data = StringIO.StringIO.read(self, n)
52 if data == '':
53 raise AssertionError('caller tried to read past EOF')
54 return data
55
56 def readline(self, length=None):
57 data = StringIO.StringIO.readline(self, length)
58 if data == '':
59 raise AssertionError('caller tried to read past EOF')
60 return data
Jeremy Hylton79fa2b62001-04-13 14:57:44 +000061
Jeremy Hylton2c178252004-08-07 16:28:14 +000062
63class HeaderTests(TestCase):
64 def test_auto_headers(self):
65 # Some headers are added automatically, but should not be added by
66 # .request() if they are explicitly set.
67
Jeremy Hylton2c178252004-08-07 16:28:14 +000068 class HeaderCountingBuffer(list):
69 def __init__(self):
70 self.count = {}
71 def append(self, item):
72 kv = item.split(':')
73 if len(kv) > 1:
74 # item is a 'Key: Value' header string
75 lcKey = kv[0].lower()
76 self.count.setdefault(lcKey, 0)
77 self.count[lcKey] += 1
78 list.append(self, item)
79
80 for explicit_header in True, False:
81 for header in 'Content-length', 'Host', 'Accept-encoding':
82 conn = httplib.HTTPConnection('example.com')
83 conn.sock = FakeSocket('blahblahblah')
84 conn._buffer = HeaderCountingBuffer()
85
86 body = 'spamspamspam'
87 headers = {}
88 if explicit_header:
89 headers[header] = str(len(body))
90 conn.request('POST', '/', body, headers)
91 self.assertEqual(conn._buffer.count[header.lower()], 1)
92
Senthil Kumaran618802d2012-05-19 16:52:21 +080093 def test_content_length_0(self):
94
95 class ContentLengthChecker(list):
96 def __init__(self):
97 list.__init__(self)
98 self.content_length = None
99 def append(self, item):
100 kv = item.split(':', 1)
101 if len(kv) > 1 and kv[0].lower() == 'content-length':
102 self.content_length = kv[1].strip()
103 list.append(self, item)
104
105 # POST with empty body
106 conn = httplib.HTTPConnection('example.com')
107 conn.sock = FakeSocket(None)
108 conn._buffer = ContentLengthChecker()
109 conn.request('POST', '/', '')
110 self.assertEqual(conn._buffer.content_length, '0',
111 'Header Content-Length not set')
112
113 # PUT request with empty body
114 conn = httplib.HTTPConnection('example.com')
115 conn.sock = FakeSocket(None)
116 conn._buffer = ContentLengthChecker()
117 conn.request('PUT', '/', '')
118 self.assertEqual(conn._buffer.content_length, '0',
119 'Header Content-Length not set')
120
Senthil Kumaranaa5f49e2010-10-03 18:26:07 +0000121 def test_putheader(self):
122 conn = httplib.HTTPConnection('example.com')
123 conn.sock = FakeSocket(None)
124 conn.putrequest('GET','/')
125 conn.putheader('Content-length',42)
126 self.assertTrue('Content-length: 42' in conn._buffer)
127
Senthil Kumaran501bfd82010-11-14 03:31:52 +0000128 def test_ipv6host_header(self):
129 # Default host header on IPv6 transaction should wrapped by [] if
130 # its actual IPv6 address
131 expected = 'GET /foo HTTP/1.1\r\nHost: [2001::]:81\r\n' \
132 'Accept-Encoding: identity\r\n\r\n'
133 conn = httplib.HTTPConnection('[2001::]:81')
134 sock = FakeSocket('')
135 conn.sock = sock
136 conn.request('GET', '/foo')
137 self.assertTrue(sock.data.startswith(expected))
138
139 expected = 'GET /foo HTTP/1.1\r\nHost: [2001:102A::]\r\n' \
140 'Accept-Encoding: identity\r\n\r\n'
141 conn = httplib.HTTPConnection('[2001:102A::]')
142 sock = FakeSocket('')
143 conn.sock = sock
144 conn.request('GET', '/foo')
145 self.assertTrue(sock.data.startswith(expected))
146
147
Georg Brandl71a20892006-10-29 20:24:01 +0000148class BasicTest(TestCase):
149 def test_status_lines(self):
150 # Test HTTP status lines
Jeremy Hylton79fa2b62001-04-13 14:57:44 +0000151
Georg Brandl71a20892006-10-29 20:24:01 +0000152 body = "HTTP/1.1 200 Ok\r\n\r\nText"
153 sock = FakeSocket(body)
154 resp = httplib.HTTPResponse(sock)
Jeremy Hyltonba603192003-01-23 18:02:20 +0000155 resp.begin()
Georg Brandl71a20892006-10-29 20:24:01 +0000156 self.assertEqual(resp.read(), 'Text')
Facundo Batista70665902007-10-18 03:16:03 +0000157 self.assertTrue(resp.isclosed())
Jeremy Hyltonba603192003-01-23 18:02:20 +0000158
Georg Brandl71a20892006-10-29 20:24:01 +0000159 body = "HTTP/1.1 400.100 Not Ok\r\n\r\nText"
160 sock = FakeSocket(body)
161 resp = httplib.HTTPResponse(sock)
162 self.assertRaises(httplib.BadStatusLine, resp.begin)
Jeremy Hyltonba603192003-01-23 18:02:20 +0000163
Dirkjan Ochtmanebc73dc2010-02-24 04:49:00 +0000164 def test_bad_status_repr(self):
165 exc = httplib.BadStatusLine('')
Ezio Melotti2623a372010-11-21 13:34:58 +0000166 self.assertEqual(repr(exc), '''BadStatusLine("\'\'",)''')
Dirkjan Ochtmanebc73dc2010-02-24 04:49:00 +0000167
Facundo Batista70665902007-10-18 03:16:03 +0000168 def test_partial_reads(self):
169 # if we have a lenght, the system knows when to close itself
170 # same behaviour than when we read the whole thing with read()
171 body = "HTTP/1.1 200 Ok\r\nContent-Length: 4\r\n\r\nText"
172 sock = FakeSocket(body)
173 resp = httplib.HTTPResponse(sock)
174 resp.begin()
175 self.assertEqual(resp.read(2), 'Te')
176 self.assertFalse(resp.isclosed())
177 self.assertEqual(resp.read(2), 'xt')
178 self.assertTrue(resp.isclosed())
179
Georg Brandl71a20892006-10-29 20:24:01 +0000180 def test_host_port(self):
181 # Check invalid host_port
Jeremy Hyltonba603192003-01-23 18:02:20 +0000182
Łukasz Langa7a153902011-10-18 17:16:00 +0200183 # Note that httplib does not accept user:password@ in the host-port.
184 for hp in ("www.python.org:abc", "user:password@www.python.org"):
Georg Brandl71a20892006-10-29 20:24:01 +0000185 self.assertRaises(httplib.InvalidURL, httplib.HTTP, hp)
186
Jeremy Hylton21d2e592008-11-29 00:09:16 +0000187 for hp, h, p in (("[fe80::207:e9ff:fe9b]:8000", "fe80::207:e9ff:fe9b",
188 8000),
Georg Brandl71a20892006-10-29 20:24:01 +0000189 ("www.python.org:80", "www.python.org", 80),
190 ("www.python.org", "www.python.org", 80),
Łukasz Langa7a153902011-10-18 17:16:00 +0200191 ("www.python.org:", "www.python.org", 80),
Georg Brandl71a20892006-10-29 20:24:01 +0000192 ("[fe80::207:e9ff:fe9b]", "fe80::207:e9ff:fe9b", 80)):
Martin v. Löwis74a249e2004-09-14 21:45:36 +0000193 http = httplib.HTTP(hp)
Georg Brandl71a20892006-10-29 20:24:01 +0000194 c = http._conn
Jeremy Hylton21d2e592008-11-29 00:09:16 +0000195 if h != c.host:
196 self.fail("Host incorrectly parsed: %s != %s" % (h, c.host))
197 if p != c.port:
198 self.fail("Port incorrectly parsed: %s != %s" % (p, c.host))
Skip Montanaro10e6e0e2004-09-14 16:32:02 +0000199
Georg Brandl71a20892006-10-29 20:24:01 +0000200 def test_response_headers(self):
201 # test response with multiple message headers with the same field name.
202 text = ('HTTP/1.1 200 OK\r\n'
Jeremy Hylton21d2e592008-11-29 00:09:16 +0000203 'Set-Cookie: Customer="WILE_E_COYOTE";'
204 ' Version="1"; Path="/acme"\r\n'
Georg Brandl71a20892006-10-29 20:24:01 +0000205 'Set-Cookie: Part_Number="Rocket_Launcher_0001"; Version="1";'
206 ' Path="/acme"\r\n'
207 '\r\n'
208 'No body\r\n')
209 hdr = ('Customer="WILE_E_COYOTE"; Version="1"; Path="/acme"'
210 ', '
211 'Part_Number="Rocket_Launcher_0001"; Version="1"; Path="/acme"')
212 s = FakeSocket(text)
213 r = httplib.HTTPResponse(s)
214 r.begin()
215 cookies = r.getheader("Set-Cookie")
216 if cookies != hdr:
217 self.fail("multiple headers not combined properly")
Jeremy Hyltonba603192003-01-23 18:02:20 +0000218
Georg Brandl71a20892006-10-29 20:24:01 +0000219 def test_read_head(self):
220 # Test that the library doesn't attempt to read any data
221 # from a HEAD request. (Tickles SF bug #622042.)
222 sock = FakeSocket(
223 'HTTP/1.1 200 OK\r\n'
224 'Content-Length: 14432\r\n'
225 '\r\n',
226 NoEOFStringIO)
227 resp = httplib.HTTPResponse(sock, method="HEAD")
228 resp.begin()
229 if resp.read() != "":
230 self.fail("Did not expect response from HEAD request")
Jeremy Hyltonc1b2cb92003-05-05 16:13:58 +0000231
Martin v. Löwis040a9272006-11-12 10:32:47 +0000232 def test_send_file(self):
233 expected = 'GET /foo HTTP/1.1\r\nHost: example.com\r\n' \
234 'Accept-Encoding: identity\r\nContent-Length:'
235
236 body = open(__file__, 'rb')
237 conn = httplib.HTTPConnection('example.com')
238 sock = FakeSocket(body)
239 conn.sock = sock
240 conn.request('GET', '/foo', body)
241 self.assertTrue(sock.data.startswith(expected))
Jeremy Hylton2c178252004-08-07 16:28:14 +0000242
Antoine Pitrou72481782009-09-29 17:48:18 +0000243 def test_send(self):
244 expected = 'this is a test this is only a test'
245 conn = httplib.HTTPConnection('example.com')
246 sock = FakeSocket(None)
247 conn.sock = sock
248 conn.send(expected)
Ezio Melotti2623a372010-11-21 13:34:58 +0000249 self.assertEqual(expected, sock.data)
Antoine Pitrou72481782009-09-29 17:48:18 +0000250 sock.data = ''
251 conn.send(array.array('c', expected))
Ezio Melotti2623a372010-11-21 13:34:58 +0000252 self.assertEqual(expected, sock.data)
Antoine Pitrou72481782009-09-29 17:48:18 +0000253 sock.data = ''
254 conn.send(StringIO.StringIO(expected))
Ezio Melotti2623a372010-11-21 13:34:58 +0000255 self.assertEqual(expected, sock.data)
Antoine Pitrou72481782009-09-29 17:48:18 +0000256
Georg Brandl23635032008-02-24 00:03:22 +0000257 def test_chunked(self):
258 chunked_start = (
259 'HTTP/1.1 200 OK\r\n'
260 'Transfer-Encoding: chunked\r\n\r\n'
261 'a\r\n'
262 'hello worl\r\n'
263 '1\r\n'
264 'd\r\n'
265 )
266 sock = FakeSocket(chunked_start + '0\r\n')
267 resp = httplib.HTTPResponse(sock, method="GET")
268 resp.begin()
Ezio Melotti2623a372010-11-21 13:34:58 +0000269 self.assertEqual(resp.read(), 'hello world')
Georg Brandl23635032008-02-24 00:03:22 +0000270 resp.close()
271
272 for x in ('', 'foo\r\n'):
273 sock = FakeSocket(chunked_start + x)
274 resp = httplib.HTTPResponse(sock, method="GET")
275 resp.begin()
276 try:
277 resp.read()
278 except httplib.IncompleteRead, i:
Ezio Melotti2623a372010-11-21 13:34:58 +0000279 self.assertEqual(i.partial, 'hello world')
Benjamin Peterson7d49bba2009-03-02 22:41:42 +0000280 self.assertEqual(repr(i),'IncompleteRead(11 bytes read)')
281 self.assertEqual(str(i),'IncompleteRead(11 bytes read)')
Georg Brandl23635032008-02-24 00:03:22 +0000282 else:
283 self.fail('IncompleteRead expected')
284 finally:
285 resp.close()
286
Senthil Kumaraned9204342010-04-28 17:20:43 +0000287 def test_chunked_head(self):
288 chunked_start = (
289 'HTTP/1.1 200 OK\r\n'
290 'Transfer-Encoding: chunked\r\n\r\n'
291 'a\r\n'
292 'hello world\r\n'
293 '1\r\n'
294 'd\r\n'
295 )
296 sock = FakeSocket(chunked_start + '0\r\n')
297 resp = httplib.HTTPResponse(sock, method="HEAD")
298 resp.begin()
Ezio Melotti2623a372010-11-21 13:34:58 +0000299 self.assertEqual(resp.read(), '')
300 self.assertEqual(resp.status, 200)
301 self.assertEqual(resp.reason, 'OK')
Senthil Kumaranfb695012010-06-04 17:17:09 +0000302 self.assertTrue(resp.isclosed())
Senthil Kumaraned9204342010-04-28 17:20:43 +0000303
Georg Brandl8c460d52008-02-24 00:14:24 +0000304 def test_negative_content_length(self):
Jeremy Hylton21d2e592008-11-29 00:09:16 +0000305 sock = FakeSocket('HTTP/1.1 200 OK\r\n'
306 'Content-Length: -1\r\n\r\nHello\r\n')
Georg Brandl8c460d52008-02-24 00:14:24 +0000307 resp = httplib.HTTPResponse(sock, method="GET")
308 resp.begin()
Ezio Melotti2623a372010-11-21 13:34:58 +0000309 self.assertEqual(resp.read(), 'Hello\r\n')
Georg Brandl8c460d52008-02-24 00:14:24 +0000310 resp.close()
311
Benjamin Peterson7d49bba2009-03-02 22:41:42 +0000312 def test_incomplete_read(self):
313 sock = FakeSocket('HTTP/1.1 200 OK\r\nContent-Length: 10\r\n\r\nHello\r\n')
314 resp = httplib.HTTPResponse(sock, method="GET")
315 resp.begin()
316 try:
317 resp.read()
318 except httplib.IncompleteRead as i:
Ezio Melotti2623a372010-11-21 13:34:58 +0000319 self.assertEqual(i.partial, 'Hello\r\n')
Benjamin Peterson7d49bba2009-03-02 22:41:42 +0000320 self.assertEqual(repr(i),
321 "IncompleteRead(7 bytes read, 3 more expected)")
322 self.assertEqual(str(i),
323 "IncompleteRead(7 bytes read, 3 more expected)")
324 else:
325 self.fail('IncompleteRead expected')
326 finally:
327 resp.close()
328
Victor Stinner2c6aee92010-07-24 02:46:16 +0000329 def test_epipe(self):
330 sock = EPipeSocket(
331 "HTTP/1.0 401 Authorization Required\r\n"
332 "Content-type: text/html\r\n"
333 "WWW-Authenticate: Basic realm=\"example\"\r\n",
334 b"Content-Length")
335 conn = httplib.HTTPConnection("example.com")
336 conn.sock = sock
337 self.assertRaises(socket.error,
338 lambda: conn.request("PUT", "/url", "body"))
339 resp = conn.getresponse()
340 self.assertEqual(401, resp.status)
341 self.assertEqual("Basic realm=\"example\"",
342 resp.getheader("www-authenticate"))
343
Senthil Kumarand389cb52010-09-21 01:38:15 +0000344 def test_filenoattr(self):
345 # Just test the fileno attribute in the HTTPResponse Object.
346 body = "HTTP/1.1 200 Ok\r\n\r\nText"
347 sock = FakeSocket(body)
348 resp = httplib.HTTPResponse(sock)
349 self.assertTrue(hasattr(resp,'fileno'),
350 'HTTPResponse should expose a fileno attribute')
Georg Brandl23635032008-02-24 00:03:22 +0000351
Antoine Pitroud7b6ac62010-12-18 18:18:21 +0000352 # Test lines overflowing the max line size (_MAXLINE in http.client)
353
354 def test_overflowing_status_line(self):
355 self.skipTest("disabled for HTTP 0.9 support")
356 body = "HTTP/1.1 200 Ok" + "k" * 65536 + "\r\n"
357 resp = httplib.HTTPResponse(FakeSocket(body))
358 self.assertRaises((httplib.LineTooLong, httplib.BadStatusLine), resp.begin)
359
360 def test_overflowing_header_line(self):
361 body = (
362 'HTTP/1.1 200 OK\r\n'
363 'X-Foo: bar' + 'r' * 65536 + '\r\n\r\n'
364 )
365 resp = httplib.HTTPResponse(FakeSocket(body))
366 self.assertRaises(httplib.LineTooLong, resp.begin)
367
368 def test_overflowing_chunked_line(self):
369 body = (
370 'HTTP/1.1 200 OK\r\n'
371 'Transfer-Encoding: chunked\r\n\r\n'
372 + '0' * 65536 + 'a\r\n'
373 'hello world\r\n'
374 '0\r\n'
375 )
376 resp = httplib.HTTPResponse(FakeSocket(body))
377 resp.begin()
378 self.assertRaises(httplib.LineTooLong, resp.read)
379
Senthil Kumaranf5aaf6f2012-04-29 10:15:31 +0800380 def test_early_eof(self):
381 # Test httpresponse with no \r\n termination,
382 body = "HTTP/1.1 200 Ok"
383 sock = FakeSocket(body)
384 resp = httplib.HTTPResponse(sock)
385 resp.begin()
386 self.assertEqual(resp.read(), '')
387 self.assertTrue(resp.isclosed())
Antoine Pitroud7b6ac62010-12-18 18:18:21 +0000388
Georg Brandl4cbd1e32006-02-17 22:01:08 +0000389class OfflineTest(TestCase):
390 def test_responses(self):
Ezio Melotti2623a372010-11-21 13:34:58 +0000391 self.assertEqual(httplib.responses[httplib.NOT_FOUND], "Not Found")
Georg Brandl4cbd1e32006-02-17 22:01:08 +0000392
Gregory P. Smith9d325212010-01-03 02:06:07 +0000393
394class SourceAddressTest(TestCase):
395 def setUp(self):
396 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
397 self.port = test_support.bind_port(self.serv)
398 self.source_port = test_support.find_unused_port()
399 self.serv.listen(5)
400 self.conn = None
401
402 def tearDown(self):
403 if self.conn:
404 self.conn.close()
405 self.conn = None
406 self.serv.close()
407 self.serv = None
408
409 def testHTTPConnectionSourceAddress(self):
410 self.conn = httplib.HTTPConnection(HOST, self.port,
411 source_address=('', self.source_port))
412 self.conn.connect()
413 self.assertEqual(self.conn.sock.getsockname()[1], self.source_port)
414
415 @unittest.skipIf(not hasattr(httplib, 'HTTPSConnection'),
416 'httplib.HTTPSConnection not defined')
417 def testHTTPSConnectionSourceAddress(self):
418 self.conn = httplib.HTTPSConnection(HOST, self.port,
419 source_address=('', self.source_port))
420 # We don't test anything here other the constructor not barfing as
421 # this code doesn't deal with setting up an active running SSL server
422 # for an ssl_wrapped connect() to actually return from.
423
424
Facundo Batista07c78be2007-03-23 18:54:07 +0000425class TimeoutTest(TestCase):
Trent Nelsone41b0062008-04-08 23:47:30 +0000426 PORT = None
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000427
Facundo Batista07c78be2007-03-23 18:54:07 +0000428 def setUp(self):
429 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelson6c4a7c62008-04-09 00:34:53 +0000430 TimeoutTest.PORT = test_support.bind_port(self.serv)
Facundo Batistaf1966292007-03-25 03:20:05 +0000431 self.serv.listen(5)
Facundo Batista07c78be2007-03-23 18:54:07 +0000432
433 def tearDown(self):
434 self.serv.close()
435 self.serv = None
436
437 def testTimeoutAttribute(self):
438 '''This will prove that the timeout gets through
439 HTTPConnection and into the socket.
440 '''
Facundo Batista4f1b1ed2008-05-29 16:39:26 +0000441 # default -- use global socket timeout
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000442 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +0000443 socket.setdefaulttimeout(30)
444 try:
445 httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT)
446 httpConn.connect()
447 finally:
448 socket.setdefaulttimeout(None)
Facundo Batista14553b02007-03-23 20:23:08 +0000449 self.assertEqual(httpConn.sock.gettimeout(), 30)
Facundo Batistaf1966292007-03-25 03:20:05 +0000450 httpConn.close()
Facundo Batista07c78be2007-03-23 18:54:07 +0000451
Facundo Batista4f1b1ed2008-05-29 16:39:26 +0000452 # no timeout -- do not use global socket default
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000453 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista14553b02007-03-23 20:23:08 +0000454 socket.setdefaulttimeout(30)
455 try:
Trent Nelson6c4a7c62008-04-09 00:34:53 +0000456 httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT,
457 timeout=None)
Facundo Batista14553b02007-03-23 20:23:08 +0000458 httpConn.connect()
459 finally:
Facundo Batista4f1b1ed2008-05-29 16:39:26 +0000460 socket.setdefaulttimeout(None)
461 self.assertEqual(httpConn.sock.gettimeout(), None)
462 httpConn.close()
463
464 # a value
465 httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT, timeout=30)
466 httpConn.connect()
Facundo Batista14553b02007-03-23 20:23:08 +0000467 self.assertEqual(httpConn.sock.gettimeout(), 30)
Facundo Batistaf1966292007-03-25 03:20:05 +0000468 httpConn.close()
Facundo Batista07c78be2007-03-23 18:54:07 +0000469
470
Facundo Batista70f996b2007-05-21 17:32:32 +0000471class HTTPSTimeoutTest(TestCase):
472# XXX Here should be tests for HTTPS, there isn't any right now!
473
474 def test_attributes(self):
475 # simple test to check it's storing it
Thomas Wouters628e3bb2007-08-30 22:35:31 +0000476 if hasattr(httplib, 'HTTPSConnection'):
Trent Nelsone41b0062008-04-08 23:47:30 +0000477 h = httplib.HTTPSConnection(HOST, TimeoutTest.PORT, timeout=30)
Thomas Wouters628e3bb2007-08-30 22:35:31 +0000478 self.assertEqual(h.timeout, 30)
Facundo Batista70f996b2007-05-21 17:32:32 +0000479
Petri Lehtinen6d089df2011-10-26 21:25:56 +0300480 @unittest.skipIf(not hasattr(httplib, 'HTTPS'), 'httplib.HTTPS not available')
Łukasz Langa7a153902011-10-18 17:16:00 +0200481 def test_host_port(self):
482 # Check invalid host_port
483
484 # Note that httplib does not accept user:password@ in the host-port.
485 for hp in ("www.python.org:abc", "user:password@www.python.org"):
486 self.assertRaises(httplib.InvalidURL, httplib.HTTP, hp)
487
488 for hp, h, p in (("[fe80::207:e9ff:fe9b]:8000", "fe80::207:e9ff:fe9b",
489 8000),
490 ("pypi.python.org:443", "pypi.python.org", 443),
491 ("pypi.python.org", "pypi.python.org", 443),
492 ("pypi.python.org:", "pypi.python.org", 443),
493 ("[fe80::207:e9ff:fe9b]", "fe80::207:e9ff:fe9b", 443)):
494 http = httplib.HTTPS(hp)
495 c = http._conn
496 if h != c.host:
497 self.fail("Host incorrectly parsed: %s != %s" % (h, c.host))
498 if p != c.port:
499 self.fail("Port incorrectly parsed: %s != %s" % (p, c.host))
500
501
Jeremy Hylton2c178252004-08-07 16:28:14 +0000502def test_main(verbose=None):
Trent Nelsone41b0062008-04-08 23:47:30 +0000503 test_support.run_unittest(HeaderTests, OfflineTest, BasicTest, TimeoutTest,
Gregory P. Smith9d325212010-01-03 02:06:07 +0000504 HTTPSTimeoutTest, SourceAddressTest)
Jeremy Hylton2c178252004-08-07 16:28:14 +0000505
Georg Brandl71a20892006-10-29 20:24:01 +0000506if __name__ == '__main__':
507 test_main()