From 3ae43002e9762e60844723edc5096c7282fb978d Mon Sep 17 00:00:00 2001 From: Tom Clegg Date: Sat, 22 Nov 2014 05:01:13 -0500 Subject: [PATCH] 3781: Set CORS headers in keepproxy responses. --- services/keepproxy/keepproxy.go | 13 ++++++++++ services/keepproxy/keepproxy_test.go | 36 ++++++++++++++++++++++++++-- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/services/keepproxy/keepproxy.go b/services/keepproxy/keepproxy.go index de4ccafc28..b74a982b10 100644 --- a/services/keepproxy/keepproxy.go +++ b/services/keepproxy/keepproxy.go @@ -222,6 +222,8 @@ type PutBlockHandler struct { type InvalidPathHandler struct{} +type OptionsHandler struct{} + // MakeRESTRouter // Returns a mux.Router that passes GET and PUT requests to the // appropriate handlers. @@ -244,6 +246,7 @@ func MakeRESTRouter( if enable_put { rest.Handle(`/{hash:[0-9a-f]{32}}+{hints}`, PutBlockHandler{kc, t}).Methods("PUT") rest.Handle(`/{hash:[0-9a-f]{32}}`, PutBlockHandler{kc, t}).Methods("PUT") + rest.Handle(`/{hash:[0-9a-f]{32}}{ignore}`, OptionsHandler{}).Methods("OPTIONS") } rest.NotFoundHandler = InvalidPathHandler{} @@ -256,7 +259,17 @@ func (this InvalidPathHandler) ServeHTTP(resp http.ResponseWriter, req *http.Req http.Error(resp, "Bad request", http.StatusBadRequest) } +func (this OptionsHandler) ServeHTTP(resp http.ResponseWriter, req *http.Request) { + log.Printf("%s: %s %s", GetRemoteAddress(req), req.Method, req.URL.Path) + resp.Header().Set("Access-Control-Allow-Methods", "GET, HEAD, PUT, OPTIONS") + resp.Header().Set("Access-Control-Allow-Origin", "*") + resp.Header().Set("Access-Control-Allow-Headers", "Authorization, X-Keep-Desired-Replicas") + resp.Header().Set("Access-Control-Max-Age", "86486400") +} + func (this GetBlockHandler) ServeHTTP(resp http.ResponseWriter, req *http.Request) { + resp.Header().Set("Access-Control-Allow-Origin", "*") + resp.Header().Set("Access-Control-Allow-Headers", "Authorization") kc := *this.KeepClient diff --git a/services/keepproxy/keepproxy_test.go b/services/keepproxy/keepproxy_test.go index 88ac8a6a1d..ba9793dd09 100644 --- a/services/keepproxy/keepproxy_test.go +++ b/services/keepproxy/keepproxy_test.go @@ -222,7 +222,7 @@ func (s *ServerRequiredSuite) TestPutAskGet(c *C) { } func (s *ServerRequiredSuite) TestPutAskGetForbidden(c *C) { - log.Print("TestPutAndGet start") + log.Print("TestPutAskGetForbidden start") kc := runProxy(c, []string{"keepproxy"}, "123abc", 29951) waitForListener() @@ -260,7 +260,7 @@ func (s *ServerRequiredSuite) TestPutAskGetForbidden(c *C) { log.Print("Get") } - log.Print("TestPutAndGetForbidden done") + log.Print("TestPutAskGetForbidden done") } func (s *ServerRequiredSuite) TestGetDisabled(c *C) { @@ -320,3 +320,35 @@ func (s *ServerRequiredSuite) TestPutDisabled(c *C) { log.Print("TestPutDisabled done") } + +func (s *ServerRequiredSuite) TestCorsHeaders(c *C) { + runProxy(c, []string{"keepproxy"}, "4axaw8zxe0qm22wa6urpp5nskcne8z88cvbupv653y1njyi05h", 29954) + waitForListener() + defer closeListener() + + { + client := http.Client{} + req, err := http.NewRequest("OPTIONS", + fmt.Sprintf("http://localhost:29954/%x+3", + md5.Sum([]byte("foo"))), + nil) + req.Header.Add("Access-Control-Request-Method", "PUT") + req.Header.Add("Access-Control-Request-Headers", "Authorization, X-Keep-Desired-Replicas") + resp, err := client.Do(req) + c.Check(err, Equals, nil) + c.Check(resp.StatusCode, Equals, 200) + body, err := ioutil.ReadAll(resp.Body) + c.Check(string(body), Equals, "") + c.Check(resp.Header.Get("Access-Control-Allow-Methods"), Equals, "GET, HEAD, PUT, OPTIONS") + c.Check(resp.Header.Get("Access-Control-Allow-Origin"), Equals, "*") + } + + { + resp, err := http.Get( + fmt.Sprintf("http://localhost:29954/%x+3", + md5.Sum([]byte("foo")))) + c.Check(err, Equals, nil) + c.Check(resp.Header.Get("Access-Control-Allow-Headers"), Equals, "Authorization") + c.Check(resp.Header.Get("Access-Control-Allow-Origin"), Equals, "*") + } +} -- 2.30.2