IPアドレスを隠蔽したいので、GolangでHTTPプロキシサーバーを作る

# Goでプロキシサーバー
プロキシサーバーをGolangで作成してみます。

# プロキシサーバー
ポート8080で作成します。リクエスト先のURLを取得し、代理でプロキシサーバーがリクエストを送信、レスポンスを複製して返しています。

```golang:main.go
package main

import (
	"fmt"
	"io"
	"log"
	"net/http"

	"github.com/labstack/echo/v4"
	"github.com/labstack/echo/v4/middleware"
)

func handler(c echo.Context) error {
	url := c.Request().URL.String()
	req, _ := http.NewRequest(c.Request().Method, url, c.Request().Body)

	for name, values := range c.Request().Header {
		for _, value := range values {
			req.Header.Add(name, value)
		}
	}

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		return c.String(http.StatusInternalServerError, err.Error())
	}
	defer resp.Body.Close()
	fmt.Println(resp, "resp")

	for name, values := range resp.Header {
		for _, value := range values {
			c.Response().Header().Add(name, value)
		}
	}
	c.Response().WriteHeader(resp.StatusCode)
	io.Copy(c.Response(), resp.Body)
	return nil
}

func main() {
	e := echo.New()
	e.Use(middleware.Logger())
	e.Use(middleware.Recover())
	e.GET("/", handler)
	log.Fatal(e.Start(":8080"))
}

```

## ウェブサーバー
ポート8081でシンプルに文字列を返しています。
```go:webserver/main.go
package main

import (
	"log"
	"net/http"

	"github.com/labstack/echo/v4"
	"github.com/labstack/echo/v4/middleware"
)

func main() {
	e := echo.New()
	e.Use(middleware.Logger())
	e.Use(middleware.Recover())

	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello, World!")
	})
	log.Fatal(e.Start(":8081"))
}

```


## リクエスト送信プログラム
リクエスト先に`localhost:8081`のウェブサーバー、プロキシとして`localhost:8080`のプロキシサーバーを指定

```python:http_request.py
import requests

proxy = {"http": "http://localhost:8080"}


def get_request(url):
    r = requests.get(url, proxies=proxy)
    print(r.status_code)
    print(r.text)


if __name__ == "__main__":
    get_request("http://localhost:8081")

```

## 検証
全てを起動し、pythonプログラムを実行します。
```bash
$ python http_request.py
200
Hello, World!
```


プロキシサーバーのログ
```bash
$ go run main.go

   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.11.4
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on [::]:8080
&{200 OK 200 HTTP/1.1 1 1 map[Content-Length:[13] Content-Type:[text/plain; charset=UTF-8] Date:[Mon, 25 Dec 2023 13:35:38 GMT]] 0x1400020a080 13 [] false false map[] 0x14000186200 <nil>} resp
{"time":"2023-12-25T22:35:38.926363+09:00","id":"","remote_ip":"::1","host":"localhost:8081","method":"GET","uri":"http://localhost:8081/","user_agent":"python-requests/2.31.0","status":200,"error":"","latency":2184250,"latency_human":"2.18425ms","bytes_in":0,"bytes_out":13}
```

```bash
$ go run webserver/main.go
   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.11.4
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on [::]:8081
{"time":"2023-12-25T22:32:35.058394+09:00","id":"","remote_ip":"::1","host":"localhost:8081","method":"GET","uri":"/","user_agent":"python-requests/2.31.0","status":200,"error":"","latency":1583,"latency_human":"1.583µs","bytes_in":0,"bytes_out":13}
```

よさそうです。