summaryrefslogtreecommitdiff
path: root/tests/test_httpserver.py
blob: 7b64a458858303a57987786e6dc5c12e35c1523a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import email
import io
import socket

import six

from paste.httpserver import LimitedLengthFile, WSGIHandler, serve
from six.moves import StringIO


class MockServer(object):
    server_address = ('127.0.0.1', 80)


class MockSocket(object):
    def makefile(self, mode, bufsize):
        return StringIO()


def test_environ():
    mock_socket = MockSocket()
    mock_client_address = '1.2.3.4'
    mock_server = MockServer()

    wsgi_handler = WSGIHandler(mock_socket, mock_client_address, mock_server)
    wsgi_handler.command = 'GET'
    wsgi_handler.path = '/path'
    wsgi_handler.request_version = 'HTTP/1.0'
    wsgi_handler.headers = email.message_from_string('Host: mywebsite')

    wsgi_handler.wsgi_setup()

    assert wsgi_handler.wsgi_environ['HTTP_HOST'] == 'mywebsite'


def test_environ_with_multiple_values():
    mock_socket = MockSocket()
    mock_client_address = '1.2.3.4'
    mock_server = MockServer()

    wsgi_handler = WSGIHandler(mock_socket, mock_client_address, mock_server)
    wsgi_handler.command = 'GET'
    wsgi_handler.path = '/path'
    wsgi_handler.request_version = 'HTTP/1.0'
    wsgi_handler.headers = email.message_from_string('Host: host1\nHost: host2')

    wsgi_handler.wsgi_setup()

    assert wsgi_handler.wsgi_environ['HTTP_HOST'] == 'host1,host2'


def test_limited_length_file():
    backing = io.BytesIO(b'0123456789')
    f = LimitedLengthFile(backing, 9)
    assert f.tell() == 0
    assert f.read() == b'012345678'
    assert f.tell() == 9
    assert f.read() == b''

def test_limited_length_file_tell_on_socket():
    backing_read, backing_write = socket.socketpair()
    if six.PY2:
        # On Python 2, socketpair() returns an internal socket type rather than
        # the public one.
        backing_read = socket.socket(_sock=backing_read)
    f = LimitedLengthFile(backing_read.makefile('rb'), 10)
    backing_write.send(b'0123456789')
    backing_write.close()
    assert f.tell() == 0
    assert f.read(1) == b'0'
    assert f.tell() == 1
    assert f.read() == b'123456789'
    assert f.tell() == 10
    backing_read.close()


def test_address_family_v4():
    #ipv4
    app = None
    host = '127.0.0.1'
    port = '9090'
    
    svr = serve(app, host=host, port=port, start_loop=False, use_threadpool=False)

    af = svr.address_family
    addr = svr.server_address
    p = svr.server_port
    
    svr.server_close()

    assert (af == socket.AF_INET)
    assert (addr[0] == '127.0.0.1')
    assert (str(p) == port)


def test_address_family_v4_host_and_port():
    #ipv4
    app = None
    host = '127.0.0.1:9091'
    
    svr = serve(app, host=host, start_loop=False, use_threadpool=False)
    
    af = svr.address_family
    addr = svr.server_address
    p = svr.server_port
    
    svr.server_close()
    
    assert (af == socket.AF_INET)
    assert (addr[0] == '127.0.0.1')
    assert (str(p) == '9091')

def test_address_family_v6():
    #ipv6
    app = None
    host = '[::1]'
    port = '9090'
    
    try:
        svr = serve(app, host=host, port=port, start_loop=False, use_threadpool=False)
        
        af = svr.address_family
        addr = svr.server_address
        p = svr.server_port

        svr.server_close()
        
        assert (af == socket.AF_INET6)
        assert (addr[0] == '::1')
        assert (str(p) == port)
    except (socket.error, OSError) as err:
        # v6 support not available in this OS, pass the test
        assert True