diff --git a/THIRDPARTY b/THIRDPARTY index 5c6d9ce26b..39244b648f 100644 --- a/THIRDPARTY +++ b/THIRDPARTY @@ -229,10 +229,6 @@ Files: tools/jslint/jslint.js Copyright: 2002 Douglas Crockford License: XXX-good-not-evil -Files: tools/python-proxy -Copyright: 2009 F.bio Domingues -License: Expat - Files: tools/review Copyright: 2010 Ksplice, Inc. License: Apache-2.0 diff --git a/tools/python-proxy b/tools/python-proxy deleted file mode 100755 index 3c0236c0b8..0000000000 --- a/tools/python-proxy +++ /dev/null @@ -1,246 +0,0 @@ -#!/usr/bin/env python2.7 -# -*- coding: cp1252 -*- -# -# -#Copyright (c) <2009> -# -#Permission is hereby granted, free of charge, to any person -#obtaining a copy of this software and associated documentation -#files (the "Software"), to deal in the Software without -#restriction, including without limitation the rights to use, -#copy, modify, merge, publish, distribute, sublicense, and/or sell -#copies of the Software, and to permit persons to whom the -#Software is furnished to do so, subject to the following -#conditions: -# -#The above copyright notice and this permission notice shall be -#included in all copies or substantial portions of the Software. -# -#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -#EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -#OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -#NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -#HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -#WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -#FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -#OTHER DEALINGS IN THE SOFTWARE. - -"""\ -Copyright (c) <2009> - - ************************************** - *** Python Proxy - A Fast HTTP proxy *** - ************************************** - -Neste momento este proxy é um Elie Proxy. - -Suporta os métodos HTTP: - - OPTIONS; - - GET; - - HEAD; - - POST; - - PUT; - - DELETE; - - TRACE; - - CONENCT. - -Suporta: - - Conexões dos cliente em IPv4 ou IPv6; - - Conexões ao alvo em IPv4 e IPv6; - - Conexões todo o tipo de transmissão de dados TCP (CONNECT tunneling), - p.e. ligações SSL, como é o caso do HTTPS. - -A fazer: - - Verificar se o input vindo do cliente está correcto; - - Enviar os devidos HTTP erros se não, ou simplesmente quebrar a ligação; - - Criar um gestor de erros; - - Criar ficheiro log de erros; - - Colocar excepções nos sítios onde é previsível a ocorrência de erros, - p.e.sockets e ficheiros; - - Rever tudo e melhorar a estrutura do programar e colocar nomes adequados nas - variáveis e métodos; - - Comentar o programa decentemente; - - Doc Strings. - -Funcionalidades futuras: - - Adiconar a funcionalidade de proxy anónimo e transparente; - - Suportar FTP?. - - -(!) Atenção o que se segue só tem efeito em conexões não CONNECT, para estas o - proxy é sempre Elite. - -Qual a diferença entre um proxy Elite, Anónimo e Transparente? - - Um proxy elite é totalmente anónimo, o servidor que o recebe não consegue ter - conhecimento da existência do proxy e não recebe o endereço IP do cliente; - - Quando é usado um proxy anónimo o servidor sabe que o cliente está a usar um - proxy mas não sabe o endereço IP do cliente; - É enviado o cabeçalho HTTP "Proxy-agent". - - Um proxy transparente fornece ao servidor o IP do cliente e um informação que - se está a usar um proxy. - São enviados os cabeçalhos HTTP "Proxy-agent" e "HTTP_X_FORWARDED_FOR". - -""" -from __future__ import print_function -from __future__ import division - -import socket, six.moves._thread, select -PORT = 8085 - -__version__ = '0.1.0 Draft 1' -BUFLEN = 8192 -VERSION = 'Python Proxy/'+__version__ -HTTPVER = 'HTTP/1.1' - -class ConnectionHandler(object): - def __init__(self, connection, address, timeout): - self.client = connection - self.client_buffer = '' - self.timeout = timeout - self.method, self.path, self.protocol = self.get_base_header() - if self.method=='CONNECT': - self.method_CONNECT() - elif self.method in ('OPTIONS', 'GET', 'HEAD', 'POST', 'PUT', - 'DELETE', 'TRACE'): - self.method_others() - self.client.close() - self.target.close() - - def get_base_header(self): - while True: - self.client_buffer += self.client.recv(BUFLEN) - end = self.client_buffer.find('\n') - if end!=-1: - break - data = (self.client_buffer[:end+1]).split() - self.client_buffer = self.client_buffer[end+1:] - return data - - def method_CONNECT(self): - print('self.path', self.path) - self._connect_target(self.path) - self.client.send(HTTPVER+' 200 Connection established\n'+ - 'Proxy-agent: %s\n\n'%VERSION) - self.client_buffer = '' - self._read_write() - - def method_others(self): - print() - print('=====================================') - print('method', self.method) - print('protocol', self.protocol) - print('self.path', self.path) - print() - - horking = False - if horking: - if self.path.endswith('.js'): - print('HORKING JS!!!!!!!') - print() - return - - if self.path.endswith('.png'): - print('HORKING PNG!!!!!!!') - print() - return - - if self.path.endswith('.css'): - print('HORKING CSS!!!!!!!') - print() - return - - self._connect_target() - payload = '%s %s %s\n' % (self.method, self.path, self.protocol) - buf = payload - try: - headers, rest = self.client_buffer.split('\r\n\r\n') - except: - headers = self.client_buffer - rest = None - - for line in headers.split('\n'): - line = line.strip() - if not line: - continue - print(repr(line)) - field, value = line.split(':', 1) - if line.startswith('Host:'): - line = line.replace(str(PORT), '9991') - if field in ['Connection']: - line = 'Connection: close' - if field in ['If-Modified-Since']: - continue - buf += line + '\n' - buf += '\n' - buf = buf.replace('\n', '\r\n') - self.target.send(buf) - if rest: - print('REST') - print(repr(self.client_buffer)) - print(repr(buf)) - print(repr(rest)) - self.target.send(rest) - - self.client_buffer = '' - self._read_write() - - def _connect_target(self): - host = '127.0.0.1' - port = 9991 - (soc_family, _, _, _, address) = socket.getaddrinfo(host, port)[0] - self.target = socket.socket(soc_family) - print('Connecting...', host, port) - self.target.connect(address) - print('Connected') - - def _read_write(self): - time_out_max = self.timeout//3 - socs = [self.client, self.target] - count = 0 - while True: - count += 1 - (recv, _, error) = select.select(socs, [], socs, 3) - if error: - break - if recv: - for in_ in recv: - data = in_.recv(BUFLEN) - if in_ is self.client: - out = self.target - else: - if data: - print() - print('OUT') - print('path =', self.path) - print(len(data)) - print(repr(data)) - print() - out = self.client - # super hacky and fragile - data = data.replace('9991', str(PORT)) - - if data: - if '400 Bad Request' in data: - print('DONE!') - import sys; sys.exit(1) - out.send(data) - count = 0 - if count == time_out_max: - break - -def start_server(host='localhost', port=PORT, IPv6=False, timeout=60, - handler=ConnectionHandler): - if IPv6==True: - soc_type=socket.AF_INET6 - else: - soc_type=socket.AF_INET - soc = socket.socket(soc_type) - soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - soc.bind((host, port)) - print("Serving on %s:%d." % (host, port)) #debug - soc.listen(0) - while True: - six.moves._thread.start_new_thread(handler, soc.accept()+(timeout,)) - -if __name__ == '__main__': - start_server()