http proxy

有時在內(nèi)網(wǎng)無法訪問外網(wǎng)資源 泳猬, 但有些應(yīng)用如conda pip yum 需要在線更新制轰,本例使用一臺有兩網(wǎng)卡的機器(同時上內(nèi)外網(wǎng))作為代理灯谣,為內(nèi)網(wǎng)提供在線更新服務(wù)。 (在內(nèi)網(wǎng)機器隔離比較嚴格的場景不推薦使用G)

使用python做簡單的http代理疾捍, 支持CONNECT 和GET方法, 支持http 和 https 栏妖。


import urllib.parse
import socket 
import select 
from http.server import BaseHTTPRequestHandler, HTTPServer
from socketserver import ThreadingMixIn
import sys

class MyHandler(BaseHTTPRequestHandler):
    def do_CONNECT(self):
        
        print('CONNECT:',self.client_address,self.requestline, self.headers)

        uri = self.path
        print("url:", uri)
        host,port = urllib.parse.splittype(uri)

        address = (host, port or 443)
        
        try:
            targetconn = socket.create_connection(address=address)
        except socket.error:
            self.send_error(504)
            return 
        
        self.send_response(200, 'Connection Established')
        self.send_header('Connection', 'close')
        self.end_headers()
        
        conns = [self.connection, targetconn]
        
        keep_connection = True 
        while(keep_connection):
            keep_connection = False
            rlist, wlist, xlist = select.select(conns, [], conns, self.timeout)
            if (xlist):
                break
            for r in rlist:
                other = conns[1] if r is conns[0] else conns[0]
                data = r.recv(8192)
                if (data):
                    other.sendall(data)
                    keep_connection = True
        
        targetconn.close()
        print("Connect end!========================",self.client_address)
        
    def do_GET(self):
        print('GET:',self.client_address,self.requestline, self.headers)
        uri = self.path
        print("url:", uri)
        protocol,rest = urllib.parse.splittype(uri)
        print("protocol:", protocol)
        host,rest = urllib.parse.splithost(rest)
        
        print("host:", host) 
        
        path = rest
        
        print("Path:", path)
        
        if (path is None or len(path) == 0):
            path = '/'
        
        host,port = urllib.parse.splitnport(host)
        
        print("host:", host)
        port = 80 if port < 0 else port
        
        host_ip = socket.gethostbyname(host)
        
        print(host_ip, port)
        
        # print("headers:", self.headers)
        
        send_data = 'GET ' + path + ' ' + self.protocol_version + '\r\n' 
        
        head = ''
        for key, val in self.headers.items():
            head = head + "%s: %s\r\n" % (key,val)
        send_data = send_data + head + '\r\n' 
        
        print("send_data:" , send_data) 
        
        client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        client.connect((host_ip,port))
        client.send(send_data.encode('utf-8'))
        
        data = bytes()
        
        while True:
            tmp = client.recv(8192)
            if not tmp:
                break
            data = data + tmp
            
        client.close()
        # print("resData:", data)
        print("resData len:", len(data))
        self.wfile.write(data)
        
        print('GET end ! =====================',self.client_address)

class MyHttpServer(ThreadingMixIn, HTTPServer):
    pass


def main(ip, port):
    try:
        server = MyHttpServer((ip, port), MyHandler)
        print('Welcome to the machine...')
        server.serve_forever()
    except KeyboardInterrupt:
        print('^C received, shutting down server')
        server.socket.close()

if __name__ == '__main__':
    # main()
    
    if (len(sys.argv) == 3):
        for arg in sys.argv:
            print(arg)
    else:
        print("Error, arguments less!")
        print("Usage: python httpProxy.py ip  port ")
        sys.exit()
    
    ip = sys.argv[1]
    port = int(sys.argv[2])
    
    print("Starting proxy at ", ip, port )
    main(ip,port)

https CONNECT

CONNECT 用于建立通道乱豆,后續(xù)將使用建立的通道進行通信 。
在收到CONNECT請求時 吊趾, 回復(fù)客戶端 200 宛裕, ‘Connection Established’ 瑟啃。
然后與目標(biāo)服務(wù)器建立連接,CONNECT頭中有host和端口(即目標(biāo)服務(wù)器的主機和端口)揩尸。
監(jiān)控與客戶端和目標(biāo)服務(wù)器的連接socket 蛹屿,當(dāng)有讀事件時, 讀取之然后發(fā)送出去岩榆;
客戶端--》 proxy --》 目標(biāo)服務(wù)器错负;
目標(biāo)服務(wù)器 --》 proxy --》 客戶端 ;

select 的使用

select.select(讀列表勇边, 寫列表湿颅, 執(zhí)行列表, timeout)

循環(huán)處理準(zhǔn)備好的讀寫執(zhí)行列表粥诫, 執(zhí)行相應(yīng)操作。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末崭庸,一起剝皮案震驚了整個濱河市怀浆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怕享,老刑警劉巖执赡,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異函筋,居然都是意外死亡沙合,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門跌帐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來首懈,“玉大人,你說我怎么就攤上這事谨敛【柯模” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵脸狸,是天一觀的道長最仑。 經(jīng)常有香客問我,道長炊甲,這世上最難降的妖魔是什么泥彤? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮卿啡,結(jié)果婚禮上吟吝,老公的妹妹穿的比我還像新娘。我一直安慰自己牵囤,他們只是感情好爸黄,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布滞伟。 她就那樣靜靜地躺著,像睡著了一般炕贵。 火紅的嫁衣襯著肌膚如雪梆奈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天称开,我揣著相機與錄音亩钟,去河邊找鬼。 笑死鳖轰,一個胖子當(dāng)著我的面吹牛清酥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蕴侣,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼焰轻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了昆雀?” 一聲冷哼從身側(cè)響起辱志,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狞膘,沒想到半個月后揩懒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡挽封,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年已球,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辅愿。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡智亮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出渠缕,到底是詐尸還是另有隱情鸽素,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布亦鳞,位于F島的核電站馍忽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏燕差。R本人自食惡果不足惜遭笋,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望徒探。 院中可真熱鬧瓦呼,春花似錦、人聲如沸测暗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至质和,卻和暖如春稳摄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背饲宿。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工厦酬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瘫想。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓仗阅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親国夜。 傳聞我的和親對象是個殘疾皇子减噪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)车吹,斷路器旋廷,智...
    卡卡羅2017閱讀 134,664評論 18 139
  • 前言 nginx服務(wù)也支持代理服務(wù),其代理功能的實現(xiàn)是通過ngx_http_proxy_module此模塊來實現(xiàn)的...
    小尛酒窩閱讀 2,985評論 0 1
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,988評論 6 13
  • 梨樹吐了幾朵花 在時間里埋下淺白色的情話 我守著泛黃的信紙 看月兒一次次回家 直到風(fēng)吹走了風(fēng) 時間讓梨花里的記憶也...
    晚顰閱讀 168評論 0 7
  • 一寸光陰一寸金礼搁,寸金難買寸光陰。每個人擁有的時間有限目尖,除了工作馒吴,還有生活,沒有人希望下班時還要面對無窮盡的工作瑟曲。提...
    妙筆糖人閱讀 2,346評論 1 0