Skip to content

Instantly share code, notes, and snippets.

@liyonghelpme
Created June 29, 2014 14:15
Show Gist options
  • Save liyonghelpme/c6ebd49af246825943d0 to your computer and use it in GitHub Desktop.
Save liyonghelpme/c6ebd49af246825943d0 to your computer and use it in GitHub Desktop.
#coding:utf8
import os, sys, thread
#, socket
import gevent
from gevent import socket
BACKLOG = 50
MAX_DATA_RECV = 4096
DEBUG = False
REPSRC = 'baidu'
REPTAR = 'sohuu'
allThreads = {}
def main():
host = ''
port = int(sys.argv[1])
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
s.listen(BACKLOG)
print("start recv")
except socket.error, (value, message):
if s:
s.close()
print 'could not open socket', message
sys.exit(1)
gevent.spawn(checkThread)
while 1:
conn, client_addr = s.accept()
print 'accept connection'
#thread.start_new_thread(proxy_thread, (conn, client_addr))
allThreads[conn] = True
print 'start new thread', len(allThreads)
gevent.spawn(proxy_thread, conn, client_addr)
print("finish spawn")
s.close()
def checkThread():
while True:
print "allThread", allThreads
gevent.sleep(2)
#send data to golang server
#http server implement not very good
import base64
def proxy_thread(conn, client_addr):
print 'start proxy'
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#s.connect(('23.226.77.8', 1080))
s.connect(('localhost', 1080))
while True:
#read request from connection then send to middle server
#read request
conn.settimeout(10)
print 'wait for browser information'
request = ''
try:
request = conn.recv(MAX_DATA_RECV)
except:
print 'browser connect over'
conn.close()
break
print 'request'
print request
print 'end'
#resend request as base64 to server
#handle request
print type(request)
print 'wait request'
request = request.replace(REPSRC, REPTAR)
#connection to server
#s.connect(('localhost', 1080))
if len(request) > 0:
#send request
st = s.send(request)
print 'send number', st, len(request)
#虚拟代理http 服务器
noData = False
while 1:
print conn, 'waitData'
s.settimeout(5)
data = ''
try:
data = s.recv(MAX_DATA_RECV)
except:
print 'time out'
break
print conn, 'read data', len(data)
print data
if len(data) > 0:
while 1:
num = conn.send(data)
print('send is', len(data), num)
if num < len(data):
data = data[num:]
else:
break
else:
#noData
break
else:
print 'no request'
conn.close()
break
s.close()
print 'finish thread'
#allThreads[conn] = None
allThreads.pop(conn)
print 'over thread', len(allThreads)
'''
first_line = request.split('\n')[0]
url = first_line.split(' ')[1]
print 'first line'
print first_line
print 'url'
print url
http_pos = url.find('://')
if http_pos == -1:
temp = url
else:
temp = url[(http_pos+3):]
port_pos = temp.find(":")
webserver_pos = temp.find("/")
if webserver_pos == -1:
webserver_pos = len(temp)
webserver = ""
port = -1
if port_pos == -1 or webserver_pos < port_pos:
port = 80
webserver = temp[:webserver_pos]
else:
port = int(temp[(port_pos+1):])[:webserver_pos-port_pos-1]
webserver = temp[:port_pos]
print 'Connect to', webserver, port
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((webserver, port))
s.send(request)
while 1:
data = s.recv(MAX_DATA_RECV)
if len(data) > 0:
conn.send(data)
else:
break
s.close()
conn.close()
except socket.error, (value, message):
if s:
s.close()
if conn:
conn.close()
print 'runtime error', message
sys.exit(1)
'''
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment