婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 一個簡單的Golang實現的HTTP Proxy方法

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

熱門標簽:廣州呼叫中心外呼系統 江西轉化率高的羿智云外呼系統 地圖標注的汽車標 中國地圖標注省會高清 西部云谷一期地圖標注 浙江高速公路地圖標注 南通如皋申請開通400電話 學海導航地圖標注 高德地圖標注口訣

最近因為換了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.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

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

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

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

以上是一個https的請求,我們看下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的,沒有端口號(默認是80);比https多了schame–http://。

有了分析,下面我們就可以從HTTP頭信息中獲取請求的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
  
  }

然后需要進一步對url進行解析,獲取我們需要的遠程服務器信息


  if hostPortURL.Opaque == "443" { //https訪問
    address = hostPortURL.Scheme + ":443"
  } else { //http訪問
    if strings.Index(hostPortURL.Host, ":") == -1 { //host不帶端口, 默認80
      address = hostPortURL.Host + ":80"
    } else {
      address = hostPortURL.Host
    }
  }

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

ip:port
hostname:port
domainname:port

就是有可能是ip(v4orv6),有可能是主機名(內網),有可能是域名(dns解析)

代理服務器和遠程服務器建立連接

有了遠程服務器的信息了,就可以進行撥號建立連接了,有了連接,才可以通信。

  //獲得了請求的host和port,就開始撥號吧
  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])
  }
  //進行轉發
  go io.Copy(server, client)
  io.Copy(client, server)

其中對CONNECT方法有單獨的回應,客戶端說要建立連接,代理服務器要回應建立好了,然后才可以像HTTP一樣請求訪問。

運行外國外VPS上

到這里,我們的代理服務器全部開發完成了,下面是完整的源代碼:

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不帶端口, 默認80
      address = hostPortURL.Host + ":80"
    } else {
      address = hostPortURL.Host
    }
  }

  //獲得了請求的host和port,就開始撥號吧
  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])
  }
  //進行轉發
  go io.Copy(server, client)
  io.Copy(client, server)
}

把源代碼編譯,然后放到你國外的VPS上,在自己機器上配置好HTTP代理,就可以到處訪問,自由自在了。

以上這篇一個簡單的Golang實現的HTTP Proxy方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Golang 實現分片讀取http超大文件流和并發控制
  • 解決golang處理http response碰到的問題和需要注意的點
  • golang實現http server提供文件下載功能
  • Golang 發送http請求時設置header的實現
  • golang使用http client發起get和post請求示例
  • 在 Golang 中實現一個簡單的Http中間件過程詳解

標簽:吐魯番 東營 保定 常州 許昌 德宏 貴州 曲靖

