MCPcopy Create free account
hub / github.com/chain/Core / ServeHTTP

Method ServeHTTP

net/http/httpjson/handler.go:43–85  ·  view source on GitHub ↗
(w http.ResponseWriter, req *http.Request)

Source from the content-addressed store, hash-verified

41}
42
43func (h *handler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
44 var a []reflect.Value
45 if h.hasCtx {
46 ctx := req.Context()
47 ctx = context.WithValue(ctx, reqKey, req)
48 ctx = context.WithValue(ctx, respKey, w)
49 a = append(a, reflect.ValueOf(ctx))
50 }
51 if h.inType != nil {
52 inPtr := reflect.New(h.inType)
53 err := Read(req.Context(), req.Body, inPtr.Interface())
54 if err != nil {
55 h.errFunc(req.Context(), w, err)
56 return
57 }
58 a = append(a, inPtr.Elem())
59 }
60 rv := h.fv.Call(a)
61
62 var (
63 res interface{}
64 err error
65 )
66 switch n := len(rv); {
67 case n == 0:
68 res = &DefaultResponse
69 case n == 1 && !h.fv.Type().Out(0).Implements(errorType):
70 res = rv[0].Interface()
71 case n == 1 && h.fv.Type().Out(0).Implements(errorType):
72 // out param is of type error; its value can still be nil
73 res = &DefaultResponse
74 err, _ = rv[0].Interface().(error)
75 case n == 2:
76 res = rv[0].Interface()
77 err, _ = rv[1].Interface().(error)
78 }
79 if err != nil {
80 h.errFunc(req.Context(), w, err)
81 return
82 }
83
84 Write(req.Context(), w, 200, res)
85}
86
87var (
88 errorType = reflect.TypeOf((*error)(nil)).Elem()

Callers 3

TestContextFunction · 0.45
TestHandlerFunction · 0.45
TestReadErrFunction · 0.45

Calls 3

ReadFunction · 0.85
WriteFunction · 0.85
CallMethod · 0.80

Tested by 3

TestContextFunction · 0.36
TestHandlerFunction · 0.36
TestReadErrFunction · 0.36