blob: 2224b70c6520a34a8fc21c69155f72770871f7bf [file] [log] [blame]
import unittest
from appurify.tunnel import Proxy, HttpParser
from appurify.tunnel import (CRLF, HTTP_RESPONSE_PARSER, HTTP_PARSER_STATE_COMPLETE,
ProxyConnectFailed, HTTP_PARSER_STATE_HEADERS_COMPLETE)
class Client(object):
origin_addr = ('127.0.0.1', 64000)
buffer = {'in':'', 'out':''}
def __init__(self):
pass
def recv(self, bytes):
data = self.buffer['out'][:bytes]
self.buffer['out'] = self.buffer['out'][bytes:]
return data
def send(self, data):
self.buffer['in'] += data
return len(data)
def fileno(self):
pass
def close(self):
pass
class TestProxy(unittest.TestCase):
def setUp(self):
self.proxy = Proxy(Client())
def test_http_get(self):
self.proxy.client.buffer['out'] += "GET http://httpbin.org/get HTTP/1.1%s" % CRLF
self.proxy.process_request(self.proxy.recv_from_client())
self.assertEqual(self.proxy.server, None)
self.proxy.client.buffer['out'] += CRLF.join([
"User-Agent: curl/7.27.0",
"Host: httpbin.org",
"Accept: */*",
"Proxy-Connection: Keep-Alive",
CRLF
])
self.proxy.process_request(self.proxy.recv_from_client())
self.assertFalse(self.proxy.server == None)
self.assertEqual(self.proxy.host, "httpbin.org")
self.assertEqual(self.proxy.port, 80)
self.proxy.flush_server_buffer()
self.assertEqual(self.proxy.buffer['server'], '')
data = self.proxy.recv_from_server()
while data:
self.proxy.process_response(data)
if self.proxy.response.state == HTTP_PARSER_STATE_COMPLETE:
break
data = self.proxy.recv_from_server()
self.assertEqual(self.proxy.response.state, HTTP_PARSER_STATE_COMPLETE)
self.assertEqual(int(self.proxy.response.code), 200)
self.proxy.close()
def test_https_get(self):
self.proxy.client.buffer['out'] += CRLF.join([
"CONNECT httpbin.org:80 HTTP/1.1",
"Host: httpbin.org:80",
"User-Agent: curl/7.27.0",
"Proxy-Connection: Keep-Alive",
CRLF
])
self.proxy.process_request(self.proxy.recv_from_client())
self.assertFalse(self.proxy.server == None)
self.assertEqual(self.proxy.buffer['client'], self.proxy.connection_established_pkt)
self.proxy.flush_client_buffer()
self.assertEqual(self.proxy.buffer['client'], '')
parser = HttpParser(HTTP_RESPONSE_PARSER)
parser.parse(self.proxy.client.buffer['in'])
self.assertEqual(parser.state, HTTP_PARSER_STATE_HEADERS_COMPLETE)
self.assertEqual(int(parser.code), 200)
self.proxy.client.buffer['out'] += CRLF.join([
"GET /user-agent HTTP/1.1",
"Host: httpbin.org",
"User-Agent: curl/7.27.0",
CRLF
])
self.proxy.process_request(self.proxy.recv_from_client())
self.proxy.flush_server_buffer()
self.assertEqual(self.proxy.buffer['server'], '')
parser = HttpParser(HTTP_RESPONSE_PARSER)
data = self.proxy.recv_from_server()
while data:
parser.parse(data)
if parser.state == HTTP_PARSER_STATE_COMPLETE:
break
data = self.proxy.recv_from_server()
self.assertEqual(parser.state, HTTP_PARSER_STATE_COMPLETE)
self.assertEqual(int(parser.code), 200)
self.proxy.close()
def test_proxy_connection_failed(self):
with self.assertRaises(ProxyConnectFailed):
self.proxy.process_request(CRLF.join([
"GET http://unknown.domain HTTP/1.1",
"Host: unknown.domain",
CRLF
]))