go如何实现简易h2正向代理

go如何实现一个简易的h2正向代理?

讨论数量: 2

1、使用双向io.Copy进行tcp代理。

2、使用httputil.NewSingleHostReverseProxy进行http代理,http代理可以不分协议版本,如果一定要h2,可以关闭server h1和设置h2dail转发。

2年前 评论
DragonKing (楼主) 2年前
1112 (作者) 2年前

能不能参考一下这个正向代理:

package main

import (
    "fmt"
    "io"
    "net"
    "net/http"
    "strings"
)

type Pxy struct {
}

func main() {
    fmt.Println("Serve on:8180")
    http.Handle("/", &Pxy{})
    http.ListenAndServe("0.0.0.0:8180", nil)
}

func (p *Pxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
    fmt.Printf("Received requrest: %s, %s, %s, \n", req.Method, req.Host, req.RemoteAddr)
    transport := http.DefaultTransport
    //浅拷贝对象
    outReq := new(http.Request)
    *outReq = *req
    if clientIP, _, err := net.SplitHostPort(req.RemoteAddr); err == nil {
        if prior, ok := outReq.Header["X-Forwarded-For"]; ok {
            clientIP = strings.Join(prior, ", ") + ", " + clientIP
        }
        outReq.Header.Set("X-Forwarded-For", clientIP)
    }
    //请求下游
    res, err := transport.RoundTrip(outReq)
    if err != nil {
        rw.WriteHeader(http.StatusBadGateway)
        return
    }

    //把下游内容返回给上游
    //将头部返回
    for key, value := range res.Header {
        for _, v := range value {
            rw.Header().Add(key, v)
        }
    }
    rw.WriteHeader(res.StatusCode)
    //将内容返回
    io.Copy(rw, res.Body)
    res.Body.Close()
}
2年前 评论
1112 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!