Skip to content

Instantly share code, notes, and snippets.

@nanpuyue
Last active July 12, 2019 12:51
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 nanpuyue/8fc22954144482a9db83c73265d07d1b to your computer and use it in GitHub Desktop.
Save nanpuyue/8fc22954144482a9db83c73265d07d1b to your computer and use it in GitHub Desktop.
simple reverse proxy service on gae
// date: 2019-07-12
// license: GPLv3 https://www.gnu.org/licenses/gpl-3.0.txt
// author: nanpuyue <nanpuyue@gmail.com> https://blog.nanpuyue.com
package main
import (
"bufio"
"golang.org/x/net/context"
"google.golang.org/appengine"
"google.golang.org/appengine/socket"
"net/http"
"net/http/httputil"
"net/url"
"time"
)
type Transport struct {
Context context.Context
}
var _ http.RoundTripper = (*Transport)(nil)
func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) {
conn, err := socket.DialTimeout(t.Context, "tcp", req.URL.Host, 10*time.Second)
if err != nil {
return nil, err
}
if err := req.Write(conn); err != nil {
return nil, err
}
resp, err := http.ReadResponse(bufio.NewReader(conn), req)
return resp, err
}
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
upstream, _ := url.Parse("http://example.com:80")
r.Header.Add("X-Forwarded-For", r.RemoteAddr)
proxy := httputil.NewSingleHostReverseProxy(upstream)
proxy.Transport = &Transport{
Context: appengine.NewContext(r),
}
proxy.ServeHTTP(w, r)
})
appengine.Main()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment