Skip to content

Instantly share code, notes, and snippets.

@liyonghelpme
Last active August 29, 2015 14:02
Show Gist options
  • Save liyonghelpme/39ef1ad4eca381c76009 to your computer and use it in GitHub Desktop.
Save liyonghelpme/39ef1ad4eca381c76009 to your computer and use it in GitHub Desktop.
python http proxy greenlet 非阻塞
#coding:utf8
import os, sys, thread, socket
from multiprocessing import Process
import time
BACKLOG = 50
MAX_DATA_RECV = 4096
DEBUG = False
def main():
host = ''
port = int(sys.argv[1])
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(BACKLOG)
except socket.error, (value, message):
if s:
s.close()
print 'could not open socket', message
sys.exit(1)
while 1:
conn, client_addr = s.accept()
#thread.start_new_thread(proxy_thread, (conn, client_addr))
child_proc = Process(target=proxy_thread, args=(conn, client_addr))
child_proc.start()
s.close()
def proxy_thread(conn, client_addr):
print 'pid', os.getpid(), os.getppid()
request = conn.recv(MAX_DATA_RECV)
print 'request'
print request
print 'end'
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
print 'get', first_line
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()
import os, sys, thread, socket
BACKLOG = 50
MAX_DATA_RECV = 4096
DEBUG = false
def main():
host = ''
port = int(sys.argv[1])
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(host, port)
s.listen(BACKLOG)
except socket.error, (value, message):
if s:
s.close()
print 'could not open socket', message
sys.exit(1)
while 1:
conn, client_addr = s.accept()
thread.start_new_thread(proxy_thread, (conn, client_addr))
s.close()
def proxy_thread(conn, client_addr):
request = conn.recv(MAX_DATA_RECV)
print 'request'
print requst
print 'end'
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()
import os, sys, thread
#, socket
import gevent
from gevent import socket
BACKLOG = 50
MAX_DATA_RECV = 4096
DEBUG = False
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)
except socket.error, (value, message):
if s:
s.close()
print 'could not open socket', message
sys.exit(1)
while 1:
conn, client_addr = s.accept()
print 'accept connection'
#thread.start_new_thread(proxy_thread, (conn, client_addr))
gevent.spawn(proxy_thread, conn, client_addr)
s.close()
def proxy_thread(conn, client_addr):
request = conn.recv(MAX_DATA_RECV)
print 'request'
print request
print 'end'
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