老师,你好

来源:4-9 返回内容随心改2

慕移动4055035

2020-08-07

package main

//补笔记
import (
“bytes”
“fmt”
“io/ioutil”
“log”
“net/http”
“net/http/httputil”
“net/url”
“strings”
)

var addr = “127.0.0.1:2002”

func main() {
// 下游服务器
rs1 := “https://127.0.0.1:2003/base
//得到url参数
url1, err1 := url.Parse(rs1)
if err1 != nil {
log.Println(err1)
}
proxy := NewSingleHostReverseProxy(url1)
log.Println("Staring HttpServer at " + addr)
log.Fatal(http.ListenAndServe(addr, proxy))
}
func NewSingleHostReverseProxy(target *url.URL) *httputil.ReverseProxy {
// 获取url中的参数 重新拼接到rs
targetQuery := target.RawQuery
// 控制器
director := func(req *http.Request) {
// https http…
req.URL.Scheme = target.Scheme
// 修改请求的url为真实服务器的ip:host (之前的req.Url.Host是代理服务器的IP:host)
req.URL.Host = target.Host
// 将请求的url拼接在真实服务器后面
req.URL.Path = singleJoiningSlash(target.Path, req.URL.Path)
//参数的拼接
if targetQuery == “” || req.URL.RawQuery == “” {
//都为空默认相加
req.URL.RawQuery = targetQuery + req.URL.RawQuery
} else {
// 有一个不为空就拼接起来
req.URL.RawQuery = targetQuery + “&” + req.URL.RawQuery
}
// 请求的User-Agent没有 就设置为空
if _, ok := req.Header[“User-Agent”]; !ok {
// explicitly disable User-Agent so it’s not set to default value
req.Header.Set(“User-Agent”, “”)
}
}
// 修改真实服务器返回的数据报文
modifyFunc := func(res *http.Response) error {
//if res.StatusCode != 200 {
//return errors.New(“err statusCode”)
//先获取返回值
oldPayload, err := ioutil.ReadAll(res.Body)
if err != nil {
return err
}
// 追加一个hello
newPayload := []byte(“hello” + string(oldPayload))
// 数据回写 ,res.Body需要实现Reader Closer借口,而ioutil.NopCloser正好实现了这个方法
res.Body = ioutil.NopCloser(bytes.NewBuffer(newPayload))
// 修改的body长度也变了 所以也要修改
res.ContentLength = int64(len(newPayload))
// 同时也要请求头里面回写
res.Header.Set(“Content-Length”, fmt.Sprint(len(newPayload)))
//}
return nil
}
//errorHandler := func(res http.ResponseWriter, req *http.Request, err error) {
// res.Write([]byte(err.Error()))
//}
return &httputil.ReverseProxy{Director: director, ModifyResponse: modifyFunc}
}

func singleJoiningSlash(a, b string) string {
aslash := strings.HasSuffix(a, “/”)
bslash := strings.HasPrefix(b, “/”)
switch {
case aslash && bslash:
return a + b[1:]
case !aslash && !bslash:
return a + “/” + b
}
return a + b
}

返回:http: proxy error: tls: first record does not look like a TLS handshake

写回答

1回答

牛儿吃草

2020-09-25

意思是,你用了当前http的请求,请求了下游的https的请求。

rs1 := “https://127.0.0.1:2003/base”变更为

rs1 := “http://127.0.0.1:2003/base”

即可

0
0

(打造简历金牌项目)Vue+Go 开发企业级微服务网关项目

简历中摒弃烂大街的培训机构项目,带你开发企业级微服务网关

1316 学习 · 352 问题

查看课程