精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Golang 實現(xiàn)一個簡單的 http 代理

開發(fā) 后端
本文詳細介紹了Golang 實現(xiàn) http 代理的實現(xiàn),在實際業(yè)務中有需求的同學可以學起來了!

本文詳細介紹了Golang 實現(xiàn) http 代理的實現(xiàn),在實際業(yè)務中有需求的同學可以學起來了!

代理是網(wǎng)絡中的一項重要的功能,其功能就是代理網(wǎng)絡用戶去取得網(wǎng)絡信息。形象的說:它是網(wǎng)絡信息的中轉站,對于客戶端來說,代理扮演的是服務器的角色,接收請求報文,返回響應報文;對于 web 服務器來說,代理扮演的是客戶端的角色,發(fā)送請求報文,接收響應報文。

代理具有多種類型,如果是根據(jù)網(wǎng)絡用戶劃分的話,可以劃分為正向代理和反向代理:

  •  正向代理:將客戶端作為網(wǎng)絡用戶。客戶端訪問服務端時,先訪問代理服務器,隨后代理服務器再訪問服務端。此過程需客戶端進行代理配置,對服務端透明。
  •  反向代理:將服務端作為網(wǎng)絡用戶。訪問過程與正向代理相同,不過此過程對客戶端透明,需服務端進行代理配置(也可不配置)。

針對正向代理和反向代理,分別有不同的代理協(xié)議,即代理服務器和網(wǎng)絡用戶之間通信所使用的協(xié)議:

  •  正向代理:
    •  http
    •  https
    •  socks4
    •  socks5
  •  反向代理:
    •  tcp
    •  udp
    •  http
    •  https

接下來我們就說說 http 代理。

http 代理概述

http 代理是正向代理中較為簡單的代理方式,它使用 http 協(xié)議作為客戶端和代理服務器的傳輸協(xié)議。

http 代理可以承載 http 協(xié)議,https 協(xié)議,ftp 協(xié)議等等。對于不同的協(xié)議,客戶端和代理服務器間的數(shù)據(jù)格式略有不同。

http 協(xié)議

我們先來看看 http 協(xié)議下客戶端發(fā)送給代理服務器的 HTTP Header: 

  1. // 直接連接  
  2. GET / HTTP/1.1  
  3. Host: staight.github.io  
  4. Connection: keep-alive  
  5. // http 代理  
  6. GET http://staight.github.io/ HTTP/1.1  
  7. Host: staight.github.io  
  8. Proxy-Connection: keep-alive 

可以看到,http 代理比起直接連接:

  •  url 變成完整路徑,/->http://staight.github.io/
  •  Connection字段變成Proxy-Connection字段
  •  其余保持原樣

    為什么使用完整路徑?

為了識別目標服務器。如果沒有完整路徑,且沒有 Host 字段的話,代理服務器將無法得知目標服務器的地址。

為什么使用 Proxy-Connection 字段代替 Connection 字段?

為了兼容使用 HTTP/1.0 協(xié)議的過時的代理服務器。HTTP/1.1 才開始有長連接功能,直接連接的情況下,客戶端發(fā)送的 HTTP Header 中如果有Connection: keep-alive字段,表示使用長連接和服務端進行 http 通信,但如果中間有過時的代理服務器,該代理服務器將無法與客戶端和服務端進行長連接,造成客戶端和服務端一直等待,白白浪費時間。因此使用Proxy-Connection字段代替Connection字段,如果代理服務器使用 HTTP/1.1 協(xié)議,能夠識別Proxy-Connection字段,則將該字段轉換成Connection再發(fā)送給服務端;如果不能識別,直接發(fā)送給服務端,因為服務端也無法識別,則使用短連接進行通信。

http 代理 http 協(xié)議交互過程如圖:

http 代理 http 協(xié)議

https 協(xié)議

接下來我們來看看 https 協(xié)議下,客戶端發(fā)送給代理服務器的 HTTP Header: 

  1. CONNECT staight.github.io:443 HTTP/1.1  
  2. Host: staight.github.io:443  
  3. Proxy-Connection: keep-alive 

如上,https 協(xié)議和 http 協(xié)議相比:

  •  請求方法從GET變成CONNECT
  •  url 沒有 protocol 字段

