Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
3
Добавлен:
18.07.2023
Размер:
43.88 Кб
Скачать

byte[] 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()

Соседние файлы в папке Лабораторная работа 8