-
-
Save NaniteFactory/f3e90ceee68c9ac23938b9ef39704c84 to your computer and use it in GitHub Desktop.
Http proxy server in Go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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