From fd1f46313a321994c3d7e0944e0717389d415108 Mon Sep 17 00:00:00 2001 From: Brian Waldon Date: Thu, 18 Sep 2014 10:31:05 -0700 Subject: [PATCH] proxy: add readonly handler --- proxy/proxy.go | 16 ++++++++++++++++ proxy/proxy_test.go | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 proxy/proxy_test.go diff --git a/proxy/proxy.go b/proxy/proxy.go index 1f9c0d7a4..3dc14a887 100644 --- a/proxy/proxy.go +++ b/proxy/proxy.go @@ -31,3 +31,19 @@ func NewHandler(endpoints []string) (http.Handler, error) { return &rp, nil } + +func readonlyHandlerFunc(next http.Handler) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, req *http.Request) { + if req.Method != "GET" { + w.WriteHeader(http.StatusNotImplemented) + return + } + + next.ServeHTTP(w, req) + } +} + +func NewReadonlyHandler(hdlr http.Handler) http.Handler { + readonly := readonlyHandlerFunc(hdlr) + return http.HandlerFunc(readonly) +} diff --git a/proxy/proxy_test.go b/proxy/proxy_test.go new file mode 100644 index 000000000..a83bd56c1 --- /dev/null +++ b/proxy/proxy_test.go @@ -0,0 +1,39 @@ +package proxy + +import ( + "net/http" + "net/http/httptest" + "testing" +) + +func TestReadonlyHandler(t *testing.T) { + fixture := func(w http.ResponseWriter, req *http.Request) { + w.WriteHeader(http.StatusOK) + } + hdlrFunc := readonlyHandlerFunc(http.HandlerFunc(fixture)) + + tests := []struct { + method string + want int + }{ + // GET is only passing method + {"GET", http.StatusOK}, + + // everything but GET is StatusNotImplemented + {"POST", http.StatusNotImplemented}, + {"PUT", http.StatusNotImplemented}, + {"PATCH", http.StatusNotImplemented}, + {"DELETE", http.StatusNotImplemented}, + {"FOO", http.StatusNotImplemented}, + } + + for i, tt := range tests { + req, _ := http.NewRequest(tt.method, "http://example.com", nil) + rr := httptest.NewRecorder() + hdlrFunc(rr, req) + + if tt.want != rr.Code { + t.Errorf("#%d: incorrect HTTP status code: method=%s want=%d got=%d", i, tt.method, tt.want, rr.Code) + } + } +}