-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserverProxy.py
165 lines (116 loc) · 3.86 KB
/
serverProxy.py
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# coding: utf-8
import socket
from controleCache import *
from setting import *
import thread
_TIMEOUT = 2
''' Referência
http://www.caucho.com/resin-4.0/admin/http-proxy-cache.xtp
'''
class ClienteHTTP:
def __init__(self, host='', port=80):
self.host = host
self.port = port
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
self.sock.connect((self.host, self.port))
def defineTimeout(self, segundos):
self.sock.settimeout(segundos)
def enviaDados(self, dados):
self.sock.send(dados)
def recebeDados(self, buffer):
dados = ''
while True:
# Captura exceção do timeout.
try:
dado = self.sock.recv(buffer)
if not dado:
break
dados = dados + dado
except socket.timeout:
break
return dados
def terminaConexao(self):
self.sock.close()
def iniciaServidor():
''' Inicia soquete TCP para conexões com cliente.'''
servidor = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
servidor.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
servidor.bind((HOST, PORTA))
servidor.listen(1)
print '\nserver up port ', PORTA, '....'
escutaConexao(servidor)
# usar depois
def terminaServidor(servidor):
''' Termina soquete TCP. '''
servidor.close()
def escutaConexao(servidor):
''' Escuta porta e responde requisições dos clientes.
'''
while True:
con, infoCliente = servidor.accept()
header = con.recv(BUFFER_SIZE)
# Verifica conexão https. Caso seja, rejeita.
if verificaHttps(header) != -1 or not header:
continue
print [infoCliente[0]], header.split('\n')[0], '\n'
thread.start_new_thread(respondeCliente, tuple([header, con]))
def respondeCliente(header, con):
host = header.split('\r\n')[1].split()[1]
cliente = ClienteHTTP(host, 80)
cliente.defineTimeout(_TIMEOUT)
cliente.enviaDados(header);
dado = ''
while True:
dado = cliente.recebeDados(1024)
if not dado:
break
con.send(dado)
def statusResposta(dados):
if not dados:
return 1
return int(dados.split()[1])
def extraiCabecalho(cabecalho):
''' Extrai e armazena todo o cabeçalho em um dicionário para facilitar a manipulação.
Retorna o cabeçalho criado.
'''
cabecalhoDicionario = {}
# Elimina '\r' da string.
cabecalho = cabecalho.replace('\r', '')
# Elimina campo da requisição.
cabecalho = cabecalho.split('\n')[1:]
# Armazena os itens do cabeçalho em um dicionario..
for tag in cabecalho:
# Verifica fim do cabeçalho.
if not tag:
break
tag = tag.split(': ')
cabecalhoDicionario[tag[0]] = tag[1]
return cabecalhoDicionario
def obterData(dados):
''' Obtem a data de um cabeçalho.
Retorna data caso exista e False caso contrário. '''
header = extraiCabecalho(dados)
try:
return header['Date']
except KeyError:
return '\n'
def extraiNomeArquivo(request_browser):
''' Extrai nome do arquivo em uma requisicao. '''
request_browser = request_browser.replace('HTTP/1.1', '')
request_browser = request_browser.split('?')[0]
return request_browser[request_browser.rfind('/') + 1:]
def verificaHttps(request):
''' Verifica se é uma requisição https(port 443) '''
return request.split('\n')[0].find('443')
def extraiRequisicao(dados):
''' Extrai e retorna a requisição do cabeçalho.
primeira linha do cabeçalho http.
'''
return dados.split('\r\n')[0] if dados else False
if __name__ == '__main__':
''' Função principal '''
try:
#proxy.setup_http_proxy('10.0.0.254', 8080)
iniciaServidor()
except KeyboardInterrupt:
print '\n\nEncerrando servidor...\n\n'