實際上,由于 https 下客戶端和服務端的通信除了開頭的協(xié)商以外都是密文,中間的代理服務器不再承擔修改 http 報文再轉發(fā)的功能,而是一開始就和客戶端協(xié)商好服務端的地址,隨后的 tcp 密文直接轉發(fā)即可。

http 代理 https 協(xié)議交互過程如圖:

http 代理 https 協(xié)議

代碼實現(xiàn)

首先,創(chuàng)建 tcp 服務,并且對于每個 tcp 請求,均調用 handle 函數(shù): 

  1. // tcp 連接,監(jiān)聽 8080 端口  
  2. l, err :net.Listen("tcp", ":8080")  
  3. if err != nil {  
  4.  log.Panic(err)  
  5.  
  6. // 死循環(huán),每當遇到連接時,調用 handle  
  7. for {  
  8.  client, err :l.Accept()  
  9.  if err != nil {  
  10.   log.Panic(err)  
  11.  }   
  12.  go handle(client)  
  13.    }  
  14. 然后將獲取的數(shù)據(jù)放入緩沖區(qū):  
  15. // 用來存放客戶端數(shù)據(jù)的緩沖區(qū)  
  16. var b [1024]byte  
  17. //從客戶端獲取數(shù)據(jù)  
  18. n, err :client.Read(b[:])  
  19. if err != nil {  
  20.  log.Println(err)  
  21.  return  
  22.    } 

從緩沖區(qū)讀取 HTTP 請求方法,URL 等信息: 

  1. var method, URL, address string  
  2. // 從客戶端數(shù)據(jù)讀入 method,url  
  3. fmt.Sscanf(string(b[:bytes.IndexByte(b[:], '\n')]), "%s%s", &method, &URL)  
  4. hostPortURL, err :url.Parse(URL)  
  5. if err != nil { 
  6.  log.Println(err) 
  7.   return  
  8.    } 

http 協(xié)議和 https 協(xié)議獲取地址的方式不同,分別處理: 

  1. // 如果方法是 CONNECT,則為 https 協(xié)議  
  2. if method == "CONNECT" {  
  3.  address = hostPortURL.Scheme + ":" + hostPortURL.Opaque  
  4. } else { //否則為 http 協(xié)議  
  5.  address = hostPortURL.Host  
  6.  // 如果 host 不帶端口,則默認為 80  
  7.  if strings.Index(hostPortURL.Host, ":") == -1 { //host 不帶端口, 默認 80  
  8.   address = hostPortURL.Host + ":80"  
  9.  }  
  10.    } 

用獲取到的地址向服務端發(fā)起請求。如果是 http 協(xié)議,將客戶端的請求直接轉發(fā)給服務端;如果是 https 協(xié)議,發(fā)送 http 響應: 

  1. //獲得了請求的 host 和 port,向服務端發(fā)起 tcp 連接  
  2. server, err :net.Dial("tcp", address)  
  3. if err != nil {  
  4.  log.Println(err)  
  5.  return  
  6.  
  7. //如果使用 https 協(xié)議,需先向客戶端表示連接建立完畢  
  8. if method == "CONNECT" {  
  9.  fmt.Fprint(client, "HTTP/1.1 200 Connection established\r\n\r\n")  
  10. } else { //如果使用 http 協(xié)議,需將從客戶端得到的 http 請求轉發(fā)給服務端  
  11.  server.Write(b[:n])  
  12.    } 

最后,將所有客戶端的請求轉發(fā)至服務端,將所有服務端的響應轉發(fā)給客戶端: 

  1. //將客戶端的請求轉發(fā)至服務端,將服務端的響應轉發(fā)給客戶端。io.Copy 為阻塞函數(shù),文件描述符不關閉就不停止  
  2. go io.Copy(server, client)  
  3.    io.Copy(client, server 

完整的源代碼: 

  1. package main  
  2. import (  
  3.  "bytes"  
  4.  "fmt"  
  5.  "io"  
  6.  "log"  
  7.  "net"  
  8.  "net/url"  
  9.  "strings"  
  10.   
  11. func main() {  
  12.  // tcp 連接,監(jiān)聽 8080 端口  
  13.  l, err :net.Listen("tcp", ":8080")  
  14.  if err != nil {  
  15.   log.Panic(err)  
  16.  }   
  17.  // 死循環(huán),每當遇到連接時,調用 handle  
  18.  for {  
  19.   client, err :l.Accept()  
  20.   if err != nil {  
  21.    log.Panic(err)  
  22.   }  
  23.   go handle(client)  
  24.  }  
  25.  
  26. func handle(client net.Conn) { 
  27.  if client == nil {  
  28.   return  
  29.  }  
  30.  defer client.Close()  
  31.  log.Printf("remote addr: %v\n", client.RemoteAddr())  
  32.  // 用來存放客戶端數(shù)據(jù)的緩沖區(qū)  
  33.  var b [1024]byte  
  34.  //從客戶端獲取數(shù)據(jù)  
  35.  n, err :client.Read(b[:])  
  36.  if err != nil {  
  37.   log.Println(err)  
  38.   return 
  39.   
  40.  var method, URL, address string  
  41.  // 從客戶端數(shù)據(jù)讀入 method,url  
  42.  fmt.Sscanf(string(b[:bytes.IndexByte(b[:], '\n')]), "%s%s", &method, &URL)  
  43.  hostPortURL, err :url.Parse(URL)  
  44.  if err != nil {  
  45.   log.Println(err)  
  46.   return  
  47.  }  
  48.  // 如果方法是 CONNECT,則為 https 協(xié)議  
  49.  if method == "CONNECT" {  
  50.   address = hostPortURL.Scheme + ":" + hostPortURL.Opaque  
  51.  } else { //否則為 http 協(xié)議  
  52.   address = hostPortURL.Host  
  53.   // 如果 host 不帶端口,則默認為 80  
  54.   if strings.Index(hostPortURL.Host, ":") == -1 { //host 不帶端口, 默認 80  
  55.    address = hostPortURL.Host + ":80"  
  56.   }  
  57.  }  
  58.  //獲得了請求的 host 和 port,向服務端發(fā)起 tcp 連接  
  59.  server, err :net.Dial("tcp", address)  
  60.  if err != nil {  
  61.   log.Println(err)  
  62.   return  
  63.  }  
  64.  //如果使用 https 協(xié)議,需先向客戶端表示連接建立完畢  
  65.  if method == "CONNECT" {  
  66.   fmt.Fprint(client, "HTTP/1.1 200 Connection established\r\n\r\n")  
  67.  } else { //如果使用 http 協(xié)議,需將從客戶端得到的 http 請求轉發(fā)給服務端  
  68.   server.Write(b[:n])  
  69.  }  
  70.  //將客戶端的請求轉發(fā)至服務端,將服務端的響應轉發(fā)給客戶端。io.Copy 為阻塞函數(shù),文件描述符不關閉就不停止  
  71.  go io.Copy(server, client)  
  72.  io.Copy(client, server)  

添加代理,然后運行:

添加代理

運行 

 

責任編輯:龐桂玉 來源: 馬哥Linux運維
相關推薦

2021-12-14 09:00:42

Swift HTTP 代理服務器

2024-01-08 08:36:29

HTTPGo代理服務器

2015-12-02 14:10:56

HTTP網(wǎng)絡協(xié)議代理原理

2016-11-08 18:53:08

編譯器

2018-09-18 10:11:21

前端vue.jsjavascript

2022-09-08 06:23:37

C++HTTP 服務器

2017-12-27 09:49:35

HTTP服務器反向

2022-11-29 17:34:43

虛擬形象系統(tǒng)

2024-05-07 09:02:47

2020-06-04 12:55:44

PyTorch分類器神經網(wǎng)絡

2019-04-24 15:06:37

Http服務器協(xié)議

2019-12-11 10:45:08

Python 開發(fā)編程語言

2021-05-20 07:56:35

Bean容器Spring

2011-03-24 09:34:41

SPRING

2015-12-02 15:29:32

HTTP網(wǎng)絡協(xié)議代理原理

2024-04-26 09:04:13

2022-04-08 08:26:03

JavaHTTP請求

2024-05-13 08:40:02

Go事件驅動編程

2022-10-21 14:21:46

JavaScript筆記技能

2022-12-29 12:06:28

點贊
收藏

51CTO技術棧公眾號

99精品老司机免费视频| 圆产精品久久久久久久久久久| 超碰这里只有精品| 亚洲免费色视频| 国产私拍一区| 青青艹在线观看| 中文字幕午夜精品一区二区三区| 精品成人在线观看| 尤蜜粉嫩av国产一区二区三区| 国产激情在线视频| 91麻豆.com| 成人a免费视频| 国产性xxxx高清| 国产高清一区| 亚洲男人天堂2023| 极品白嫩少妇无套内谢| 韩国久久久久久| 亚洲一区二三区| 天天爽天天狠久久久| 亚洲精品国产精品国| 人人超碰91尤物精品国产| 欧美激情精品久久久久久| www成人啪啪18软件| 欧美a级网站| 欧美大片在线观看| 手机av在线网| 日本精品在线一区| 精品久久久久久久久久ntr影视| 精品国产无码在线| 最新国产在线观看| 2欧美一区二区三区在线观看视频| 成人激情视频在线播放| 日韩精品成人免费观看视频| 亚洲天堂偷拍| 欧美成人精品xxx| 中国1级黄色片| 欧美日韩水蜜桃| 亚洲免费视频网站| 成人免费毛片日本片视频| 97青娱国产盛宴精品视频| 精品视频在线免费看| 日韩精品一区二区三区不卡| 极品在线视频| 亚洲国产乱码最新视频| 精品无码av无码免费专区| 香蕉视频在线看| 亚洲国产成人一区二区三区| 日本一区二区三区视频在线观看 | 精品一区精品二区| 大尺度做爰床戏呻吟舒畅| 91综合精品国产丝袜长腿久久| 91精品国产色综合久久久蜜香臀| 亚洲77777| 亚洲综合av一区二区三区| 在线观看网站黄不卡| 99免费视频观看| 性高爱久久久久久久久| 91精品福利视频| 黄色三级视频片| 久久av日韩| 欧美精品xxxxbbbb| 亚洲av午夜精品一区二区三区| 中文字幕亚洲在线观看| 精品国产一区二区在线观看| 亚洲av成人片无码| 外国成人在线视频| 在线亚洲国产精品网| av黄色免费在线观看| 自拍日韩欧美| 午夜精品免费视频| 久久久久久久亚洲| 精品在线播放午夜| 国产成人一区二区三区免费看| 丰满少妇一级片| 91小视频免费看| 日韩精品成人一区二区在线观看| 91社区在线| 一区二区三区高清| 免费欧美一级视频| 欧美aaa级| 精品捆绑美女sm三区| 日本xxxx裸体xxxx| 日本激情一区| 久久久在线视频| 欧美性猛交xxxx乱大交hd | 一本高清dvd不卡在线观看 | 国产麻豆成人传媒免费观看| 国产高清自拍一区| 韩国三级在线观看久| 136国产福利精品导航| 成人一区二区免费视频| 国产精品久久久久久吹潮| 日韩一级二级三级精品视频| 一级黄色片大全| 欧美 日韩 国产一区二区在线视频| 韩国美女主播一区| 亚洲天堂中文网| k8久久久一区二区三区| 成人手机视频在线| 午夜欧美激情| 日韩一级高清毛片| 先锋影音av在线| 亚洲国产影院| 91亚洲精品一区| 精品av中文字幕在线毛片| 亚洲精品一二三四区| 久久久噜噜噜www成人网| 成人短视频软件网站大全app| 亚洲国产精品免费| 极品盗摄国产盗摄合集| 男女激情视频一区| 久久久久一区二区| 欧美寡妇性猛交xxx免费| 欧美在线一区二区| 亚洲国产综合视频| 欧美日韩视频| 成人午夜黄色影院| h视频在线播放| 欧美视频一区二区三区…| 奇米777在线| 日韩免费视频| 国产成人精品999| 日韩在线一区二区三区四区| 综合网在线视频| 99草草国产熟女视频在线| 加勒比色老久久爱综合网| 久久精品国产亚洲| 亚洲性生活大片| 亚洲国产精品成人久久综合一区 | 丝袜 亚洲 另类 欧美 重口| 肉色丝袜一区二区| 欧美日韩三区四区| 在线观看特色大片免费视频| 精品国产伦一区二区三区免费 | 成人美女av在线直播| 9191在线| 欧美日韩欧美一区二区| 亚洲v国产v欧美v久久久久久| 久久福利影视| 日本公妇乱淫免费视频一区三区| 国模精品视频| 日韩毛片中文字幕| 天堂网中文字幕| 久久久久国产精品麻豆 | 看国产成人h片视频| 日韩福利二区| 欧美黄色网络| 久久亚洲精品一区二区| 国产精品无码久久av| 1024成人网色www| 男男受被啪到高潮自述| 午夜精品偷拍| 国产欧美亚洲日本| 蜜桃视频在线观看播放| 日韩国产欧美区| 无码人妻丰满熟妇精品区| 国产亚洲一区字幕| 99sesese| 欧美精品成人| 国产伦精品一区二区三区视频孕妇 | 中文字幕一区二区三区四区免费看 | 新狼窝色av性久久久久久| 免费av一区二区三区| 在线手机中文字幕| 国产亚洲欧洲在线| 国产视频在线观看视频| 亚洲已满18点击进入久久| yy1111111| 丝袜诱惑制服诱惑色一区在线观看 | 在线观看视频你懂得| 欧美日韩网址| 久久涩涩网站| 久久69成人| 久久久久久中文| 大乳在线免费观看| 91精品国产入口| 日韩美女黄色片| 国产欧美一区二区三区鸳鸯浴| 91极品视频在线观看| 亚洲最大av| 九色91在线视频| 只有精品亚洲| 欧美一级在线亚洲天堂| 日本最新在线视频| 亚洲国产精品大全| 中文字幕 自拍偷拍| 亚洲精品视频自拍| 这里只有久久精品| 国产福利不卡视频| 男人的天堂日韩| 亚洲一级高清| 一区二区不卡在线| 日韩系列在线| 91九色综合久久| av综合电影网站| 欧美高清在线观看| 137大胆人体在线观看| 亚洲丁香婷深爱综合| 亚洲天堂男人网| 一本高清dvd不卡在线观看| 99热精品免费| 欧美激情中文字幕| 你懂得在线视频| 国产精品一区在线| 在线看的黄色网址| 国产精品婷婷| www.av蜜桃| 欧美在线三区| 一区不卡字幕| 欧美三级伦理在线| 久久一区二区精品| 黄色成人美女网站| 999热视频| 欧美在线se| 国产成人精品午夜| 高潮在线视频| 欧美日韩国产成人高清视频| 免费在线午夜视频| 国产亚洲欧洲在线| 青草久久伊人| 国产视频久久久久久久| 黄色片一区二区| 日韩亚洲欧美在线| 国产精品无码天天爽视频| 欧美性videosxxxxx| 可以免费看的av毛片| 一区二区三区蜜桃网| 中文字幕五月天| 国产精品久久久久久久久图文区| 欧美大波大乳巨大乳| 久久久久久亚洲综合| 超碰男人的天堂| 91麻豆免费看| 大黑人交xxx极品hd| av亚洲产国偷v产偷v自拍| 国产ts在线观看| 粉嫩嫩av羞羞动漫久久久| 性xxxxxxxxx| 国产成a人无v码亚洲福利| 九九九久久久久久久| 国产精品综合二区| 日韩欧美色视频| 成人午夜看片网址| av免费观看不卡| av中文一区二区三区| 99久久免费看精品国产一区 | 久久午夜福利电影| 久久久欧美精品sm网站| 国产精品无码一区二区三区| 久久综合国产精品| 国产精品密蕾丝袜| 亚洲国产精品成人久久综合一区| av免费播放网站| ...av二区三区久久精品| 国产97免费视频| 亚洲综合偷拍欧美一区色| 久青草视频在线观看| 五月天激情小说综合| 丰满少妇xoxoxo视频| 欧美日韩亚洲综合一区| 国产老女人乱淫免费| 精品国产伦一区二区三区观看体验| 狠狠人妻久久久久久综合麻豆| 亚洲国产另类 国产精品国产免费| 四虎永久在线观看| 亚洲人成网在线播放| 欧美激情黑人| 久久久久久久一区二区三区| 欧美gay视频| 成人两性免费视频| 久久精品国产亚洲blacked| 欧美一区二区高清在线观看| 色综合狠狠操| 高清欧美精品xxxxx| 久久亚洲影院| 国产探花在线观看视频| 99久久精品免费看| 久久久久久成人网| 亚洲午夜在线电影| 黄色免费av网站| 欧美一区二区高清| 欧美日韩国产中文字幕在线| 伊人久久五月天| 91桃色在线| 国产精品美女久久久久久免费| 精品99re| 欧美伦理一区二区| 伊人久久大香线蕉精品组织观看| 成年人看的毛片| 麻豆成人91精品二区三区| 一边摸一边做爽的视频17国产| 国产欧美一区二区三区网站| 日本天堂中文字幕| 色婷婷av一区二区三区gif| 国产suv精品一区二区69| 亚洲精品一区久久久久久| 国产乱色在线观看| 国产z一区二区三区| 澳门成人av| 在线观看成人av| 久久久久国产一区二区| 国产精品日日摸夜夜爽| 国产精品免费av| 日韩中文字幕在线观看视频| 日韩一区二区在线观看视频| 国产私人尤物无码不卡| 欧美精品aaa| 99综合99| 亚洲精品一区二区三区蜜桃久| 日韩一级免费| 青青草精品在线| 国产精品久久久久久久久图文区| 狠狠人妻久久久久久| 精品国产一区二区三区四区四| 欧美成人三区| 国产精品亚洲激情| 免费观看久久av| 亚洲中文字幕无码av永久| 国产精品一区二区你懂的| аⅴ天堂中文在线网| 欧美性猛交xxxx乱大交蜜桃| 免费观看黄一级视频| 精品少妇v888av| 亚洲欧美一级| 在线观看欧美一区| 日本欧美在线观看| 国产精品天天干| 色天使色偷偷av一区二区 | 日韩中文在线视频| 天天免费亚洲黑人免费| 精品中文字幕一区| 亚洲日本激情| 亚洲欧美日韩色| 亚洲一区二区欧美| 免费看av毛片| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 香蕉久久一区二区不卡无毒影院 | 亚洲天堂网在线视频| 这里只有视频精品| 四虎永久精品在线| 在线观看日韩片| 国产在线不卡一卡二卡三卡四卡| 国产美女高潮视频| 欧美老人xxxx18| 成年视频在线观看| 91精品综合久久| 伊人久久久大香线蕉综合直播| 天堂www中文在线资源| 亚洲444eee在线观看| 天堂中文资源在线观看| 77777亚洲午夜久久多人| 伊人春色精品| av五月天在线| 亚洲日本欧美天堂| 亚洲第九十九页| 97香蕉超级碰碰久久免费的优势| 日韩精品免费一区二区夜夜嗨| 欧美牲交a欧美牲交| 国产亚洲综合av| 国产又大又长又粗| 欧美激情高清视频| 九一精品国产| 老司机久久精品| 亚洲国产成人av网| 青青草免费在线视频| 国产精品成人品| 亚洲欧美色图| 国产黄色三级网站| 在线视频你懂得一区二区三区| av电影在线观看| 国产精品三区在线| 视频一区二区中文字幕| 疯狂撞击丝袜人妻| 亚洲成人亚洲激情| 午夜av成人| 欧美 日韩 国产精品| 久久这里只有精品视频网| 中文字幕在线视频免费| 欧美日韩国产第一页| 国产精品欧美三级在线观看| 中文字幕亚洲欧洲| 精品久久久国产精品999| 日本视频在线播放| 久久99热只有频精品91密拍| 日韩激情中文字幕| 免费在线一区二区三区| 亚洲欧洲日产国产网站| 香蕉大人久久国产成人av| 九色在线视频观看| 亚洲视频你懂的| 国产三级在线免费| 国产精品乱码一区二区三区| 三级欧美韩日大片在线看| 国产极品在线播放| 中文字幕av一区中文字幕天堂 | 97人人澡人人爽人人模亚洲| 在线成人激情黄色| 久久综合另类图片小说| 免费在线观看污网站| 欧美日韩日本国产|