Go言語のProxyServerによるBodyデータの変更は下記でも試しましたが、それからかなり時が経っていることから最近の環境で新たに試してみました。(今回はHeaderの追加もしています)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
package main import( "io" "log" "net/url" "net/http" "net/http/httputil" "fmt" "strings" ) func main() { remote, err := url.Parse("http://decode.red") if err != nil { panic(err) } handler := func(p *httputil.ReverseProxy) func(http.ResponseWriter, *http.Request) { return func(w http.ResponseWriter, r *http.Request) { log.Println(r.URL) r.Host = remote.Host b, e := httputil.DumpRequest(r, false) // true : body dump if e != nil { fmt.Println(e) } else { fmt.Println(string(b)) } w.Header().Set("X-Test-Header", "Header Value") mod := func(res *http.Response) error { dump, err := httputil.DumpResponse(res, true) if err != nil { log.Fatal(err) } fmt.Printf("%s", string(dump)) b, err := io.ReadAll(res.Body) if err != nil { log.Fatal(err) } s := string(b) s = strings.Replace(s, "</body>", "<center>END!<center></body>", 1) io.WriteString(w, s) return nil } p.ModifyResponse = mod p.ServeHTTP(w, r) } } proxy := httputil.NewSingleHostReverseProxy(remote) http.HandleFunc("/", handler(proxy)) err = http.ListenAndServe(":8081", nil) if err != nil { panic(err) } } |
サーバ起動
go run main.go
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ curl -D - localhost:8081 HTTP/1.1 200 OK X-Test-Header: Header Value Date: Sun, 10 Sep 2023 07:56:22 GMT Content-Length: 1565 Content-Type: text/html; charset=utf-8 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>IT教育サポート/ DECODE Education</title> </head> <body style="font-family:sans-serif; font-size:12px"> <center> ...(中略)... <div style="font-family:san-serif; font-size:14px; font-weight:bold; color:gray; text-align:right"> © 2014-2023 DECODE Education </dir> <br> <center>END!<center></body> </html> |
ここでBodyの文字列置換部分(io.ReadAll から io.WriteString まで)をコメントアウトしてもう一度実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
$ curl -D - localhost:8081 HTTP/1.1 200 OK Accept-Ranges: bytes Content-Length: 1545 Content-Type: text/html Date: Sun, 10 Sep 2023 08:12:00 GMT Etag: "609-60121eec99200" Last-Modified: Sun, 23 Jul 2023 06:51:52 GMT Server: nginx X-Test-Header: Header Value <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>IT教育サポート/ DECODE Education</title> </head> <body style="font-family:sans-serif; font-size:12px"> <center> ...(中略)... <div style="font-family:san-serif; font-size:18px; font-weight:bold; color:gray; text-align:right"> </div> <div style="font-family:san-serif; font-size:14px; font-weight:bold; color:gray; text-align:right"> © 2014-2023 DECODE Education </dir> <br> </body> </html> |
headerの部分がかわりました。ハンドラーの中なのでそのやり方に沿ってやる必要がありそうです。
(最初はまったのでメモ)
参考)
https://gist.github.com/JalfResi/6287706
https://qiita.com/convto/items/64e8f090198a4cf7a4fc
https://qiita.com/hayabusa_3288/items/9fd2da8bc3bd6310d576
https://www.zono.dev/post/2021-01-03-http-dumpresponse-dumprequest-golang/
https://zenn.dev/hsaki/books/golang-httpserver-internal/viewer/httphandler#http.response%E5%9E%8B