Skip to content

Instantly share code, notes, and snippets.

@sysulq
Created October 17, 2014 01:45
Show Gist options
  • Save sysulq/2a26d04d34bd2f660b7c to your computer and use it in GitHub Desktop.
Save sysulq/2a26d04d34bd2f660b7c to your computer and use it in GitHub Desktop.
package main
import (
"bytes"
"compress/gzip"
"fmt"
"io"
"io/ioutil"
"log"
"net/http"
"net/http/httputil"
"net/url"
)
type Handler struct {
proxy *httputil.ReverseProxy
}
func NewHandler() *Handler {
url, _ := url.Parse("http://security.yy.com:1218")
return &Handler{proxy: httputil.NewSingleHostReverseProxy(url)}
}
func drainBody(b io.ReadCloser) (r1, r2 io.ReadCloser, err error) {
var buf bytes.Buffer
if _, err = buf.ReadFrom(b); err != nil {
return nil, nil, err
}
if err = b.Close(); err != nil {
return nil, nil, err
}
return ioutil.NopCloser(&buf), ioutil.NopCloser(bytes.NewReader(buf.Bytes())), nil
}
func (handler *Handler) ServeHTTP(writer http.ResponseWriter, req *http.Request) {
var err error
body := req.Body
if req.Body != nil {
body, req.Body, err = drainBody(req.Body)
if err != nil {
return
}
}
req.Body, _ = gzip.NewReader(req.Body)
body, _ = gzip.NewReader(body)
byte, _ := ioutil.ReadAll(body)
fmt.Println("len:", len(byte))
req.ContentLength = int64(len(byte))
handler.proxy.ServeHTTP(writer, req)
}
func main() {
http.Handle("/", NewHandler())
log.Fatal(http.ListenAndServe(":8080", nil))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment