70行代码实现http转发

53 阅读1分钟

起因:

客户提供了一个https的接口,要求先做测试才能上线使用;

经过:

太简单了吧,祭出postman开始测试,从本机测试,返回ip没鉴权!哦哦,鉴权的是服务器,好吧。

在服务器上装个postman吧,安装就报错,windows2012上居然用不了postman,尴尬了!

做转发吧,发现转发实现不了https功能,可能有三方的可以转发https的,但不敢用。

无奈之下,祭出golang,自己来转发吧。

如是开始golang大法

main.go

import (
	"fmt"
	"io"
	"io/ioutil"
	"net"
	"net/http"
	"os"
	"time"
)
var client *http.Client
var localAddr string
var remoteAddr string
func main() {
	client = &http.Client{
		Transport: &http.Transport{
			Proxy: http.ProxyFromEnvironment,
			DialContext: (&net.Dialer{
				Timeout:   120 * time.Second,
				KeepAlive: 120 * time.Second,
			}).DialContext,
			MaxIdleConns:        1000,
			MaxIdleConnsPerHost: 1000,
			IdleConnTimeout:     time.Duration(90) * time.Second,
		},

		Timeout: 20 * time.Second,
	}
	localAddr = os.Args[1]
	remoteAddr = os.Args[2]
	fmt.Println(localAddr, remoteAddr)
	httpsServer(remoteAddr)
	for {
		time.Sleep(time.Second)
	}
}

func httpsServer(remote_addr string) {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Println("user in.")
		r2 := post(r, remote_addr)
		if r2 != nil {
			defer r2.Body.Close()
			body2, _ := ioutil.ReadAll(r2.Body)
			for k, v := range r2.Header {
				w.Header().Set(k, v[0])
			}
			w.WriteHeader(r2.StatusCode)
			io.WriteString(w, string(body2))
		} else {
			io.WriteString(w, "Request Data Error")
		}

	})
	http.ListenAndServe(localAddr, nil)
}

func post(r *http.Request, remote_addr string) *http.Response {
	reqUrl := remote_addr + r.URL.Path
	fmt.Println(reqUrl)
	request, _ := http.NewRequest(r.Method, reqUrl, r.Body)
	for k, v := range r.Header {
		request.Header.Set(k, v[0])
		fmt.Println(k, ":", v)
	}
	response, err := client.Do(request)
	if err != nil {
		fmt.Println(err)
	}
	return response
}

编译:

go build main.go -o http转发.exe

在服务器上运行:

http转发.exe :8080 xxxx.xxx.com

再将postman的地址修改为到服务器的:8080端口,开始测试,一切OK!搞定!

golang大法好!