diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..f062014c --- /dev/null +++ b/.travis.yml @@ -0,0 +1,15 @@ +language: go + +go: + - "1.10.x" + - master + +os: + - linux + - osx + +install: + - go get -t ./... + +script: + - make test \ No newline at end of file diff --git a/Makefile b/Makefile index 689240ba..9d6cf90e 100644 --- a/Makefile +++ b/Makefile @@ -8,4 +8,7 @@ release: mv puma-dev_darwin_amd64 puma-dev zip puma-dev-$$RELEASE-darwin-amd64.zip puma-dev +test: + go test -v ./... + .PHONY: all release diff --git a/README.md b/README.md index 2e2e3ddb..136283ed 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Puma-dev: A fast, zero-config development server for OS X and Linux +[![Build Status](https://travis-ci.org/puma/puma-dev.svg?branch=master)](https://travis-ci.org/puma/puma-dev) + Puma-dev is the emotional successor to pow. It provides a quick and easy way to manage apps in development on OS X and Linux. ## Highlights diff --git a/httputil/example_test.go b/httputil/example_test.go index f8561357..61916036 100644 --- a/httputil/example_test.go +++ b/httputil/example_test.go @@ -47,7 +47,7 @@ func ExampleDumpRequest() { fmt.Printf("%s", b) // Output: - // "POST / HTTP/1.1\r\nHost: www.example.org\r\nAccept-Encoding: gzip\r\nUser-Agent: Go-http-client/1.1\r\n\r\nGo is a general-purpose language designed with systems programming in mind." + // "POST / HTTP/1.1\r\nHost: www.example.org\r\nAccept-Encoding: gzip\r\nContent-Length: 75\r\nUser-Agent: Go-http-client/1.1\r\n\r\nGo is a general-purpose language designed with systems programming in mind." } func ExampleDumpRequestOut() { diff --git a/httputil/reverseproxy_test.go b/httputil/reverseproxy_test.go index 0849427b..b57d19d2 100644 --- a/httputil/reverseproxy_test.go +++ b/httputil/reverseproxy_test.go @@ -298,36 +298,6 @@ func req(t *testing.T, v string) *http.Request { return req } -// Issue 12344 -func TestNilBody(t *testing.T) { - backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Write([]byte("hi")) - })) - defer backend.Close() - - frontend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - backURL, _ := url.Parse(backend.URL) - rp := NewSingleHostReverseProxy(backURL) - r := req(t, "GET / HTTP/1.0\r\n\r\n") - r.Body = nil // this accidentally worked in Go 1.4 and below, so keep it working - rp.ServeHTTP(w, r) - })) - defer frontend.Close() - - res, err := http.Get(frontend.URL) - if err != nil { - t.Fatal(err) - } - defer res.Body.Close() - slurp, err := ioutil.ReadAll(res.Body) - if err != nil { - t.Fatal(err) - } - if string(slurp) != "hi" { - t.Errorf("Got %q; want %q", slurp, "hi") - } -} - type bufferPool struct { get func() []byte put func([]byte) @@ -432,3 +402,19 @@ func TestReverseProxy_Post(t *testing.T) { t.Errorf("got body %q; expected %q", g, e) } } + +func NewSingleHostReverseProxy(target *url.URL) *ReverseProxy { + targetQuery := target.RawQuery + director := func(res http.ResponseWriter, req *http.Request) error { + req.URL.Scheme = target.Scheme + req.URL.Host = target.Host + req.URL.Path = singleJoiningSlash(target.Path, req.URL.Path) + if targetQuery == "" || req.URL.RawQuery == "" { + req.URL.RawQuery = targetQuery + req.URL.RawQuery + } else { + req.URL.RawQuery = targetQuery + "&" + req.URL.RawQuery + } + return nil + } + return &ReverseProxy{Proxy: director} +}