国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 幫助中心 > 正文

一個簡單的Golang實現的HTTP Proxy方法

2024-07-09 22:40:31
字體:
來源:轉載
供稿:網友

最近因為換了Mac,以前的Linux基本上不再使用了,但是我的SS代理還得用。SS代理大家都了解,一個很NB的socks代理工具,但是就是因為他是Socks的,想用HTTP代理的時候很不方便。

以前在Linux下的時候,會安裝一個Privoxy把socks代理轉換為HTTP代理,開機啟動,也比較方便。但是Mac下使用Brew安裝的Privoxy就很難用,再加上以前一個有個想法,一個軟件搞定socks和HTTP代理,這樣就不用安裝一個單獨的軟件做轉換了。

想著就開始做吧,以前基本上沒有搞過太多的網絡編程,最近也正好在研究Go,正好練練手。

我們這里主要講使用HTTP/1.1協議中的CONNECT方法建立起來的隧道連接,實現的HTTP Proxy。這種代理的好處就是不用知道客戶端請求的數據,只需要原封不動的轉發就可以了,對于處理HTTPS的請求就非常方便了,不用解析他的內容,就可以實現代理。

啟動代理監聽

要想做一個HTTP Proxy,我們需要啟動一個服務器,監聽一個端口,用于接收客戶端的請求。Golang給我們提供了強大的net包供我們使用,我們啟動一個代理服務器監聽非常方便。

  l, err := net.Listen("tcp", ":8080")  if err != nil {    log.Panic(err)  }

以上代理我們就實現了一個在8080端口上監聽的服務器,我們這里沒有寫ip地址,默認在所有ip地址上進行監聽。如果你只想本機適用,可以使用127.0.0.1:8080,這樣機器就訪問不了你的代理服務器了。

監聽接收代理請求

啟動了代理服務器,就可以開始接受不了代理請求了,有了請求,我們才能做進一步的處理。

  for {    client, err := l.Accept()    if err != nil {      log.Panic(err)    }    go handleClientRequest(client)  }

Listener接口的Accept方法,會接受客戶端發來的連接數據,這是一個阻塞型的方法,如果客戶端沒有連接數據發來,他就是阻塞等待。接收來的連接數據,會馬上交給handleClientRequest方法進行處理,這里使用一個go關鍵字開一個goroutine的目的是不阻塞客戶端的接收,代理服務器可以馬上接收下一個連接請求。

解析請求,獲取要訪問的IP和端口

有了客戶端的代理請求了,我們還得從請求里提取客戶端要訪問的遠程主機的IP和端口,這樣我們的代理服務器才可以建立和遠程主機的連接,代理轉發。

HTTP協議的頭信息里就包含有我們需要的主機名(IP)和端口信息,并且是明文的,協議很規范,類似于:

CONNECT www.google.com:443 HTTP/1.1Host: www.google.com:443Proxy-Connection: keep-aliveUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36

可以看到我們需要的在第一行,第一個行的信息以空格分開,第一部分CONNECT是請求方法,這里是CONNECT,除此之外還有GET,POST等,都是HTTP協議的標準方法。

第二部分是URL,https的請求只有host和port,http的請求是一個完成的url,等下會看個樣例,就明白了。

第三部是HTTP的協議和版本,這個我們不用太關注。

以上是一個https的請求,我們看下http的:

GET http://www.flysnow.org/ HTTP/1.1Host: www.flysnow.orgProxy-Connection: keep-aliveUpgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36

可以看到htt的,沒有端口號(默認是80);比https多了schame

主站蜘蛛池模板: 龙州县| 玛沁县| 安国市| 江都市| 靖宇县| 游戏| 苗栗县| 陕西省| 沿河| 四平市| 壤塘县| 芒康县| 鄂尔多斯市| 乐清市| 高邑县| 台南市| 呼图壁县| 柞水县| 乐陵市| 新巴尔虎左旗| 滕州市| 新营市| 余姚市| 江川县| 新民市| 齐齐哈尔市| 莲花县| 彭州市| 大同市| 高碑店市| 个旧市| 晋江市| 嵊州市| 宁武县| 阿拉尔市| 华坪县| 聂拉木县| 青铜峡市| 青海省| 双峰县| 牟定县|