16534: Merge branch 'master'
[arvados.git] / lib / controller / router / response.go
index aa3af1f64c45194c5d5b3cc2e1996ed212941e5e..543e25d0ce44f73c6cd87cc221aaace564f41a2c 100644 (file)
@@ -12,8 +12,8 @@ import (
        "strings"
        "time"
 
-       "git.curoverse.com/arvados.git/sdk/go/arvados"
-       "git.curoverse.com/arvados.git/sdk/go/httpserver"
+       "git.arvados.org/arvados.git/sdk/go/arvados"
+       "git.arvados.org/arvados.git/sdk/go/httpserver"
 )
 
 const rfc3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00"
@@ -45,16 +45,25 @@ func applySelectParam(selectParam []string, orig map[string]interface{}) map[str
                        selected[attr] = v
                }
        }
-       // Preserve "kind" even if not requested
-       if v, ok := orig["kind"]; ok {
-               selected["kind"] = v
+       // Some keys are always preserved, even if not requested
+       for _, k := range []string{"etag", "kind", "writable_by"} {
+               if v, ok := orig[k]; ok {
+                       selected[k] = v
+               }
        }
        return selected
 }
 
-func (rtr *router) sendResponse(w http.ResponseWriter, resp interface{}, opts responseOptions) {
+func (rtr *router) sendResponse(w http.ResponseWriter, req *http.Request, resp interface{}, opts responseOptions) {
        var tmp map[string]interface{}
 
+       if resp, ok := resp.(http.Handler); ok {
+               // resp knows how to write its own http response
+               // header and body.
+               resp.ServeHTTP(w, req)
+               return
+       }
+
        err := rtr.transcode(resp, &tmp)
        if err != nil {
                rtr.sendError(w, err)
@@ -121,7 +130,9 @@ func (rtr *router) sendResponse(w http.ResponseWriter, resp interface{}, opts re
                }
        }
        w.Header().Set("Content-Type", "application/json")
-       json.NewEncoder(w).Encode(tmp)
+       enc := json.NewEncoder(w)
+       enc.SetEscapeHTML(false)
+       enc.Encode(tmp)
 }
 
 func (rtr *router) sendError(w http.ResponseWriter, err error) {