blob: 05df87513a2ef74bc19c17fccae9aae96861b72e [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 Kumaranaa5f49e2010-10-03 18:26:07 +000093 def test_putheader(self):
94 conn = httplib.HTTPConnection('example.com')
95 conn.sock = FakeSocket(None)
96 conn.putrequest('GET','/')
97 conn.putheader('Content-length',42)
98 self.assertTrue('Content-length: 42' in conn._buffer)
99
Senthil Kumaran501bfd82010-11-14 03:31:52 +0000100 def test_ipv6host_header(self):
101 # Default host header on IPv6 transaction should wrapped by [] if
102 # its actual IPv6 address
103 expected = 'GET /foo HTTP/1.1\r\nHost: [2001::]:81\r\n' \
104 'Accept-Encoding: identity\r\n\r\n'
105 conn = httplib.HTTPConnection('[2001::]:81')
106 sock = FakeSocket('')
107 conn.sock = sock
108 conn.request('GET', '/foo')
109 self.assertTrue(sock.data.startswith(expected))
110
111 expected = 'GET /foo HTTP/1.1\r\nHost: [2001:102A::]\r\n' \
112 'Accept-Encoding: identity\r\n\r\n'
113 conn = httplib.HTTPConnection('[2001:102A::]')
114 sock = FakeSocket('')
115 conn.sock = sock
116 conn.request('GET', '/foo')
117 self.assertTrue(sock.data.startswith(expected))
118
119
Georg Brandl71a20892006-10-29 20:24:01 +0000120class BasicTest(TestCase):
121 def test_status_lines(self):
122 # Test HTTP status lines
Jeremy Hylton79fa2b62001-04-13 14:57:44 +0000123
Georg Brandl71a20892006-10-29 20:24:01 +0000124 body = "HTTP/1.1 200 Ok\r\n\r\nText"
125 sock = FakeSocket(body)
126 resp = httplib.HTTPResponse(sock)
Jeremy Hyltonba603192003-01-23 18:02:20 +0000127 resp.begin()
Georg Brandl71a20892006-10-29 20:24:01 +0000128 self.assertEqual(resp.read(), 'Text')
Facundo Batista70665902007-10-18 03:16:03 +0000129 self.assertTrue(resp.isclosed())
Jeremy Hyltonba603192003-01-23 18:02:20 +0000130
Georg Brandl71a20892006-10-29 20:24:01 +0000131 body = "HTTP/1.1 400.100 Not Ok\r\n\r\nText"
132 sock = FakeSocket(body)
133 resp = httplib.HTTPResponse(sock)
134 self.assertRaises(httplib.BadStatusLine, resp.begin)
Jeremy Hyltonba603192003-01-23 18:02:20 +0000135
Dirkjan Ochtmanebc73dc2010-02-24 04:49:00 +0000136 def test_bad_status_repr(self):
137 exc = httplib.BadStatusLine('')
Ezio Melotti2623a372010-11-21 13:34:58 +0000138 self.assertEqual(repr(exc), '''BadStatusLine("\'\'",)''')
Dirkjan Ochtmanebc73dc2010-02-24 04:49:00 +0000139
Facundo Batista70665902007-10-18 03:16:03 +0000140 def test_partial_reads(self):
141 # if we have a lenght, the system knows when to close itself
142 # same behaviour than when we read the whole thing with read()
143 body = "HTTP/1.1 200 Ok\r\nContent-Length: 4\r\n\r\nText"
144 sock = FakeSocket(body)
145 resp = httplib.HTTPResponse(sock)
146 resp.begin()
147 self.assertEqual(resp.read(2), 'Te')
148 self.assertFalse(resp.isclosed())
149 self.assertEqual(resp.read(2), 'xt')
150 self.assertTrue(resp.isclosed())
151
Georg Brandl71a20892006-10-29 20:24:01 +0000152 def test_host_port(self):
153 # Check invalid host_port
Jeremy Hyltonba603192003-01-23 18:02:20 +0000154
Łukasz Langa7a153902011-10-18 17:16:00 +0200155 # Note that httplib does not accept user:password@ in the host-port.
156 for hp in ("www.python.org:abc", "user:password@www.python.org"):
Georg Brandl71a20892006-10-29 20:24:01 +0000157 self.assertRaises(httplib.InvalidURL, httplib.HTTP, hp)
158
Jeremy Hylton21d2e592008-11-29 00:09:16 +0000159 for hp, h, p in (("[fe80::207:e9ff:fe9b]:8000", "fe80::207:e9ff:fe9b",
160 8000),
Georg Brandl71a20892006-10-29 20:24:01 +0000161 ("www.python.org:80", "www.python.org", 80),
162 ("www.python.org", "www.python.org", 80),
Łukasz Langa7a153902011-10-18 17:16:00 +0200163 ("www.python.org:", "www.python.org", 80),
Georg Brandl71a20892006-10-29 20:24:01 +0000164 ("[fe80::207:e9ff:fe9b]", "fe80::207:e9ff:fe9b", 80)):
Martin v. Löwis74a249e2004-09-14 21:45:36 +0000165 http = httplib.HTTP(hp)
Georg Brandl71a20892006-10-29 20:24:01 +0000166 c = http._conn
Jeremy Hylton21d2e592008-11-29 00:09:16 +0000167 if h != c.host:
168 self.fail("Host incorrectly parsed: %s != %s" % (h, c.host))
169 if p != c.port:
170 self.fail("Port incorrectly parsed: %s != %s" % (p, c.host))
Skip Montanaro10e6e0e2004-09-14 16:32:02 +0000171
Georg Brandl71a20892006-10-29 20:24:01 +0000172 def test_response_headers(self):
173 # test response with multiple message headers with the same field name.
174 text = ('HTTP/1.1 200 OK\r\n'
Jeremy Hylton21d2e592008-11-29 00:09:16 +0000175 'Set-Cookie: Customer="WILE_E_COYOTE";'
176 ' Version="1"; Path="/acme"\r\n'
Georg Brandl71a20892006-10-29 20:24:01 +0000177 'Set-Cookie: Part_Number="Rocket_Launcher_0001"; Version="1";'
178 ' Path="/acme"\r\n'
179 '\r\n'
180 'No body\r\n')
181 hdr = ('Customer="WILE_E_COYOTE"; Version="1"; Path="/acme"'
182 ', '
183 'Part_Number="Rocket_Launcher_0001"; Version="1"; Path="/acme"')
184 s = FakeSocket(text)
185 r = httplib.HTTPResponse(s)
186 r.begin()
187 cookies = r.getheader("Set-Cookie")
188 if cookies != hdr:
189 self.fail("multiple headers not combined properly")
Jeremy Hyltonba603192003-01-23 18:02:20 +0000190
Georg Brandl71a20892006-10-29 20:24:01 +0000191 def test_read_head(self):
192 # Test that the library doesn't attempt to read any data
193 # from a HEAD request. (Tickles SF bug #622042.)
194 sock = FakeSocket(
195 'HTTP/1.1 200 OK\r\n'
196 'Content-Length: 14432\r\n'
197 '\r\n',
198 NoEOFStringIO)
199 resp = httplib.HTTPResponse(sock, method="HEAD")
200 resp.begin()
201 if resp.read() != "":
202 self.fail("Did not expect response from HEAD request")
Jeremy Hyltonc1b2cb92003-05-05 16:13:58 +0000203
Martin v. Löwis040a9272006-11-12 10:32:47 +0000204 def test_send_file(self):
205 expected = 'GET /foo HTTP/1.1\r\nHost: example.com\r\n' \
206 'Accept-Encoding: identity\r\nContent-Length:'
207
208 body = open(__file__, 'rb')
209 conn = httplib.HTTPConnection('example.com')
210 sock = FakeSocket(body)
211 conn.sock = sock
212 conn.request('GET', '/foo', body)
213 self.assertTrue(sock.data.startswith(expected))
Jeremy Hylton2c178252004-08-07 16:28:14 +0000214
Antoine Pitrou72481782009-09-29 17:48:18 +0000215 def test_send(self):
216 expected = 'this is a test this is only a test'
217 conn = httplib.HTTPConnection('example.com')
218 sock = FakeSocket(None)
219 conn.sock = sock
220 conn.send(expected)
Ezio Melotti2623a372010-11-21 13:34:58 +0000221 self.assertEqual(expected, sock.data)
Antoine Pitrou72481782009-09-29 17:48:18 +0000222 sock.data = ''
223 conn.send(array.array('c', expected))
Ezio Melotti2623a372010-11-21 13:34:58 +0000224 self.assertEqual(expected, sock.data)
Antoine Pitrou72481782009-09-29 17:48:18 +0000225 sock.data = ''
226 conn.send(StringIO.StringIO(expected))
Ezio Melotti2623a372010-11-21 13:34:58 +0000227 self.assertEqual(expected, sock.data)
Antoine Pitrou72481782009-09-29 17:48:18 +0000228
Georg Brandl23635032008-02-24 00:03:22 +0000229 def test_chunked(self):
230 chunked_start = (
231 'HTTP/1.1 200 OK\r\n'
232 'Transfer-Encoding: chunked\r\n\r\n'
233 'a\r\n'
234 'hello worl\r\n'
235 '1\r\n'
236 'd\r\n'
237 )
238 sock = FakeSocket(chunked_start + '0\r\n')
239 resp = httplib.HTTPResponse(sock, method="GET")
240 resp.begin()
Ezio Melotti2623a372010-11-21 13:34:58 +0000241 self.assertEqual(resp.read(), 'hello world')
Georg Brandl23635032008-02-24 00:03:22 +0000242 resp.close()
243
244 for x in ('', 'foo\r\n'):
245 sock = FakeSocket(chunked_start + x)
246 resp = httplib.HTTPResponse(sock, method="GET")
247 resp.begin()
248 try:
249 resp.read()
250 except httplib.IncompleteRead, i:
Ezio Melotti2623a372010-11-21 13:34:58 +0000251 self.assertEqual(i.partial, 'hello world')
Benjamin Peterson7d49bba2009-03-02 22:41:42 +0000252 self.assertEqual(repr(i),'IncompleteRead(11 bytes read)')
253 self.assertEqual(str(i),'IncompleteRead(11 bytes read)')
Georg Brandl23635032008-02-24 00:03:22 +0000254 else:
255 self.fail('IncompleteRead expected')
256 finally:
257 resp.close()
258
Senthil Kumaraned9204342010-04-28 17:20:43 +0000259 def test_chunked_head(self):
260 chunked_start = (
261 'HTTP/1.1 200 OK\r\n'
262 'Transfer-Encoding: chunked\r\n\r\n'
263 'a\r\n'
264 'hello world\r\n'
265 '1\r\n'
266 'd\r\n'
267 )
268 sock = FakeSocket(chunked_start + '0\r\n')
269 resp = httplib.HTTPResponse(sock, method="HEAD")
270 resp.begin()
Ezio Melotti2623a372010-11-21 13:34:58 +0000271 self.assertEqual(resp.read(), '')
272 self.assertEqual(resp.status, 200)
273 self.assertEqual(resp.reason, 'OK')
Senthil Kumaranfb695012010-06-04 17:17:09 +0000274 self.assertTrue(resp.isclosed())
Senthil Kumaraned9204342010-04-28 17:20:43 +0000275
Georg Brandl8c460d52008-02-24 00:14:24 +0000276 def test_negative_content_length(self):
Jeremy Hylton21d2e592008-11-29 00:09:16 +0000277 sock = FakeSocket('HTTP/1.1 200 OK\r\n'
278 'Content-Length: -1\r\n\r\nHello\r\n')
Georg Brandl8c460d52008-02-24 00:14:24 +0000279 resp = httplib.HTTPResponse(sock, method="GET")
280 resp.begin()
Ezio Melotti2623a372010-11-21 13:34:58 +0000281 self.assertEqual(resp.read(), 'Hello\r\n')
Georg Brandl8c460d52008-02-24 00:14:24 +0000282 resp.close()
283
Benjamin Peterson7d49bba2009-03-02 22:41:42 +0000284 def test_incomplete_read(self):
285 sock = FakeSocket('HTTP/1.1 200 OK\r\nContent-Length: 10\r\n\r\nHello\r\n')
286 resp = httplib.HTTPResponse(sock, method="GET")
287 resp.begin()
288 try:
289 resp.read()
290 except httplib.IncompleteRead as i:
Ezio Melotti2623a372010-11-21 13:34:58 +0000291 self.assertEqual(i.partial, 'Hello\r\n')
Benjamin Peterson7d49bba2009-03-02 22:41:42 +0000292 self.assertEqual(repr(i),
293 "IncompleteRead(7 bytes read, 3 more expected)")
294 self.assertEqual(str(i),
295 "IncompleteRead(7 bytes read, 3 more expected)")
296 else:
297 self.fail('IncompleteRead expected')
298 finally:
299 resp.close()
300
Victor Stinner2c6aee92010-07-24 02:46:16 +0000301 def test_epipe(self):
302 sock = EPipeSocket(
303 "HTTP/1.0 401 Authorization Required\r\n"
304 "Content-type: text/html\r\n"
305 "WWW-Authenticate: Basic realm=\"example\"\r\n",
306 b"Content-Length")
307 conn = httplib.HTTPConnection("example.com")
308 conn.sock = sock
309 self.assertRaises(socket.error,
310 lambda: conn.request("PUT", "/url", "body"))
311 resp = conn.getresponse()
312 self.assertEqual(401, resp.status)
313 self.assertEqual("Basic realm=\"example\"",
314 resp.getheader("www-authenticate"))
315
Senthil Kumarand389cb52010-09-21 01:38:15 +0000316 def test_filenoattr(self):
317 # Just test the fileno attribute in the HTTPResponse Object.
318 body = "HTTP/1.1 200 Ok\r\n\r\nText"
319 sock = FakeSocket(body)
320 resp = httplib.HTTPResponse(sock)
321 self.assertTrue(hasattr(resp,'fileno'),
322 'HTTPResponse should expose a fileno attribute')
Georg Brandl23635032008-02-24 00:03:22 +0000323
Antoine Pitroud7b6ac62010-12-18 18:18:21 +0000324 # Test lines overflowing the max line size (_MAXLINE in http.client)
325
326 def test_overflowing_status_line(self):
327 self.skipTest("disabled for HTTP 0.9 support")
328 body = "HTTP/1.1 200 Ok" + "k" * 65536 + "\r\n"
329 resp = httplib.HTTPResponse(FakeSocket(body))
330 self.assertRaises((httplib.LineTooLong, httplib.BadStatusLine), resp.begin)
331
332 def test_overflowing_header_line(self):
333 body = (
334 'HTTP/1.1 200 OK\r\n'
335 'X-Foo: bar' + 'r' * 65536 + '\r\n\r\n'
336 )
337 resp = httplib.HTTPResponse(FakeSocket(body))
338 self.assertRaises(httplib.LineTooLong, resp.begin)
339
340 def test_overflowing_chunked_line(self):
341 body = (
342 'HTTP/1.1 200 OK\r\n'
343 'Transfer-Encoding: chunked\r\n\r\n'
344 + '0' * 65536 + 'a\r\n'
345 'hello world\r\n'
346 '0\r\n'
347 )
348 resp = httplib.HTTPResponse(FakeSocket(body))
349 resp.begin()
350 self.assertRaises(httplib.LineTooLong, resp.read)
351
Senthil Kumaranf5aaf6f2012-04-29 10:15:31 +0800352 def test_early_eof(self):
353 # Test httpresponse with no \r\n termination,
354 body = "HTTP/1.1 200 Ok"
355 sock = FakeSocket(body)
356 resp = httplib.HTTPResponse(sock)
357 resp.begin()
358 self.assertEqual(resp.read(), '')
359 self.assertTrue(resp.isclosed())
Antoine Pitroud7b6ac62010-12-18 18:18:21 +0000360
Georg Brandl4cbd1e32006-02-17 22:01:08 +0000361class OfflineTest(TestCase):
362 def test_responses(self):
Ezio Melotti2623a372010-11-21 13:34:58 +0000363 self.assertEqual(httplib.responses[httplib.NOT_FOUND], "Not Found")
Georg Brandl4cbd1e32006-02-17 22:01:08 +0000364
Gregory P. Smith9d325212010-01-03 02:06:07 +0000365
366class SourceAddressTest(TestCase):
367 def setUp(self):
368 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
369 self.port = test_support.bind_port(self.serv)
370 self.source_port = test_support.find_unused_port()
371 self.serv.listen(5)
372 self.conn = None
373
374 def tearDown(self):
375 if self.conn:
376 self.conn.close()
377 self.conn = None
378 self.serv.close()
379 self.serv = None
380
381 def testHTTPConnectionSourceAddress(self):
382 self.conn = httplib.HTTPConnection(HOST, self.port,
383 source_address=('', self.source_port))
384 self.conn.connect()
385 self.assertEqual(self.conn.sock.getsockname()[1], self.source_port)
386
387 @unittest.skipIf(not hasattr(httplib, 'HTTPSConnection'),
388 'httplib.HTTPSConnection not defined')
389 def testHTTPSConnectionSourceAddress(self):
390 self.conn = httplib.HTTPSConnection(HOST, self.port,
391 source_address=('', self.source_port))
392 # We don't test anything here other the constructor not barfing as
393 # this code doesn't deal with setting up an active running SSL server
394 # for an ssl_wrapped connect() to actually return from.
395
396
Facundo Batista07c78be2007-03-23 18:54:07 +0000397class TimeoutTest(TestCase):
Trent Nelsone41b0062008-04-08 23:47:30 +0000398 PORT = None
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000399
Facundo Batista07c78be2007-03-23 18:54:07 +0000400 def setUp(self):
401 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelson6c4a7c62008-04-09 00:34:53 +0000402 TimeoutTest.PORT = test_support.bind_port(self.serv)
Facundo Batistaf1966292007-03-25 03:20:05 +0000403 self.serv.listen(5)
Facundo Batista07c78be2007-03-23 18:54:07 +0000404
405 def tearDown(self):
406 self.serv.close()
407 self.serv = None
408
409 def testTimeoutAttribute(self):
410 '''This will prove that the timeout gets through
411 HTTPConnection and into the socket.
412 '''
Facundo Batista4f1b1ed2008-05-29 16:39:26 +0000413 # default -- use global socket timeout
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000414 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +0000415 socket.setdefaulttimeout(30)
416 try:
417 httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT)
418 httpConn.connect()
419 finally:
420 socket.setdefaulttimeout(None)
Facundo Batista14553b02007-03-23 20:23:08 +0000421 self.assertEqual(httpConn.sock.gettimeout(), 30)
Facundo Batistaf1966292007-03-25 03:20:05 +0000422 httpConn.close()
Facundo Batista07c78be2007-03-23 18:54:07 +0000423
Facundo Batista4f1b1ed2008-05-29 16:39:26 +0000424 # no timeout -- do not use global socket default
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000425 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista14553b02007-03-23 20:23:08 +0000426 socket.setdefaulttimeout(30)
427 try:
Trent Nelson6c4a7c62008-04-09 00:34:53 +0000428 httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT,
429 timeout=None)
Facundo Batista14553b02007-03-23 20:23:08 +0000430 httpConn.connect()
431 finally:
Facundo Batista4f1b1ed2008-05-29 16:39:26 +0000432 socket.setdefaulttimeout(None)
433 self.assertEqual(httpConn.sock.gettimeout(), None)
434 httpConn.close()
435
436 # a value
437 httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT, timeout=30)
438 httpConn.connect()
Facundo Batista14553b02007-03-23 20:23:08 +0000439 self.assertEqual(httpConn.sock.gettimeout(), 30)
Facundo Batistaf1966292007-03-25 03:20:05 +0000440 httpConn.close()
Facundo Batista07c78be2007-03-23 18:54:07 +0000441
442
Facundo Batista70f996b2007-05-21 17:32:32 +0000443class HTTPSTimeoutTest(TestCase):
444# XXX Here should be tests for HTTPS, there isn't any right now!
445
446 def test_attributes(self):
447 # simple test to check it's storing it
Thomas Wouters628e3bb2007-08-30 22:35:31 +0000448 if hasattr(httplib, 'HTTPSConnection'):
Trent Nelsone41b0062008-04-08 23:47:30 +0000449 h = httplib.HTTPSConnection(HOST, TimeoutTest.PORT, timeout=30)
Thomas Wouters628e3bb2007-08-30 22:35:31 +0000450 self.assertEqual(h.timeout, 30)
Facundo Batista70f996b2007-05-21 17:32:32 +0000451
Petri Lehtinen6d089df2011-10-26 21:25:56 +0300452 @unittest.skipIf(not hasattr(httplib, 'HTTPS'), 'httplib.HTTPS not available')
Łukasz Langa7a153902011-10-18 17:16:00 +0200453 def test_host_port(self):
454 # Check invalid host_port
455
456 # Note that httplib does not accept user:password@ in the host-port.
457 for hp in ("www.python.org:abc", "user:password@www.python.org"):
458 self.assertRaises(httplib.InvalidURL, httplib.HTTP, hp)
459
460 for hp, h, p in (("[fe80::207:e9ff:fe9b]:8000", "fe80::207:e9ff:fe9b",
461 8000),
462 ("pypi.python.org:443", "pypi.python.org", 443),
463 ("pypi.python.org", "pypi.python.org", 443),
464 ("pypi.python.org:", "pypi.python.org", 443),
465 ("[fe80::207:e9ff:fe9b]", "fe80::207:e9ff:fe9b", 443)):
466 http = httplib.HTTPS(hp)
467 c = http._conn
468 if h != c.host:
469 self.fail("Host incorrectly parsed: %s != %s" % (h, c.host))
470 if p != c.port:
471 self.fail("Port incorrectly parsed: %s != %s" % (p, c.host))
472
473
Jeremy Hylton2c178252004-08-07 16:28:14 +0000474def test_main(verbose=None):
Trent Nelsone41b0062008-04-08 23:47:30 +0000475 test_support.run_unittest(HeaderTests, OfflineTest, BasicTest, TimeoutTest,
Gregory P. Smith9d325212010-01-03 02:06:07 +0000476 HTTPSTimeoutTest, SourceAddressTest)
Jeremy Hylton2c178252004-08-07 16:28:14 +0000477
Georg Brandl71a20892006-10-29 20:24:01 +0000478if __name__ == '__main__':
479 test_main()