1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
13 "git.curoverse.com/arvados.git/sdk/go/arvados"
14 "git.curoverse.com/arvados.git/sdk/go/httpserver"
17 const rfc3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00"
19 type responseOptions struct {
23 func (rtr *router) responseOptions(opts interface{}) (responseOptions, error) {
24 var rOpts responseOptions
25 switch opts := opts.(type) {
26 case *arvados.GetOptions:
27 rOpts.Select = opts.Select
32 func (rtr *router) sendResponse(w http.ResponseWriter, resp interface{}, opts responseOptions) {
33 var tmp map[string]interface{}
34 err := rtr.transcode(resp, &tmp)
39 if len(opts.Select) > 0 {
40 selected := map[string]interface{}{}
41 for _, attr := range opts.Select {
42 if v, ok := tmp[attr]; ok {
48 // Format non-nil timestamps as rfc3339NanoFixed (by default
49 // they will have been encoded to time.RFC3339Nano, which
50 // omits trailing zeroes).
51 for k, v := range tmp {
52 if !strings.HasSuffix(k, "_at") {
55 switch tv := v.(type) {
60 tmp[k] = tv.Format(rfc3339NanoFixed)
62 tmp[k] = tv.Format(rfc3339NanoFixed)
64 t, err := time.Parse(time.RFC3339Nano, tv)
68 tmp[k] = t.Format(rfc3339NanoFixed)
71 json.NewEncoder(w).Encode(tmp)
74 func (rtr *router) sendError(w http.ResponseWriter, err error) {
75 code := http.StatusInternalServerError
76 if err, ok := err.(interface{ HTTPStatus() int }); ok {
77 code = err.HTTPStatus()
79 httpserver.Error(w, err.Error(), code)