简单的proxy之TinyHTTPProxy.py

如果是在外企工作的话,可以访问美国的机器,这样就可以在美国的机器上为自己装个proxy,然后本地就可以很容易的使用proxy来上网了。

TinyHTTPProxy.py :

主页:http://www.voidtrance.net/2010/01/simple-python-http-proxy/ 
下载:http://www.voidtrance.net/downloads/tiny-proxy-0.3.1.tar.gz

使用方法:

1)很好用,下载然后在后台运行。只依赖于基本的python modules,运行的时候不需要root权限。

proxy [-p port] [-l logfile] [-dh] [allowed_client_name ...]]-p   - Port to bind to-l   - Path to logfile. If not specified, STDOUT is used-d   - Run in the background

  

2) Chrome中的switchsharper插件的配置:

TinyHTTPProxy.py的源代码:

#!/usr/bin/python__doc__ = """Tiny HTTP Proxy.This module implements GET, HEAD, POST, PUT and DELETE methods
on BaseHTTPServer, and behaves as an HTTP proxy.  The CONNECT
method is also implemented experimentally, but has not been
tested yet.Any help will be greatly appreciated.       SUZUKI Hisao2009/11/23 - Modified by Mitko Haralanov* Added very simple FTP file retrieval* Added custom logging methods* Added code to make this a standalone application
"""__version__ = "0.3.1"import BaseHTTPServer, select, socket, SocketServer, urlparse
import logging
import logging.handlers
import getopt
import sys
import os
import signal
import threading
from types import FrameType, CodeType
from time import sleep
import ftplibDEFAULT_LOG_FILENAME = "proxy.log"class ProxyHandler (BaseHTTPServer.BaseHTTPRequestHandler):__base = BaseHTTPServer.BaseHTTPRequestHandler__base_handle = __base.handleserver_version = "TinyHTTPProxy/" + __version__rbufsize = 0                        # self.rfile Be unbuffereddef handle(self):(ip, port) =  self.client_addressself.server.logger.log (logging.INFO, "Request from '%s'", ip)if hasattr(self, 'allowed_clients') and ip not in self.allowed_clients:self.raw_requestline = self.rfile.readline()if self.parse_request(): self.send_error(403)else:self.__base_handle()def _connect_to(self, netloc, soc):i = netloc.find(':')if i >= 0:host_port = netloc[:i], int(netloc[i+1:])else:host_port = netloc, 80self.server.logger.log (logging.INFO, "connect to %s:%d", host_port[0], host_port[1])try: soc.connect(host_port)except socket.error, arg:try: msg = arg[1]except: msg = argself.send_error(404, msg)return 0return 1def do_CONNECT(self):soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)try:if self._connect_to(self.path, soc):self.log_request(200)self.wfile.write(self.protocol_version +" 200 Connection established\r\n")self.wfile.write("Proxy-agent: %s\r\n" % self.version_string())self.wfile.write("\r\n")self._read_write(soc, 300)finally:soc.close()self.connection.close()def do_GET(self):(scm, netloc, path, params, query, fragment) = urlparse.urlparse(self.path, 'http')if scm not in ('http', 'ftp') or fragment or not netloc:self.send_error(400, "bad url %s" % self.path)returnsoc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)try:if scm == 'http':if self._connect_to(netloc, soc):self.log_request()soc.send("%s %s %s\r\n" % (self.command,urlparse.urlunparse(('', '', path,params, query,'')),self.request_version))self.headers['Connection'] = 'close'del self.headers['Proxy-Connection']for key_val in self.headers.items():soc.send("%s: %s\r\n" % key_val)soc.send("\r\n")self._read_write(soc)elif scm == 'ftp':# fish out user and password informationi = netloc.find ('@')if i >= 0:login_info, netloc = netloc[:i], netloc[i+1:]try: user, passwd = login_info.split (':', 1)except ValueError: user, passwd = "anonymous", Noneelse: user, passwd ="anonymous", Noneself.log_request ()try:ftp = ftplib.FTP (netloc)ftp.login (user, passwd)if self.command == "GET":ftp.retrbinary ("RETR %s"%path, self.connection.send)ftp.quit ()except Exception, e:self.server.logger.log (logging.WARNING, "FTP Exception: %s",e)finally:soc.close()self.connection.close()def _read_write(self, soc, max_idling=20, local=False):iw = [self.connection, soc]local_data = ""ow = []count = 0while 1:count += 1(ins, _, exs) = select.select(iw, ow, iw, 1)if exs: breakif ins:for i in ins:if i is soc: out = self.connectionelse: out = socdata = i.recv(8192)if data:if local: local_data += dataelse: out.send(data)count = 0if count == max_idling: breakif local: return local_datareturn Nonedo_HEAD = do_GETdo_POST = do_GETdo_PUT  = do_GETdo_DELETE=do_GETdef log_message (self, format, *args):self.server.logger.log (logging.INFO, "%s %s", self.address_string (),format % args)def log_error (self, format, *args):self.server.logger.log (logging.ERROR, "%s %s", self.address_string (),format % args)class ThreadingHTTPServer (SocketServer.ThreadingMixIn,BaseHTTPServer.HTTPServer):def __init__ (self, server_address, RequestHandlerClass, logger=None):BaseHTTPServer.HTTPServer.__init__ (self, server_address,RequestHandlerClass)self.logger = loggerdef logSetup (filename, log_size, daemon):logger = logging.getLogger ("TinyHTTPProxy")logger.setLevel (logging.INFO)if not filename:if not daemon:# display to the screenhandler = logging.StreamHandler ()else:handler = logging.handlers.RotatingFileHandler (DEFAULT_LOG_FILENAME,maxBytes=(log_size*(1<<20)),backupCount=5)else:handler = logging.handlers.RotatingFileHandler (filename,maxBytes=(log_size*(1<<20)),backupCount=5)fmt = logging.Formatter ("[%(asctime)-12s.%(msecs)03d] ""%(levelname)-8s {%(name)s %(threadName)s}"" %(message)s","%Y-%m-%d %H:%M:%S")handler.setFormatter (fmt)logger.addHandler (handler)return loggerdef usage (msg=None):if msg: print msgprint sys.argv[0], "[-p port] [-l logfile] [-dh] [allowed_client_name ...]]"printprint "   -p       - Port to bind to"print "   -l       - Path to logfile. If not specified, STDOUT is used"print "   -d       - Run in the background"printdef handler (signo, frame):while frame and isinstance (frame, FrameType):if frame.f_code and isinstance (frame.f_code, CodeType):if "run_event" in frame.f_code.co_varnames:frame.f_locals["run_event"].set ()returnframe = frame.f_backdef daemonize (logger):class DevNull (object):def __init__ (self): self.fd = os.open ("/dev/null", os.O_WRONLY)def write (self, *args, **kwargs): return 0def read (self, *args, **kwargs): return 0def fileno (self): return self.fddef close (self): os.close (self.fd)class ErrorLog:def __init__ (self, obj): self.obj = objdef write (self, string): self.obj.log (logging.ERROR, string)def read (self, *args, **kwargs): return 0def close (self): passif os.fork () != 0:## allow the child pid to instanciate the server## classsleep (1)sys.exit (0)os.setsid ()fd = os.open ('/dev/null', os.O_RDONLY)if fd != 0:os.dup2 (fd, 0)os.close (fd)null = DevNull ()log = ErrorLog (logger)sys.stdout = nullsys.stderr = logsys.stdin = nullfd = os.open ('/dev/null', os.O_WRONLY)#if fd != 1: os.dup2 (fd, 1)os.dup2 (sys.stdout.fileno (), 1)if fd != 2: os.dup2 (fd, 2)if fd not in (1, 2): os.close (fd)def main ():logfile = Nonedaemon  = Falsemax_log_size = 20port = 8000allowed = []run_event = threading.Event ()local_hostname = socket.gethostname ()try: opts, args = getopt.getopt (sys.argv[1:], "l:dhp:", [])except getopt.GetoptError, e:usage (str (e))return 1for opt, value in opts:if opt == "-p": port = int (value)if opt == "-l": logfile = valueif opt == "-d": daemon = not daemonif opt == "-h":usage ()return 0# setup the log filelogger = logSetup (logfile, max_log_size, daemon)if daemon:daemonize (logger)signal.signal (signal.SIGINT, handler)if args:allowed = []for name in args:client = socket.gethostbyname(name)allowed.append(client)logger.log (logging.INFO, "Accept: %s (%s)" % (client, name))ProxyHandler.allowed_clients = allowedelse:logger.log (logging.INFO, "Any clients will be served...")server_address = (socket.gethostbyname (local_hostname), port)ProxyHandler.protocol = "HTTP/1.0"httpd = ThreadingHTTPServer (server_address, ProxyHandler, logger)sa = httpd.socket.getsockname ()print "Servering HTTP on", sa[0], "port", sa[1]req_count = 0while not run_event.isSet ():try:httpd.handle_request ()req_count += 1if req_count == 1000:logger.log (logging.INFO, "Number of active threads: %s",threading.activeCount ())req_count = 0except select.error, e:if e[0] == 4 and run_event.isSet (): passelse:logger.log (logging.CRITICAL, "Errno: %d - %s", e[0], e[1])logger.log (logging.INFO, "Server shutdown")return 0if __name__ == '__main__':sys.exit (main ())

  

其他的python proxy:
https://github.com/senko/tornado-proxy

完!

转载于:https://www.cnblogs.com/itech/p/3800590.html

简单的proxy之TinyHTTPProxy.py相关推荐

  1. Python小型web服务 web.py 简单教程

    最近有个项目需要通过Java调用Python的服务,有考虑过gRPC,那是一个很好的框架,通信效率高.但是基于够用就好的原则,决定选择使用简单的HTTP通信方式,Python建立服务器,公开JSON ...

  2. 试着用Proxy 实现一个简单mvvm

    Proxy.Reflect的简单概述 Proxy 可以理解成,在目标对象之前架设一层"拦截",外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤 ...

  3. sqlmap mysql案例_sqlmap简单mysql注入演示附截图

    安装教程百度一下就有了. 首先下载需要的文件,如果是windows环境直接到 看大牛的视频,学习一下,附上截图....算是转载吧...只是为了分享一下.. 下边是实例: sqlmap.py -upda ...

  4. python开发网络小工具_Python 实现简单网络应用程序开发

    最后一次更新于 2019/07/10 ICMP Ping 目的 此任务是重新创建第3讲(延迟,丢失和吞吐量)中讨论的ping客户端. Ping 是一个用于在计算机网络中测量延迟和丢失的工具. 在实际应 ...

  5. keras 的 example 文件 mnist_cnn.py 解析

    mnist_cnn.py 基本上就是最简单的一个卷积神经网络了,其结构如下: _____________________________________________________________ ...

  6. Plotly可视化输出数据表格(table):简单表格、添加链接的表格

    Plotly可视化输出数据表格(table):简单表格.添加链接的表格 # 可视化输出简单表格 import plotly as py import plotly.figure_factory as ...

  7. 初涉c#设计模式-proxy pattern-从中国足球黑哨开始

    好吧,这次的设计模式,我从最爱的足球谈起. 嗯,球员不是演员,想要行贿球员好比门将放球进去,这样演起来真的挺难,但作为裁判,对于一些争议性的问题,往往可以通过一些手段让他"看清"到 ...

  8. python py生成及调用pyc文件

    本文仅供学习交流使用,如侵立删!demo下载见文末 python py文件中调用pyc文件 1.生成pyc文件 # 目录下所有py文件生成pyc import compileall compileal ...

  9. Python中使用cutecharts实现简单的手绘风格的图表

    场景 效果 cutecharts的Github: https://github.com/chenjiandongx/cutecharts 注: 博客: https://blog.csdn.net/ba ...

最新文章

  1. Java EE 开发环境搭建
  2. android 解决ListView点击与滑动事件冲突
  3. mysql 5.7.16默认密码_(转)Ubuntu16安装mysql5.7未提示输入密码,安装后修改mysql默认密码...
  4. 关于计算机编码的笔记
  5. java线程基础巩固---线程生命周期以及start方法源码剖析
  6. JavaScript ES6对Proxy的原生支持的一个例子:开发人员学习额外的编程语言
  7. Kotlin 基础语法
  8. 【转】C++中的static_cast ,reinterpret_cast的用法和区别
  9. 阿里巴巴大数据实践:OneData模型实施介绍
  10. VNC客户端连接MacOS时一闪而过的解决办法
  11. 【通俗易懂】手把手带你实现DeepFM!
  12. openssl,加密,解密,https
  13. Linux下的微秒级定时器: usleep, nanosleep, select, pselect
  14. 芝加哥计算机科学硕士录取难度,美国cs研究生申请难度有多大?
  15. Tornado请求分析request, 获取请求参数
  16. sharepoint 2010 在线打开office时报错
  17. javascript单例模式【转载】
  18. WCF系列教程之WCF服务宿主与WCF服务部署
  19. java版Spring Cloud+VR全景+直播短视频带货+三级分销+b2b2c多商家入驻前后端分离商城源码
  20. DSP2812之中断系统

热门文章

  1. Oracle Sqlplus命令登录的几种方式
  2. 毕业设计Spring boot问题记录(后端三):java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax;
  3. 【资源】OpenCV3编程入门_毛星云
  4. VS2017MFC发布打包
  5. Android平台 Target API level 升级到 31,在Android 12上启动黑屏卡死
  6. Hadoop生态圈(十三)- Namenode元数据管理及各组件工作机制
  7. python高级应用_Python高级应用程序设计任务
  8. 第一章:基于Visual C++ 6.0使用运动控制卡控制电机转动实验操作指导
  9. linux 删除IP地址
  10. 使用OpenCV实现Halcon算法(1)亚像素提取边缘,Sub-Pixel Edge Detector