zoukankan      html  css  js  c++  java
  • 一个简单的Golang实现的HTTP Proxy方法

    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[:], '
    ')]), "%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
    ")
      } else {
        server.Write(b[:n])
      }
      //进行转发
      go io.Copy(server, client)
      io.Copy(client, server)
    }
    

      

  • 相关阅读:
    新浪微博爬虫项目
    time
    黑客增长
    python2 3 区别
    爬虫高性能相关
    登录_爬取并筛选拉钩网职位信息_自动提交简历
    破解极验验证码
    tesseract-ocr 传统验证码识别
    刻意练习
    计算学员的考试总成绩以及平均成绩
  • 原文地址:https://www.cnblogs.com/ip99/p/14587790.html
Copyright © 2011-2022 走看看