from unittest
import TestCase
from test
import test_support
def __init__(self
, text
, fileclass
=StringIO
.StringIO
):
self
.fileclass
= fileclass
def makefile(self
, mode
, bufsize
=None):
if mode
!= 'r' and mode
!= 'rb':
raise httplib
.UnimplementedFileMode()
return self
.fileclass(self
.text
)
class NoEOFStringIO(StringIO
.StringIO
):
"""Like StringIO, but raises AssertionError on EOF.
This is used below to test that httplib doesn't try to read
more from the underlying file than it should.
data
= StringIO
.StringIO
.read(self
, n
)
raise AssertionError('caller tried to read past EOF')
def readline(self
, length
=None):
data
= StringIO
.StringIO
.readline(self
, length
)
raise AssertionError('caller tried to read past EOF')
class HeaderTests(TestCase
):
def test_auto_headers(self
):
# Some headers are added automatically, but should not be added by
# .request() if they are explicitly set.
class HeaderCountingBuffer(list):
# item is a 'Key: Value' header string
self
.count
.setdefault(lcKey
, 0)
for explicit_header
in True, False:
for header
in 'Content-length', 'Host', 'Accept-encoding':
conn
= httplib
.HTTPConnection('example.com')
conn
.sock
= FakeSocket('blahblahblah')
conn
._buffer
= HeaderCountingBuffer()
headers
[header
] = str(len(body
))
conn
.request('POST', '/', body
, headers
)
self
.assertEqual(conn
._buffer
.count
[header
.lower()], 1)
# Collect output to a buffer so that we don't have to cope with line-ending
# issues across platforms. Specifically, the headers will have \r\n pairs
# and some platforms will strip them from the output file.
buf
= StringIO
.StringIO()
# print individual lines with endings stripped
for line
in s
.split("\n"):
body
= "HTTP/1.1 200 Ok\r\n\r\nText"
resp
= httplib
.HTTPResponse(sock
, 1)
body
= "HTTP/1.1 400.100 Not Ok\r\n\r\nText"
resp
= httplib
.HTTPResponse(sock
, 1)
except httplib
.BadStatusLine
:
print "BadStatusLine raised as expected"
print "Expect BadStatusLine"
# Check invalid host_port
for hp
in ("www.python.org:abc", "www.python.org:"):
except httplib
.InvalidURL
:
print "InvalidURL raised as expected"
print "Expect InvalidURL"
for hp
,h
,p
in (("[fe80::207:e9ff:fe9b]:8000", "fe80::207:e9ff:fe9b", 8000),
("www.python.org:80", "www.python.org", 80),
("www.python.org", "www.python.org", 80),
("[fe80::207:e9ff:fe9b]", "fe80::207:e9ff:fe9b", 80)):
except httplib
.InvalidURL
:
print "InvalidURL raised erroneously"
if h
!= c
.host
: raise AssertionError, ("Host incorrectly parsed", h
, c
.host
)
if p
!= c
.port
: raise AssertionError, ("Port incorrectly parsed", p
, c
.host
)
# test response with multiple message headers with the same field name.
text
= ('HTTP/1.1 200 OK\r\n'
'Set-Cookie: Customer="WILE_E_COYOTE"; Version="1"; Path="/acme"\r\n'
'Set-Cookie: Part_Number="Rocket_Launcher_0001"; Version="1";'
hdr
= ('Customer="WILE_E_COYOTE"; Version="1"; Path="/acme"'
'Part_Number="Rocket_Launcher_0001"; Version="1"; Path="/acme"')
r
= httplib
.HTTPResponse(s
, 1)
cookies
= r
.getheader("Set-Cookie")
raise AssertionError, "multiple headers not combined properly"
# Test that the library doesn't attempt to read any data
# from a HEAD request. (Tickles SF bug #622042.)
'Content-Length: 14432\r\n'
resp
= httplib
.HTTPResponse(sock
, 1, method
="HEAD")
raise AssertionError, "Did not expect response from HEAD request"
def test_main(verbose
=None):
test_support
.run_unittest(*tests
)