From 3031531b3c3046121686321161ed666ba7b431bf Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 19 Aug 2017 16:22:03 +0100 Subject: [PATCH] Specify callback URL via http header Signed-off-by: Alex --- gateway/handlers/queueproxy.go | 23 ++++++++++++++++++++++- gateway/queue/types.go | 2 +- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/gateway/handlers/queueproxy.go b/gateway/handlers/queueproxy.go index d93e9c0a..061ae58d 100644 --- a/gateway/handlers/queueproxy.go +++ b/gateway/handlers/queueproxy.go @@ -4,6 +4,7 @@ import ( "fmt" "io/ioutil" "net/http" + "net/url" "github.com/Sirupsen/logrus" "github.com/alexellis/faas/gateway/metrics" @@ -20,23 +21,43 @@ func MakeQueuedProxy(metrics metrics.MetricOptions, wildcard bool, logger *logru if err != nil { w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(err.Error())) return } - w.WriteHeader(http.StatusAccepted) vars := mux.Vars(r) name := vars["name"] + + callbackURLHeader := r.Header.Get("X-Callback-URL") + var callbackURL *url.URL + + if len(callbackURLHeader) > 0 { + urlVal, urlErr := url.Parse(callbackURLHeader) + if urlErr != nil { + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(urlErr.Error())) + return + } + + callbackURL = urlVal + } req := &queue.Request{ Function: name, Body: body, Method: r.Method, QueryString: r.URL.RawQuery, Header: r.Header, + CallbackURL: callbackURL, } err = canQueueRequests.Queue(req) if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(err.Error())) fmt.Println(err) + return } + w.WriteHeader(http.StatusAccepted) + } } diff --git a/gateway/queue/types.go b/gateway/queue/types.go index a00e8441..9dae58fb 100644 --- a/gateway/queue/types.go +++ b/gateway/queue/types.go @@ -8,7 +8,7 @@ type Request struct { Header http.Header Body []byte Method string - CallbackURL url.URL + CallbackURL *url.URL QueryString string Function string }