14287: Fix accepting JSON-encoded params in request body.
[arvados.git] / lib / controller / router / response.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 package router
6
7 import (
8         "encoding/json"
9         "net/http"
10
11         "git.curoverse.com/arvados.git/sdk/go/arvados"
12         "git.curoverse.com/arvados.git/sdk/go/httpserver"
13 )
14
15 type responseOptions struct {
16         Select []string
17 }
18
19 func (rtr *router) responseOptions(opts interface{}) (responseOptions, error) {
20         var rOpts responseOptions
21         switch opts := opts.(type) {
22         case *arvados.GetOptions:
23                 rOpts.Select = opts.Select
24         }
25         return rOpts, nil
26 }
27
28 func (rtr *router) sendResponse(w http.ResponseWriter, resp interface{}, opts responseOptions) {
29         var tmp map[string]interface{}
30         err := rtr.transcode(resp, &tmp)
31         if err != nil {
32                 rtr.sendError(w, err)
33                 return
34         }
35         if len(opts.Select) > 0 {
36                 selected := map[string]interface{}{}
37                 for _, attr := range opts.Select {
38                         if v, ok := tmp[attr]; ok {
39                                 selected[attr] = v
40                         }
41                 }
42                 tmp = selected
43         }
44         json.NewEncoder(w).Encode(tmp)
45 }
46
47 func (rtr *router) sendError(w http.ResponseWriter, err error) {
48         code := http.StatusInternalServerError
49         if err, ok := err.(interface{ HTTPStatus() int }); ok {
50                 code = err.HTTPStatus()
51         }
52         httpserver.Error(w, err.Error(), code)
53 }