17014: Munge list items in controller responses. 17014-controller-container-requests-mungeitems
authorTom Clegg <tom@tomclegg.ca>
Wed, 18 Nov 2020 20:04:28 +0000 (15:04 -0500)
committerTom Clegg <tom@tomclegg.ca>
Wed, 18 Nov 2020 20:04:28 +0000 (15:04 -0500)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@tomclegg.ca>

lib/controller/router/response.go

index c1f44eec3f060c8071ae798fe51c12829c32b4f6..8d143cf6c06109ce7d2bf71b64e7e64813528654 100644 (file)
@@ -97,15 +97,51 @@ func (rtr *router) sendResponse(w http.ResponseWriter, req *http.Request, resp i
                        } else if defaultItemKind != "" {
                                item["kind"] = defaultItemKind
                        }
-                       items[i] = applySelectParam(opts.Select, item)
+                       item = applySelectParam(opts.Select, item)
+                       rtr.mungeItemFields(item)
+                       items[i] = item
                }
                if opts.Count == "none" {
                        delete(tmp, "items_available")
                }
        } else {
                tmp = applySelectParam(opts.Select, tmp)
+               rtr.mungeItemFields(tmp)
        }
 
+       w.Header().Set("Content-Type", "application/json")
+       enc := json.NewEncoder(w)
+       enc.SetEscapeHTML(false)
+       enc.Encode(tmp)
+}
+
+func (rtr *router) sendError(w http.ResponseWriter, err error) {
+       code := http.StatusInternalServerError
+       if err, ok := err.(interface{ HTTPStatus() int }); ok {
+               code = err.HTTPStatus()
+       }
+       httpserver.Error(w, err.Error(), code)
+}
+
+var infixMap = map[string]interface{}{
+       "4zz18": arvados.Collection{},
+       "j7d0g": arvados.Group{},
+}
+
+var mungeKind = regexp.MustCompile(`\..`)
+
+func kind(resp interface{}) string {
+       t := fmt.Sprintf("%T", resp)
+       if !strings.HasPrefix(t, "arvados.") {
+               return ""
+       }
+       return mungeKind.ReplaceAllStringFunc(t, func(s string) string {
+               // "arvados.CollectionList" => "arvados#collectionList"
+               return "#" + strings.ToLower(s[1:])
+       })
+}
+
+func (rtr *router) mungeItemFields(tmp map[string]interface{}) {
        for k, v := range tmp {
                if strings.HasSuffix(k, "_at") {
                        // Format non-nil timestamps as
@@ -156,34 +192,4 @@ func (rtr *router) sendResponse(w http.ResponseWriter, req *http.Request, resp i
                        }
                }
        }
-       w.Header().Set("Content-Type", "application/json")
-       enc := json.NewEncoder(w)
-       enc.SetEscapeHTML(false)
-       enc.Encode(tmp)
-}
-
-func (rtr *router) sendError(w http.ResponseWriter, err error) {
-       code := http.StatusInternalServerError
-       if err, ok := err.(interface{ HTTPStatus() int }); ok {
-               code = err.HTTPStatus()
-       }
-       httpserver.Error(w, err.Error(), code)
-}
-
-var infixMap = map[string]interface{}{
-       "4zz18": arvados.Collection{},
-       "j7d0g": arvados.Group{},
-}
-
-var mungeKind = regexp.MustCompile(`\..`)
-
-func kind(resp interface{}) string {
-       t := fmt.Sprintf("%T", resp)
-       if !strings.HasPrefix(t, "arvados.") {
-               return ""
-       }
-       return mungeKind.ReplaceAllStringFunc(t, func(s string) string {
-               // "arvados.CollectionList" => "arvados#collectionList"
-               return "#" + strings.ToLower(s[1:])
-       })
 }