diff options
| author | Thomas Kriechbaumer <thomas@kriechbaumer.name> | 2015-07-27 11:46:49 +0200 | 
|---|---|---|
| committer | Thomas Kriechbaumer <thomas@kriechbaumer.name> | 2015-07-30 13:53:17 +0200 | 
| commit | 89f22f735944989912a7a0394dd7e80d420cb0f3 (patch) | |
| tree | 426e961c5c98f9bf917e628df09ec5fc53c41442 /test/test_protocol_http.py | |
| parent | d2ae6b630e7924479aefbb9f0193fdfcbae8fea6 (diff) | |
| download | mitmproxy-89f22f735944989912a7a0394dd7e80d420cb0f3.tar.gz mitmproxy-89f22f735944989912a7a0394dd7e80d420cb0f3.tar.bz2 mitmproxy-89f22f735944989912a7a0394dd7e80d420cb0f3.zip | |
refactor connection & protocol handling
Diffstat (limited to 'test/test_protocol_http.py')
| -rw-r--r-- | test/test_protocol_http.py | 76 | 
1 files changed, 44 insertions, 32 deletions
| diff --git a/test/test_protocol_http.py b/test/test_protocol_http.py index 747fdc1e..18238593 100644 --- a/test/test_protocol_http.py +++ b/test/test_protocol_http.py @@ -1,13 +1,21 @@ +import cStringIO  from cStringIO import StringIO  from mock import MagicMock  from libmproxy.protocol.http import *  from netlib import odict +from netlib.http import http1  import tutils  import tservers +def mock_protocol(data='', chunked=False): +    rfile = cStringIO.StringIO(data) +    wfile = cStringIO.StringIO() +    return http1.HTTP1Protocol(rfile=rfile, wfile=wfile) + +  def test_HttpAuthenticationError():      x = HttpAuthenticationError({"foo": "bar"}) @@ -30,9 +38,10 @@ def test_stripped_chunked_encoding_no_content():  class TestHTTPRequest:      def test_asterisk_form_in(self): -        s = StringIO("OPTIONS * HTTP/1.1")          f = tutils.tflow(req=None) -        f.request = HTTPRequest.from_stream(s) +        protocol = mock_protocol("OPTIONS * HTTP/1.1") +        f.request = HTTPRequest.from_protocol(protocol) +          assert f.request.form_in == "relative"          f.request.host = f.server_conn.address.host          f.request.port = f.server_conn.address.port @@ -42,10 +51,11 @@ class TestHTTPRequest:                                          "Content-Length: 0\r\n\r\n")      def test_relative_form_in(self): -        s = StringIO("GET /foo\xff HTTP/1.1") -        tutils.raises("Bad HTTP request line", HTTPRequest.from_stream, s) -        s = StringIO("GET /foo HTTP/1.1\r\nConnection: Upgrade\r\nUpgrade: h2c") -        r = HTTPRequest.from_stream(s) +        protocol = mock_protocol("GET /foo\xff HTTP/1.1") +        tutils.raises("Bad HTTP request line", HTTPRequest.from_protocol, protocol) + +        protocol = mock_protocol("GET /foo HTTP/1.1\r\nConnection: Upgrade\r\nUpgrade: h2c") +        r = HTTPRequest.from_protocol(protocol)          assert r.headers["Upgrade"] == ["h2c"]          raw = r._assemble_headers() @@ -61,19 +71,19 @@ class TestHTTPRequest:          assert "Host" in r.headers      def test_expect_header(self): -        s = StringIO( +        protocol = mock_protocol(              "GET / HTTP/1.1\r\nContent-Length: 3\r\nExpect: 100-continue\r\n\r\nfoobar") -        w = StringIO() -        r = HTTPRequest.from_stream(s, wfile=w) -        assert w.getvalue() == "HTTP/1.1 100 Continue\r\n\r\n" +        r = HTTPRequest.from_protocol(protocol) +        assert protocol.tcp_handler.wfile.getvalue() == "HTTP/1.1 100 Continue\r\n\r\n"          assert r.content == "foo" -        assert s.read(3) == "bar" +        assert protocol.tcp_handler.rfile.read(3) == "bar"      def test_authority_form_in(self): -        s = StringIO("CONNECT oops-no-port.com HTTP/1.1") -        tutils.raises("Bad HTTP request line", HTTPRequest.from_stream, s) -        s = StringIO("CONNECT address:22 HTTP/1.1") -        r = HTTPRequest.from_stream(s) +        protocol = mock_protocol("CONNECT oops-no-port.com HTTP/1.1") +        tutils.raises("Bad HTTP request line", HTTPRequest.from_protocol, protocol) + +        protocol = mock_protocol("CONNECT address:22 HTTP/1.1") +        r = HTTPRequest.from_protocol(protocol)          r.scheme, r.host, r.port = "http", "address", 22          assert r.assemble() == ("CONNECT address:22 HTTP/1.1\r\n"                                  "Host: address:22\r\n" @@ -81,10 +91,11 @@ class TestHTTPRequest:          assert r.pretty_url(False) == "address:22"      def test_absolute_form_in(self): -        s = StringIO("GET oops-no-protocol.com HTTP/1.1") -        tutils.raises("Bad HTTP request line", HTTPRequest.from_stream, s) -        s = StringIO("GET http://address:22/ HTTP/1.1") -        r = HTTPRequest.from_stream(s) +        protocol = mock_protocol("GET oops-no-protocol.com HTTP/1.1") +        tutils.raises("Bad HTTP request line", HTTPRequest.from_protocol, protocol) + +        protocol = mock_protocol("GET http://address:22/ HTTP/1.1") +        r = HTTPRequest.from_protocol(protocol)          assert r.assemble(          ) == "GET http://address:22/ HTTP/1.1\r\nHost: address:22\r\nContent-Length: 0\r\n\r\n" @@ -92,8 +103,8 @@ class TestHTTPRequest:          """          Exercises fix for Issue #392.          """ -        s = StringIO("OPTIONS /secret/resource HTTP/1.1") -        r = HTTPRequest.from_stream(s) +        protocol = mock_protocol("OPTIONS /secret/resource HTTP/1.1") +        r = HTTPRequest.from_protocol(protocol)          r.host = 'address'          r.port = 80          r.scheme = "http" @@ -102,8 +113,8 @@ class TestHTTPRequest:                                  "Content-Length: 0\r\n\r\n")      def test_http_options_absolute_form_in(self): -        s = StringIO("OPTIONS http://address/secret/resource HTTP/1.1") -        r = HTTPRequest.from_stream(s) +        protocol = mock_protocol("OPTIONS http://address/secret/resource HTTP/1.1") +        r = HTTPRequest.from_protocol(protocol)          r.host = 'address'          r.port = 80          r.scheme = "http" @@ -216,26 +227,27 @@ class TestHTTPRequest:  class TestHTTPResponse:      def test_read_from_stringio(self): -        _s = "HTTP/1.1 200 OK\r\n" \ +        s = "HTTP/1.1 200 OK\r\n" \               "Content-Length: 7\r\n" \               "\r\n"\               "content\r\n" \               "HTTP/1.1 204 OK\r\n" \               "\r\n" -        s = StringIO(_s) -        r = HTTPResponse.from_stream(s, "GET") -        assert r.code == 200 + +        protocol = mock_protocol(s) +        r = HTTPResponse.from_protocol(protocol, "GET") +        assert r.status_code == 200          assert r.content == "content" -        assert HTTPResponse.from_stream(s, "GET").code == 204 +        assert HTTPResponse.from_protocol(protocol, "GET").status_code == 204 -        s = StringIO(_s) +        protocol = mock_protocol(s)          # HEAD must not have content by spec. We should leave it on the pipe. -        r = HTTPResponse.from_stream(s, "HEAD") -        assert r.code == 200 +        r = HTTPResponse.from_protocol(protocol, "HEAD") +        assert r.status_code == 200          assert r.content == ""          tutils.raises(              "Invalid server response: 'content", -            HTTPResponse.from_stream, s, "GET" +            HTTPResponse.from_protocol, protocol, "GET"          )      def test_repr(self): | 
