From 1ce310be8b45607216918f39ec2ead783dd322e9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 26 Jul 2015 11:28:53 -0700 Subject: [PATCH] some commenting License: MIT Signed-off-by: Jeromy --- commands/http/client.go | 7 +++++++ commands/http/handler.go | 2 ++ 2 files changed, 9 insertions(+) diff --git a/commands/http/client.go b/commands/http/client.go index 504254676..d0f837598 100644 --- a/commands/http/client.go +++ b/commands/http/client.go @@ -242,6 +242,8 @@ func getResponse(httpRes *http.Response, req cmds.Request) (cmds.Response, error return res, nil } +// read json objects off of the given stream, and write the objects out to +// the 'out' channel func readStreamedJson(req cmds.Request, httpRes *http.Response, out chan<- interface{}) { defer close(out) dec := json.NewDecoder(&httpResponseReader{httpRes}) @@ -270,6 +272,8 @@ func readStreamedJson(req cmds.Request, httpRes *http.Response, out chan<- inter } } +// decode a value of the given type, if the type is nil, attempt to decode into +// an interface{} anyways func decodeTypedVal(t reflect.Type, dec *json.Decoder) (interface{}, error) { var v interface{} var err error @@ -283,6 +287,9 @@ func decodeTypedVal(t reflect.Type, dec *json.Decoder) (interface{}, error) { return v, err } +// httpResponseReader reads from the response body, and checks for an error +// in the http trailer upon EOF, this error if present is returned instead +// of the EOF. type httpResponseReader struct { resp *http.Response } diff --git a/commands/http/handler.go b/commands/http/handler.go index 57ef0a447..cc1f1f34b 100644 --- a/commands/http/handler.go +++ b/commands/http/handler.go @@ -193,6 +193,7 @@ func sendResponse(w http.ResponseWriter, req cmds.Request, res cmds.Response) { mime = applicationJson } } + if mime != "" { h.Set(contentTypeHeader, mime) } @@ -207,6 +208,7 @@ func sendResponse(w http.ResponseWriter, req cmds.Request, res cmds.Response) { // Copies from an io.Reader to a http.ResponseWriter. // Flushes chunks over HTTP stream as they are read (if supported by transport). func copyChunks(status int, w http.ResponseWriter, out io.Reader) error { + // hijack the connection so we can write our own chunked output and trailers hijacker, ok := w.(http.Hijacker) if !ok { log.Error("Failed to create hijacker! cannot continue!")