apiV1GraphQLHandler handles the GraphQL API requests
(ns *string, ah auth.HandlerFunc)
| 114 | |
| 115 | // apiV1GraphQLHandler handles the GraphQL API requests |
| 116 | func (s1 *HttpService) apiV1GraphQL(ns *string, ah auth.HandlerFunc) http.Handler { |
| 117 | dtrace := otel.GetTextMapPropagator() |
| 118 | |
| 119 | h := func(w http.ResponseWriter, r *http.Request) { |
| 120 | var err error |
| 121 | |
| 122 | start := time.Now() |
| 123 | s := s1.Load().(*graphjinService) |
| 124 | |
| 125 | w.Header().Set("Content-Type", "application/json") |
| 126 | |
| 127 | if isWebSocketUpgrade(r) { |
| 128 | s.apiV1Ws(w, r, ah) |
| 129 | return |
| 130 | } |
| 131 | |
| 132 | var req gqlReq |
| 133 | |
| 134 | ctx, opts := newDTrace(dtrace, r) |
| 135 | ctx, span := s.spanStart(ctx, "GraphQL Request", opts...) |
| 136 | defer span.End() |
| 137 | |
| 138 | switch r.Method { |
| 139 | case "POST": |
| 140 | if isMultipartRequest(r) { |
| 141 | if !s.conf.Uploads.Enabled { |
| 142 | err = errMultipartDisabled |
| 143 | break |
| 144 | } |
| 145 | var backend fstable.Backend |
| 146 | if name := s.conf.Uploads.Storage; name != "" { |
| 147 | b, ok := s.gj.FilesystemBackend(name) |
| 148 | if !ok { |
| 149 | err = fmt.Errorf("uploads: storage filesystem %q not configured", name) |
| 150 | break |
| 151 | } |
| 152 | backend = b |
| 153 | } |
| 154 | req, err = parseMultipartGraphQL(r, s.conf.Uploads, backend) |
| 155 | break |
| 156 | } |
| 157 | var b []byte |
| 158 | b, err = io.ReadAll(io.LimitReader(r.Body, maxReadBytes)) |
| 159 | if err == nil { |
| 160 | defer r.Body.Close() //nolint:errcheck |
| 161 | err = json.Unmarshal(b, &req) |
| 162 | } |
| 163 | |
| 164 | case "GET": |
| 165 | q := r.URL.Query() |
| 166 | req.Query = q.Get("query") |
| 167 | req.OpName = q.Get("operationName") |
| 168 | req.Vars = json.RawMessage(q.Get("variables")) |
| 169 | |
| 170 | if ext := q.Get("extensions"); ext != "" { |
| 171 | err = json.Unmarshal([]byte(ext), &req.Ext) |
| 172 | } |
| 173 | } |
no test coverage detected