Skip to content

Commit

Permalink
Merge a3729a2 into 6f50669
Browse files Browse the repository at this point in the history
  • Loading branch information
Baptiste Boussemart committed Oct 9, 2018
2 parents 6f50669 + a3729a2 commit 61d0a74
Show file tree
Hide file tree
Showing 4 changed files with 163 additions and 2 deletions.
5 changes: 5 additions & 0 deletions config.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package kitty

import kithttp "github.com/go-kit/kit/transport/http"

// Config holds configuration info for kitty.HTTPTransport.
type Config struct {
// LivenessCheckPath is the path of the health handler (default: "/alivez").
Expand All @@ -10,6 +12,8 @@ type Config struct {
HTTPPort int
// EnablePProf enables pprof urls (default: false).
EnablePProf bool
// EncodeResponse defines the default response encoder for all endpoints (by default: EncodeJSONResponse). It can be overriden for a specific endpoint.
EncodeResponse kithttp.EncodeResponseFunc
}

// DefaultConfig defines the default config of kitty.HTTPTransport.
Expand All @@ -18,4 +22,5 @@ var DefaultConfig = Config{
LivenessCheckPath: "/alivez",
ReadinessCheckPath: "/readyz",
EnablePProf: false,
EncodeResponse: kithttp.EncodeJSONResponse,
}
1 change: 0 additions & 1 deletion endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ func (t *HTTPTransport) Endpoint(method, path string, ep endpoint.Endpoint, opts
path: path,
endpoint: ep,
decoder: kithttp.NopRequestDecoder,
encoder: kithttp.EncodeJSONResponse,
}
for _, opt := range opts {
e = opt(e)
Expand Down
9 changes: 8 additions & 1 deletion http.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ func NewHTTPTransport(cfg Config) *HTTPTransport {
t.cfg.ReadinessCheckPath = cfg.ReadinessCheckPath
}
t.cfg.EnablePProf = cfg.EnablePProf
if cfg.EncodeResponse != nil {
t.cfg.EncodeResponse = cfg.EncodeResponse
}
return t
}

Expand All @@ -80,11 +83,15 @@ func (t *HTTPTransport) RegisterEndpoints(m endpoint.Middleware) error {

// register endpoints
for _, ep := range t.endpoints {
encoder := t.cfg.EncodeResponse
if ep.encoder != nil {
encoder = ep.encoder
}
t.mux.Handle(ep.method, ep.path,
kithttp.NewServer(
m(ep.endpoint),
ep.decoder,
ep.encoder,
encoder,
append(opts, ep.options...)...))
}

Expand Down
150 changes: 150 additions & 0 deletions http_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
package kitty

import (
"context"
"net/http"
"net/http/httptest"
"net/url"
"strings"
"testing"

"github.com/go-kit/kit/endpoint"

kithttp "github.com/go-kit/kit/transport/http"
)

type Response struct {
status string
}

func TestEndpointResponseEncode(t *testing.T) {
cfg := Config{}
HTTPTransport := NewHTTPTransport(cfg)
defaultCalled := false
overrideCalled := false
HTTPTransport.Endpoint("GET", "/test/default", func(ctx context.Context, r interface{}) (interface{}, error) {
defaultCalled = true // this one is not in the encoder, therefore we test we have a JSON string format
return "default response", nil
}).Endpoint("GET", "/test/override", func(ctx context.Context, r interface{}) (interface{}, error) {
return "override response", nil
}, Encoder(func(ctx context.Context, w http.ResponseWriter, r interface{}) error {
w.WriteHeader(501)
overrideCalled = true
return nil
}))
HTTPTransport.RegisterEndpoints(func(e endpoint.Endpoint) endpoint.Endpoint {
return e
})
{
rec := httptest.NewRecorder()
HTTPTransport.ServeHTTP(rec, &http.Request{
Method: "GET",
RequestURI: "/test/default",
URL: &url.URL{
Path: "/test/default",
},
})
if !defaultCalled {
t.Error("default endpoint not called")
}
if rec.Code != 200 {
t.Errorf("default HTTP response status expected: %d", rec.Code)
}
body := string(rec.Body.Bytes())
if strings.TrimSpace(body) != `"default response"` {
t.Errorf("different body expected: %s", body)
}
}
overrideCalled = false
defaultCalled = false
{
rec := httptest.NewRecorder()
HTTPTransport.ServeHTTP(rec, &http.Request{
Method: "GET",
RequestURI: "/test/override",
URL: &url.URL{
Path: "/test/override",
},
})
if !overrideCalled {
t.Error("override endpoint not called")
}
if rec.Code != 501 {
t.Errorf("override HTTP response status expected: %d", rec.Code)
}
body := string(rec.Body.Bytes())
if body != "" {
t.Errorf("different body expected: %s", body)
}
}
}

func TestDefaultResponseEncode(t *testing.T) {
defaultCalled := false
overrideCalled := false
cfg := Config{
EncodeResponse: func(ctx context.Context, w http.ResponseWriter, r interface{}) error {
w.WriteHeader(501)
defaultCalled = true
return nil
},
}
HTTPTransport := NewHTTPTransport(cfg).
Endpoint("GET", "/test/override", func(ctx context.Context, r interface{}) (interface{}, error) {
return "override response", nil
}, Encoder(func(ctx context.Context, w http.ResponseWriter, r interface{}) error {
overrideCalled = true
return kithttp.EncodeJSONResponse(ctx, w, r)
})).
Endpoint("GET", "/test/default", func(ctx context.Context, r interface{}) (interface{}, error) {
return "default response", nil
})
err := HTTPTransport.RegisterEndpoints(func(e endpoint.Endpoint) endpoint.Endpoint {
return e
})
if err != nil {
t.Errorf("error occurred: %+v", err)
}
{
rec := httptest.NewRecorder()
HTTPTransport.ServeHTTP(rec, &http.Request{
Method: "GET",
RequestURI: "/test/default",
URL: &url.URL{
Path: "/test/default",
},
})
if !defaultCalled {
t.Error("default endpoint not called")
}
if rec.Code != 501 {
t.Errorf("default HTTP response status expected: %d", rec.Code)
}
body := string(rec.Body.Bytes())
if body != "" {
t.Errorf("different body expected: %s", body)
}
}
overrideCalled = false
defaultCalled = false
{
rec := httptest.NewRecorder()
HTTPTransport.ServeHTTP(rec, &http.Request{
Method: "GET",
RequestURI: "/test/override",
URL: &url.URL{
Path: "/test/override",
},
})
if !overrideCalled {
t.Error("override endpoint not called")
}
if rec.Code != 200 {
t.Errorf("override HTTP response status expected: %d", rec.Code)
}
body := string(rec.Body.Bytes())
if strings.TrimSpace(body) != `"override response"` {
t.Errorf("different body expected: %s", body)
}
}
}

0 comments on commit 61d0a74

Please sign in to comment.