// HTTP reverse proxy handler
-package http
+package httputil
import (
+ "http"
"io"
"log"
"net"
// the request into a new request to be sent
// using Transport. Its response is then copied
// back to the original client unmodified.
- Director func(*Request)
+ Director func(*http.Request)
- // The Transport used to perform proxy requests.
- // If nil, DefaultTransport is used.
- Transport RoundTripper
+ // The transport used to perform proxy requests.
+ // If nil, http.DefaultTransport is used.
+ Transport http.RoundTripper
// FlushInterval specifies the flush interval, in
// nanoseconds, to flush to the client while
// target's path is "/base" and the incoming request was for "/dir",
// the target request will be for /base/dir.
func NewSingleHostReverseProxy(target *url.URL) *ReverseProxy {
- director := func(req *Request) {
+ director := func(req *http.Request) {
req.URL.Scheme = target.Scheme
req.URL.Host = target.Host
req.URL.Path = singleJoiningSlash(target.Path, req.URL.Path)
return &ReverseProxy{Director: director}
}
-func copyHeader(dst, src Header) {
+func copyHeader(dst, src http.Header) {
for k, vv := range src {
for _, v := range vv {
dst.Add(k, v)
}
}
-func (p *ReverseProxy) ServeHTTP(rw ResponseWriter, req *Request) {
+func (p *ReverseProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
transport := p.Transport
if transport == nil {
- transport = DefaultTransport
+ transport = http.DefaultTransport
}
- outreq := new(Request)
+ outreq := new(http.Request)
*outreq = *req // includes shallow copies of maps, but okay
p.Director(outreq)
// to us. This is modifying the same underlying map from req
// (shallow copied above) so we only copy it if necessary.
if outreq.Header.Get("Connection") != "" {
- outreq.Header = make(Header)
+ outreq.Header = make(http.Header)
copyHeader(outreq.Header, req.Header)
outreq.Header.Del("Connection")
}
res, err := transport.RoundTrip(outreq)
if err != nil {
log.Printf("http: proxy error: %v", err)
- rw.WriteHeader(StatusInternalServerError)
+ rw.WriteHeader(http.StatusInternalServerError)
return
}
type writeFlusher interface {
io.Writer
- Flusher
+ http.Flusher
}
type maxLatencyWriter struct {
// Reverse proxy tests.
-package http_test
+package httputil
import (
- . "http"
+ "http"
"http/httptest"
"io/ioutil"
"testing"
func TestReverseProxy(t *testing.T) {
const backendResponse = "I am the backend"
const backendStatus = 404
- backend := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
+ backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if len(r.TransferEncoding) > 0 {
t.Errorf("backend got unexpected TransferEncoding: %v", r.TransferEncoding)
}
t.Errorf("backend got Host header %q, want %q", g, e)
}
w.Header().Set("X-Foo", "bar")
- SetCookie(w, &Cookie{Name: "flavor", Value: "chocolateChip"})
+ http.SetCookie(w, &http.Cookie{Name: "flavor", Value: "chocolateChip"})
w.WriteHeader(backendStatus)
w.Write([]byte(backendResponse))
}))
frontend := httptest.NewServer(proxyHandler)
defer frontend.Close()
- getReq, _ := NewRequest("GET", frontend.URL, nil)
+ getReq, _ := http.NewRequest("GET", frontend.URL, nil)
getReq.Host = "some-name"
getReq.Header.Set("Connection", "close")
getReq.Close = true
- res, err := DefaultClient.Do(getReq)
+ res, err := http.DefaultClient.Do(getReq)
if err != nil {
t.Fatalf("Get: %v", err)
}