Skip to content

Instantly share code, notes, and snippets.

@NaniteFactory
Forked from fabrizioc1/http-proxy.go
Created September 15, 2018 11:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save NaniteFactory/f3e90ceee68c9ac23938b9ef39704c84 to your computer and use it in GitHub Desktop.
Save NaniteFactory/f3e90ceee68c9ac23938b9ef39704c84 to your computer and use it in GitHub Desktop.
Http proxy server in Go
package main
import (
"fmt"
"io"
"log"
"net/http"
)
type _ReqRes struct {
Request *http.Request
Response *http.Response
}
func main() {
var ch = make(chan *_ReqRes, 10)
http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
req2, err := http.NewRequest(req.Method, req.RequestURI, req.Body)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
defer req2.Body.Close()
for k, v := range req.Header {
req2.Header.Set(k, v[0])
}
res2, err := (&http.Client{}).Do(req2)
if err != nil { // either GET or POST
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
defer res2.Body.Close()
for k, v := range res2.Header {
w.Header().Set(k, v[0])
}
w.WriteHeader(res2.StatusCode)
io.Copy(w, res2.Body)
ch <- &_ReqRes{req, res2}
})
go func() { // console printer
for {
select {
case reqRes := <-ch:
fmt.Printf("%v %v\n", reqRes.Request.Method, reqRes.Request.RequestURI)
for k, v := range reqRes.Request.Header {
fmt.Println(k, ":", v)
}
fmt.Println("==============================")
fmt.Printf("HTTP/1.1 %v\n", reqRes.Response.Status)
for k, v := range reqRes.Response.Header {
fmt.Println(k, ":", v)
}
fmt.Println(reqRes.Response.Body)
fmt.Println("==============================")
}
}
}()
fmt.Println("==============================")
fmt.Println("init")
fmt.Println("==============================")
err := http.ListenAndServe(":12345", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err.Error())
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment