国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

go http-proxy

這篇具有很好參考價(jià)值的文章主要介紹了go http-proxy。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

????????我們這里主要講使用HTTP/1.1協(xié)議中的CONNECT方法建立起來(lái)的隧道連接,實(shí)現(xiàn)的HTTP Proxy。這種代理的好處就是不用知道客戶端請(qǐng)求的數(shù)據(jù),只需要原封不動(dòng)的轉(zhuǎn)發(fā)就可以了,對(duì)于處理HTTPS的請(qǐng)求就非常方便了,不用解析他的內(nèi)容,就可以實(shí)現(xiàn)代理。

  • 啟動(dòng)代理監(jiān)聽

????????要想做一個(gè)HTTP Proxy,我們需要啟動(dòng)一個(gè)服務(wù)器,監(jiān)聽一個(gè)端口,用于接收客戶端的請(qǐng)求。Golang給我們提供了強(qiáng)大的net包供我們使用,我們啟動(dòng)一個(gè)代理服務(wù)器監(jiān)聽非常方便。

l, err := net.Listen("tcp", ":8080") 

if err != nil {

    log.Panic(err)

}

????????以上代理我們就實(shí)現(xiàn)了一個(gè)在8080端口上監(jiān)聽的服務(wù)器,我們這里沒有寫ip地址,默認(rèn)在所有ip地址上進(jìn)行監(jiān)聽。如果你只想本機(jī)適用,可以使用127.0.0.1:8080,這樣機(jī)器就訪問不了你的代理服務(wù)器了。

  • 監(jiān)聽接收代理請(qǐng)求

????????啟動(dòng)了代理服務(wù)器,就可以開始接受不了代理請(qǐng)求了,有了請(qǐng)求,我們才能做進(jìn)一步的處理。

for {

    client, err := l.Accept() 
    if err != nil {

        log.Panic(err)

    } 

    go handleClientRequest(client)

}

????????Listener接口的Accept方法,會(huì)接受客戶端發(fā)來(lái)的連接數(shù)據(jù),這是一個(gè)阻塞型的方法,如果客戶端沒有連接數(shù)據(jù)發(fā)來(lái),他就是阻塞等待。接收來(lái)的連接數(shù)據(jù),會(huì)馬上交給handleClientRequest方法進(jìn)行處理,這里使用一個(gè)go關(guān)鍵字開一個(gè)goroutine的目的是不阻塞客戶端的接收,代理服務(wù)器可以馬上接收下一個(gè)連接請(qǐng)求。

  • 解析請(qǐng)求,獲取要訪問的IP和端口

????????有了客戶端的代理請(qǐng)求了,我們還得從請(qǐng)求里提取客戶端要訪問的遠(yuǎn)程主機(jī)的IP和端口,這樣我們的代理服務(wù)器才可以建立和遠(yuǎn)程主機(jī)的連接,代理轉(zhuǎn)發(fā)。

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

CONNECT www.google.com:443 HTTP/1.1

Host: www.google.com:443

Proxy-Connection: keep-alive

User-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

????????可以看到我們需要的在第一行,第一個(gè)行的信息以空格分開,第一部分CONNECT是請(qǐng)求方法,這里是CONNECT,除此之外還有GET,POST等,都是HTTP協(xié)議的標(biāo)準(zhǔn)方法。

????????第二部分是URL,https的請(qǐng)求只有host和port,http的請(qǐng)求是一個(gè)完成的url,等下會(huì)看個(gè)樣例,就明白了。

????????第三部是HTTP的協(xié)議和版本,這個(gè)我們不用太關(guān)注。

????????以上是一個(gè)https的請(qǐng)求,我們看下http的:

GET http://www.flysnow.org/ HTTP/1.1

Host: www.flysnow.org

Proxy-Connection: keep-alive

Upgrade-Insecure-Requests: 1

User-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的,沒有端口號(hào)(默認(rèn)是80);比https多了schame—http://。

有了分析,下面我們就可以從HTTP頭信息中獲取請(qǐng)求的url和method信息了。

var b [1024]byte

n, err := client.Read(b[:]) 
if err != nil {

    log.Println(err) return

} 
var method, host, address string

fmt.Sscanf(string(b[:bytes.IndexByte(b[:], '\n')]), "%s%s", &method, &host)

hostPortURL, err := url.Parse(host) 

if err != nil {

    log.Println(err) return

}

然后需要進(jìn)一步對(duì)url進(jìn)行解析,獲取我們需要的遠(yuǎn)程服務(wù)器信息

