+func applySelectParam(selectParam []string, orig map[string]interface{}) map[string]interface{} {
+ if len(selectParam) == 0 {
+ return orig
+ }
+ selected := map[string]interface{}{}
+ for _, attr := range selectParam {
+ if v, ok := orig[attr]; ok {
+ selected[attr] = 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, req *http.Request, resp interface{}, opts responseOptions) {