
5ый семестр / 7. Сети и телекомуникации (сomplete) / SiT - копия / Лабораторная работа 8 / Лабораторная работа8_прокси
.docxbyte[] selectedAuthMethod = { SOCKS_VERSION, SOCKS_NOAUTH };
socksClientStream.Write(selectedAuthMethod, 0, 2);
Затем устанавливаем соединение с удаленным сервером, к которому был направлен запрос от браузера:
/* *****************************************************
* server client connection part
* ***************************************************** */
byte[] bintargetport = new byte[2];
socksClientStream.Read(bintargetport, 0, 2);
byte[] tmp_byteorder = new byte[2];
tmp_byteorder[0] = bintargetport[1];
tmp_byteorder[1] = bintargetport[0];
target_port = (int)BitConverter.ToUInt16(tmp_byteorder, 0);
Console.WriteLine("requesting " + connection_target + ":" + target_port.ToString());
serverClient = new TcpClient(connection_target, target_port);
/* *****************************************************
* reply part
* ***************************************************** */
if (serverClient.Connected)
{
// reply successful audience
byte[] reply = new byte[10];
//version
reply[0] = SOCKS_VERSION;
// replycode
reply[1] = SOCKS_REPLYSUCCESS;
//reserved and 0
reply[2] = 0;
// addresstype
reply[3] = 1;
string ip = serverClient.Client.LocalEndPoint.ToString().Split(':')[0];
IPAddress ipaddr = IPAddress.Parse(ip);
reply[4] = ipaddr.GetAddressBytes()[0];
reply[5] = ipaddr.GetAddressBytes()[1];
reply[6] = ipaddr.GetAddressBytes()[2];
reply[7] = ipaddr.GetAddressBytes()[3];
int port = int.Parse(serverClient.Client.LocalEndPoint.ToString().Split(':')[1]);
// read unsigned integer in networkoctet order
reply[8] = BitConverter.GetBytes((UInt16)port)[0];
reply[9] = BitConverter.GetBytes((UInt16)port)[1];
socksClientStream.Write(reply, 0, 10);
Console.WriteLine("writing reply");
Etc..
}
Ниже приведен простейшего HTTP прокси сервера на Python.
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from SocketServer import ThreadingMixIn
import urllib2, sys, re, httplib, urlparse
class ProxyHandler( BaseHTTPRequestHandler ):
server_version = ''
sys_version = ''
def do_HEAD( self ):
print "HEAD"
def log_message(self,format,*args):
return
def do_POST( self ):
print '-------------------------------'
print "POST"
requested_url = self.requestline.split()[1]
parsed_url = urlparse.urlsplit( requested_url )
cutted_url = urlparse.urlunsplit( ( '', '', parsed_url.path, parsed_url.query, '' ) )
print parsed_url.hostname
print parsed_url.path
print parsed_url.query
print requested_url
port = 80 if None == parsed_url.port else parsed_url.port
req_headers = {}
for x in self.headers.items():
req_headers[x[0]] = x[1]
print req_headers
body = self.rfile.read(int(self.headers['content-length']))
print 'body -- ',body
conn = httplib.HTTPConnection( parsed_url.hostname, port )
conn.request( 'POST', cutted_url, body,headers = req_headers )
response = conn.getresponse()
print response.status
self.send_response( response.status )
#resp_headers = []
#if 'content-type' in response.msg.dict:
# resp_headers.append( ( 'content-type', response.msg.dict['content-type'] ) )
#if 'date' in response.msg.dict:
# resp_headers.append( ( 'date', response.msg.dict['date'] ) )
#if 'set-cookie' in response.msg.dict:
# resp_headers.append( ( 'set-cookie', response.msg.dict['set-cookie'] ) )
#if 'location' in response.msg.dict:
# resp_headers.append( ( 'location', response.msg.dict['location'] ) )
#for x in resp_headers:
# self.send_header( x[0], x[1] )
#self.end_headers()
for x in response.msg.items():
self.send_header( x[0], x[1] )
self.end_headers()
html = response.read()
self.wfile.write( html )
self.connection.close()
conn.close()
print 'End - post'
return
def do_GET( self ):
print '--------------------------------------'
print 'GET'
requested_url = self.requestline.split()[1]
parsed_url = urlparse.urlsplit( requested_url )
cutted_url = urlparse.urlunsplit( ( '', '', parsed_url.path, parsed_url.query, '' ) )
port = 80 if None == parsed_url.port else parsed_url.port
#if 'accept' in self.headers.dict:
# req_headers['accept'] = self.headers.dict['accept']
#if 'accept-charset' in self.headers.dict:
# req_headers['accept-charset'] = self.headers.dict['accept-charset']
#if 'accept-language' in self.headers.dict:
# req_headers['accept-language'] = self.headers.dict['accept-language']
#req_headers['cache-control'] = 'no-cache'
#req_headers['pragma'] = 'no-cache'
#req_headers['user-agent'] = 'Mozilla/5.0'
#if 'referer' in self.headers.dict:
# req_headers['referer'] = self.headers.dict['referer']
#if 'host' in self.headers.dict:
# req_headers['host'] = self.headers.dict['host']
#for x in self.headers.dict.keys():
# if len( x ) >= 6 and x[:6] == 'cookie':
# req_headers[x] = self.headers.dict[x]
#for x in self.headers.dict.keys():
# req_headers[x] = self.headers.headers[x]
req_headers = {}
for x in self.headers.items():
req_headers[x[0]] = x[1]
print req_headers
conn = httplib.HTTPConnection( parsed_url.hostname, port )
conn.request( 'GET', cutted_url ,'' ,req_headers )
response = conn.getresponse()
#if response.status not in ( 200, 302, 301, 204 ):
# print requested_url + ' - ' + str( response.status )
# print self.headers.headers
# print response.msg.headers
# self.send_response( response.status )
# self.end_headers()
# self.connection.close()
# conn.close()
# return
#resp_headers = []
#if 'content-type' in response.msg.dict:
# resp_headers.append( ( 'content-type', response.msg.dict['content-type'] ) )
#if 'date' in response.msg.dict:
# resp_headers.append( ( 'date', response.msg.dict['date'] ) )
#if 'set-cookie' in response.msg.dict:
# resp_headers.append( ( 'set-cookie', response.msg.dict['set-cookie'] ) )
#if 'location' in response.msg.dict:
# resp_headers.append( ( 'location', response.msg.dict['location'] ) )
self.name = ''
self.send_response( response.status )
print response.status
print parsed_url.hostname, ':', port
print response.msg.items()
i=0
for x in response.msg.items():
i=i+1
if(x[0]!='transfer-encoding'):
print '--- ', x[0],' : ' ,x[1]
if(x[0]!='connection'):
self.send_header( x[0], x[1] )
else: self.send_header( 'connection', 'close' )
self.end_headers()
#self.wfile.write( response.status )
#self.wfile.write( ' content-type: text/html' )
html = response.read()
self.wfile.write( html )
#self.wfile.flush()
#self.wfile.close()
conn.close()
self.connection.close()
print 'END -- GET'
return 0
class ThreadedHTTPServer( ThreadingMixIn, HTTPServer ):
daemon_threads = True
if __name__ == '__main__':
proxy = ThreadedHTTPServer( ( 'localhost', 19277 ), ProxyHandler )
try:
proxy.serve_forever()
except KeyboardInterrupt:
print 'End of server'
proxy.server_close()