if hostPortURL.Opaque == "443" { //https訪問

    address = hostPortURL.Scheme + ":443"

} else { //http訪問

    if strings.Index(hostPortURL.Host, ":") == -1 { //host不帶端口, 默認(rèn)80

    address = hostPortURL.Host + ":80"

} else {

    address = hostPortURL.Host

}

這樣就完整了獲取了要請(qǐng)求服務(wù)器的信息,他們可能是以下幾種格式

ip:port

hostname:port

domainname:port

就是有可能是ip(v4orv6),有可能是主機(jī)名(內(nèi)網(wǎng)),有可能是域名(dns解析)

  • 代理服務(wù)器和遠(yuǎn)程服務(wù)器建立連接

有了遠(yuǎn)程服務(wù)器的信息了,就可以進(jìn)行撥號(hào)建立連接了,有了連接,才可以通信。

//獲得了請(qǐng)求的host和port,就開始撥號(hào)吧

server, err := net.Dial("tcp", address) 

if err != nil {

    log.Println(err) return

}

數(shù)據(jù)轉(zhuǎn)發(fā)

撥號(hào)成功后,就可以進(jìn)行數(shù)據(jù)代理傳輸了

if method == "CONNECT" {

????????fmt.Fprint(client, "HTTP/1.1 200 Connection established\r\n")

} else {

????????server.Write(b[:n])

} //進(jìn)行轉(zhuǎn)發(fā)

go io.Copy(server, client)

io.Copy(client, server)

其中對(duì)CONNECT方法有單獨(dú)的回應(yīng),客戶端說(shuō)要建立連接,代理服務(wù)器要回應(yīng)建立好了,然后才可以像HTTP一樣請(qǐng)求訪問。

完整代碼

到這里,我們的代理服務(wù)器全部開發(fā)完成了,下面是完整的源代碼:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-691157.html

package main

import ( 

    "bytes"
    "fmt"
    "io"
    "log"
    "net"
    "net/url"
    "strings")
func main() {

    log.SetFlags(log.LstdFlags|log.Lshortfile)

    l, err := net.Listen("tcp", ":8081") 
    if err != nil {

    log.Panic(err)
    
    } 

    for {

    client, err := l.Accept() 
        if err != nil {

        log.Panic(err)

    } 
    go handleClientRequest(client)

    }

}


func handleClientRequest(client net.Conn) { 

    if client == nil { 
        return

    } 
    defer client.Close() 
    var b [1024]byte

    n, err := client.Read(b[:]) 
    if err != nil {

    log.Println(err) 
    return

    } 
    var method, host, address string

    fmt.Sscanf(string(b[:bytes.IndexByte(b[:], '\n')]), "%s%s", &method, &host)

    hostPortURL, err := url.Parse(host) 
    if err != nil {

        log.Println(err) return

    } 
    if hostPortURL.Opaque == "443" { //https訪問

        address = hostPortURL.Scheme + ":443"

    } else { //http訪問

    if strings.Index(hostPortURL.Host, ":") == -1 { //host不帶端口, 默認(rèn)80

        address = hostPortURL.Host + ":80"

    } else {

    address = hostPortURL.Host

    }

    } 
    //獲得了請(qǐng)求的host和port,就開始撥號(hào)吧
    server, err := net.Dial("tcp", address) 
    if err != nil {

        log.Println(err) return

    } 
    if method == "CONNECT" {

        fmt.Fprint(client, "HTTP/1.1 200 Connection established\r\n")

    } else {

        server.Write(b[:n])

    } //進(jìn)行轉(zhuǎn)發(fā)

    go io.Copy(server, client)

    io.Copy(client, server)

}

到了這里,關(guān)于go http-proxy的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Golang原生實(shí)現(xiàn)JA3指紋修改,并支持Proxy代理

    抓取某個(gè)HTTPS網(wǎng)站的時(shí)候 開啟charles代理能夠抓取成功,關(guān)閉被風(fēng)控 通過(guò)檢測(cè),懷疑可能是tls的時(shí)候有區(qū)別 golang的http中,Transport.TLSClientConfig是可以自定義設(shè)置的 但起初通過(guò)隨意設(shè)置并不能繞過(guò)風(fēng)控 使用golang的http客戶端,修改DialTLSContext函數(shù)的方式是可以實(shí)繞過(guò)風(fēng)控,但使用proxy的

    2024年02月13日
    瀏覽(20)
  • HTTP Proxy Demo代碼示例

    這里提供一個(gè)Python實(shí)現(xiàn)的HTTP Proxy Demo代碼示例: 以上代碼實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的HTTP代理服務(wù)器,能夠?qū)崿F(xiàn)轉(zhuǎn)發(fā)客戶端的請(qǐng)求,并將目標(biāo)服務(wù)器的響應(yīng)轉(zhuǎn)發(fā)給客戶端。當(dāng)客戶端請(qǐng)求到達(dá)代理服務(wù)器時(shí),代理服務(wù)器會(huì)將其轉(zhuǎn)發(fā)到目標(biāo)服務(wù)器上,然后將目標(biāo)服務(wù)器的響應(yīng)返回給客戶端

    2024年02月11日
    瀏覽(25)
  • Docker設(shè)置http proxy代理

    Docker設(shè)置http proxy代理

    需求: 由于公司服務(wù)器無(wú)法正常訪問公網(wǎng),想要下載一些外部依賴包需要配置公司的內(nèi)部代理。 Docker構(gòu)建鏡像或拉取鏡像時(shí)需要通過(guò)代理訪問外網(wǎng),可以按照以下步驟設(shè)置HTTP代理 目錄 創(chuàng)建目錄 創(chuàng)建并編輯配置文件 重新加載Docker服務(wù)配置 重啟Docker服務(wù) 檢驗(yàn)是否加載配置

    2024年02月12日
    瀏覽(25)
  • HTTP Proxy Demo 代碼示例

    以下是一個(gè)簡(jiǎn)單的 HTTP Proxy Demo 代碼,使用 Python 3 編寫: ```python import socket def handle_request(client_socket): # 接收客戶端請(qǐng)求 request_data = client_socket.recv(1024) print(request_data.decode()) # 解析請(qǐng)求,獲取目標(biāo)主機(jī)和端口號(hào) first_line = request_data.decode().split(\\\'n\\\')[0] url = first_line.split(\\\' \\\')[1] hos

    2024年02月09日
    瀏覽(18)
  • docker如何設(shè)置http proxy代理

    如果您使用Docker構(gòu)建鏡像或拉取鏡像時(shí)需要使用代理,可以按照以下步驟設(shè)置HTTP代理: 創(chuàng)建或編輯Docker服務(wù)配置文件 如果您使用systemd管理Docker服務(wù),可以編輯該服務(wù)的配置文件 /etc/systemd/system/docker.service.d/http-proxy.conf 。如果文件不存在,可以創(chuàng)建該文件?;蛘呤?docker.ser

    2024年02月11日
    瀏覽(32)
  • java http請(qǐng)求設(shè)置代理 Proxy

    有如下一種需求,原本A要給C發(fā)送請(qǐng)求,但是因?yàn)榫W(wǎng)絡(luò)原因,需要借助B才能實(shí)現(xiàn),所以由原本的A-C變成了A-B-C。 這種情況,更多的見于內(nèi)網(wǎng)請(qǐng)求由統(tǒng)一的網(wǎng)關(guān)做代理然后轉(zhuǎn)發(fā)出去,比如你本地的機(jī)器想要對(duì)外上網(wǎng),都是通過(guò)運(yùn)營(yíng)商給的出口IP也就是公網(wǎng)地址實(shí)現(xiàn)的。這種做法

    2024年02月11日
    瀏覽(29)
  • Android Studio設(shè)置HTTP Proxy

    Android Studio設(shè)置HTTP Proxy

    之前在Android Studio我的設(shè)置的是電子科技大學(xué)的鏡像網(wǎng)站 但是已經(jīng)不管用了?。?! 所以就選擇自己設(shè)置代理 科學(xué)上網(wǎng)選擇全局模式, 復(fù)制終端代碼命令到終端查看,復(fù)制host和端口號(hào) Host和端口號(hào)填上即可

    2024年02月16日
    瀏覽(17)
  • Jmeter-使用http proxy代理錄制腳本

    Jmeter-使用http proxy代理錄制腳本

    Jmeter-使用http proxy代理錄制腳本 第1步:打卡jmeter工具新增1個(gè)線程組 第2步:給線程組添加1個(gè)HTTP請(qǐng)求默認(rèn)值 ? 第3步:設(shè)置下HTTP請(qǐng)求默認(rèn)值 第4步:在工作臺(tái)中新增1個(gè)----HTTP代理服務(wù)器 ? 第5步:設(shè)置HTTP代理服務(wù)器 設(shè)置完后記得點(diǎn)擊啟動(dòng) 第6步:瀏覽器設(shè)置(這里選擇ie瀏覽器

    2024年02月16日
    瀏覽(96)
  • 關(guān)于Android Studio Http Proxy設(shè)置

    關(guān)于Android Studio Http Proxy設(shè)置

    對(duì)敵人最大的蔑視就是沉默。--鹿丸 我們使用Android Studio? 開始構(gòu)建的時(shí)候會(huì)有卡頓的情況,甚至死機(jī),也就是所謂的【android studio】構(gòu)建卡住問題,如果依賴庫(kù)類都是國(guó)內(nèi)的,檢查是否開啟了代理 ? ?這個(gè)地方選擇下面的自動(dòng)代理 國(guó)內(nèi)有很多代理可以設(shè)置,下面這個(gè)親測(cè)有

    2024年02月12日
    瀏覽(28)
  • docker使用http_proxy配置代理

    docker使用http_proxy配置代理

    鋼鐵知識(shí)庫(kù),一個(gè)學(xué)習(xí)python爬蟲、數(shù)據(jù)分析的知識(shí)庫(kù)。人生苦短,快用python。 在內(nèi)網(wǎng)服務(wù)器中,docker經(jīng)常需要下載拉取鏡像,但由于沒有網(wǎng)絡(luò)要么只能手動(dòng)導(dǎo)入鏡像包,又或者通過(guò)http_proxy代理到其它服務(wù)器下載。 增加 http-proxy.conf 配置文件,正確配置好代理服務(wù)器后重啟d

    2024年01月22日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包