24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
25 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
25 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
26 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
26 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
28 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
28 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
29 import socket |
29 import unittest |
30 import unittest |
30 |
31 |
31 import http |
32 import http |
32 |
33 |
33 # relative import to ease embedding the library |
34 # relative import to ease embedding the library |
37 class SimpleHttpTest(util.HttpTestBase, unittest.TestCase): |
38 class SimpleHttpTest(util.HttpTestBase, unittest.TestCase): |
38 |
39 |
39 def _run_simple_test(self, host, server_data, expected_req, expected_data): |
40 def _run_simple_test(self, host, server_data, expected_req, expected_data): |
40 con = http.HTTPConnection(host) |
41 con = http.HTTPConnection(host) |
41 con._connect() |
42 con._connect() |
42 con.sock.data.extend(server_data) |
43 con.sock.data = server_data |
43 con.request('GET', '/') |
44 con.request('GET', '/') |
44 |
45 |
45 self.assertStringEqual(expected_req, con.sock.sent) |
46 self.assertStringEqual(expected_req, con.sock.sent) |
46 self.assertEqual(expected_data, con.getresponse().read()) |
47 self.assertEqual(expected_data, con.getresponse().read()) |
47 |
48 |
351 'Host: 1.2.3.4\r\n' |
352 'Host: 1.2.3.4\r\n' |
352 'accept-encoding: identity\r\n\r\n') |
353 'accept-encoding: identity\r\n\r\n') |
353 |
354 |
354 self.assertEqual(('1.2.3.4', 80), con.sock.sa) |
355 self.assertEqual(('1.2.3.4', 80), con.sock.sa) |
355 self.assertEqual(expected_req, con.sock.sent) |
356 self.assertEqual(expected_req, con.sock.sent) |
|
357 |
|
358 def test_conn_keep_alive_but_server_close_anyway(self): |
|
359 sockets = [] |
|
360 def closingsocket(*args, **kwargs): |
|
361 s = util.MockSocket(*args, **kwargs) |
|
362 sockets.append(s) |
|
363 s.data = ['HTTP/1.1 200 OK\r\n', |
|
364 'Server: BogusServer 1.0\r\n', |
|
365 'Connection: Keep-Alive\r\n', |
|
366 'Content-Length: 16', |
|
367 '\r\n\r\n', |
|
368 'You can do that.'] |
|
369 s.close_on_empty = True |
|
370 return s |
|
371 |
|
372 socket.socket = closingsocket |
|
373 con = http.HTTPConnection('1.2.3.4:80') |
|
374 con._connect() |
|
375 con.request('GET', '/') |
|
376 r1 = con.getresponse() |
|
377 r1.read() |
|
378 self.assertFalse(con.sock.closed) |
|
379 self.assert_(con.sock.remote_closed) |
|
380 con.request('GET', '/') |
|
381 self.assertEqual(2, len(sockets)) |
|
382 |
|
383 def test_no_response_raises_response_not_ready(self): |
|
384 con = http.HTTPConnection('foo') |
|
385 self.assertRaises(http.httplib.ResponseNotReady, con.getresponse) |
356 # no-check-code |
386 # no-check-code |