巨人網絡通訊聲明:本文標題《一個簡單的Golang實現的HTTP Proxy方法》,本文關鍵詞  一個,簡單,的,Golang,實現,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《一個簡單的Golang實現的HTTP Proxy方法》相關的同類信息!
  • 本頁收集關于一個簡單的Golang實現的HTTP Proxy方法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    极品销魂美女一区二区三区| 蜜臀av一区二区三区| 91精品久久久久久蜜臀| 欧美一区二区福利视频| 国产午夜精品美女毛片视频| 99久久久久免费精品国产| 欧美在线一二三四区| 日韩丝袜情趣美女图片| 国产精品麻豆欧美日韩ww| 亚洲免费观看视频| 美腿丝袜在线亚洲一区 | 日本伊人精品一区二区三区观看方式| 男女性色大片免费观看一区二区 | 色噜噜久久综合| 69久久99精品久久久久婷婷| 色猫猫国产区一区二在线视频| 日韩视频中午一区| 亚洲精品乱码久久久久久久久| 精品午夜一区二区三区在线观看| 日本久久精品电影| 国产欧美一区二区精品婷婷| 免费成人在线网站| 色综合久久88色综合天天免费| 久久这里都是精品| 美国欧美日韩国产在线播放| 91在线精品一区二区| 2022国产精品视频| 欧美aaaaaa午夜精品| 欧美羞羞免费网站| 亚洲久本草在线中文字幕| 国内久久婷婷综合| 日韩免费观看高清完整版 | 欧美一级高清大全免费观看| 中文字幕亚洲在| 福利一区二区在线观看| 欧美性猛交xxxx黑人交| 国产日韩欧美精品电影三级在线| 老司机一区二区| 欧美日韩美女一区二区| 亚洲一区成人在线| 91在线小视频| 国产精品福利av| 成人黄色在线网站| 中文在线一区二区| 成人av免费在线播放| 国产精品午夜免费| 粉嫩一区二区三区在线看| av爱爱亚洲一区| 亚洲色图欧美偷拍| 91在线观看高清| 亚洲v中文字幕| 日韩欧美亚洲国产精品字幕久久久| 免费在线欧美视频| 久久这里都是精品| 国产a视频精品免费观看| 国产精品不卡在线| 欧洲亚洲精品在线| 奇米影视7777精品一区二区| 日韩亚洲欧美高清| 国产成人精品aa毛片| 欧美极品少妇xxxxⅹ高跟鞋| 丁香婷婷综合五月| 亚洲激情图片小说视频| 欧美最猛性xxxxx直播| 日韩午夜精品视频| 国产精品一二三区在线| 亚洲日穴在线视频| 欧美高清视频不卡网| 老司机精品视频一区二区三区| 粉嫩av一区二区三区| 亚洲另类色综合网站| 欧美一级日韩不卡播放免费| 国产成人免费视频一区| 亚洲国产一区视频| 2022国产精品视频| 91网站最新网址| 看电视剧不卡顿的网站| 亚洲欧美激情插| 欧美成人vr18sexvr| 91污在线观看| 激情小说欧美图片| 亚洲伦理在线精品| 国产视频一区二区在线| 99精品国产99久久久久久白柏| 亚洲午夜精品17c| 欧美经典三级视频一区二区三区| 欧美另类videos死尸| 一区二区成人在线观看| 中文字幕精品综合| 狠狠色丁香久久婷婷综合_中| 亚洲精品免费在线| 国产精品美女久久久久高潮| 欧美一级午夜免费电影| 欧美在线一区二区三区| 九九国产精品视频| www激情久久| 日韩欧美三级在线| 欧洲精品中文字幕| 99精品欧美一区二区三区综合在线| 精品系列免费在线观看| 欧美精品 国产精品| 国产精品一区二区视频| 免费在线观看一区| 偷窥少妇高潮呻吟av久久免费| 久久精品免费在线观看| 欧美高清hd18日本| 欧美日韩国产影片| 激情六月婷婷久久| 色偷偷88欧美精品久久久| 国产在线一区二区| 51精品秘密在线观看| 经典三级在线一区| 91在线播放网址| 国产亚洲婷婷免费| 免费成人性网站| 欧美日韩国产成人在线91| 久久久久久久久一| 青青青爽久久午夜综合久久午夜| 9l国产精品久久久久麻豆| 精品福利一二区| 日本va欧美va欧美va精品| 91国内精品野花午夜精品| 亚洲欧洲av一区二区三区久久| 国产综合色在线视频区| 日韩欧美国产综合一区 | 伊人色综合久久天天人手人婷| 国内偷窥港台综合视频在线播放| 91精品国产福利| 视频在线在亚洲| 欧美人xxxx| 日本午夜精品一区二区三区电影| 91最新地址在线播放| 亚洲欧美视频在线观看视频| 成人a区在线观看| 日韩理论在线观看| 91在线观看免费视频| 亚洲激情自拍偷拍| 欧美精品第一页| 麻豆精品在线观看| 日韩一区二区麻豆国产| 日本欧美在线看| 欧美精品一区二区高清在线观看| 另类的小说在线视频另类成人小视频在线 | 色老汉一区二区三区| 亚洲欧美电影院| 在线观看日韩电影| 免费在线视频一区| 精品久久国产97色综合| 福利一区二区在线观看| 亚洲乱码国产乱码精品精小说| 欧美视频一区二区三区四区| 香港成人在线视频| 欧美不卡一区二区三区四区| 极品尤物av久久免费看| 国产精品福利一区| 欧美日韩午夜在线视频| 国产在线播放一区| 国产精品丝袜黑色高跟| 99精品偷自拍| 首页欧美精品中文字幕| 久久久噜噜噜久久人人看| www.爱久久.com| 午夜电影网一区| 久久综合成人精品亚洲另类欧美| a美女胸又www黄视频久久| 亚洲高清在线视频| 国产亚洲午夜高清国产拍精品| 91免费观看视频| 美女国产一区二区三区| 国产精品久久久久久久午夜片| 欧美色综合天天久久综合精品| 国产乱码精品一区二区三区五月婷| 亚洲丝袜自拍清纯另类| 日韩欧美另类在线| 欧美伊人久久久久久午夜久久久久| 免费高清视频精品| 亚洲品质自拍视频| 精品欧美乱码久久久久久1区2区| 成人精品免费视频| 免费人成网站在线观看欧美高清| 亚洲国产精品成人综合| 欧美精选一区二区| 91浏览器打开| 国内不卡的二区三区中文字幕| 亚洲欧美日韩久久精品| 久久中文娱乐网| 欧洲精品视频在线观看| 韩国v欧美v亚洲v日本v| 天天操天天综合网| 亚洲麻豆国产自偷在线| 精品国一区二区三区| 欧美日韩一区成人| 波多野结衣中文字幕一区二区三区| 日本怡春院一区二区| 中文字幕欧美一| 亚洲国产精品精华液ab| 久久久久免费观看| 日韩一区二区三区视频| 欧美色图激情小说| 色婷婷香蕉在线一区二区|