annotate pkg/middleware/json.go @ 5710:37c8feeecb4d

Merged branch sr-v2 into default.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 20 Feb 2024 21:28:56 +0100
parents 4394daeea96a
children 6270951dda28
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2690
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 // This is Free Software under GNU Affero General Public License v >= 3.0
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2 // without warranty, see README.md and license for details.
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 //
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4 // SPDX-License-Identifier: AGPL-3.0-or-later
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 // License-Filename: LICENSES/AGPL-3.0.txt
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 //
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7 // Copyright (C) 2019 by via donau
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
8 // – Österreichische Wasserstraßen-Gesellschaft mbH
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
9 // Software engineering by Intevation GmbH
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10 //
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 // Author(s):
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de>
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 package middleware
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16 import (
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17 "context"
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18 "encoding/json"
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19 "io"
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 "net/http"
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21 )
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
22
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
23 type jsonInputKeyType int
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
24
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
25 const jsonInputKey jsonInputKeyType = 0
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
26
4164
6f9d00c8cc38 Made 'golint' and 'staticcheck' happy with middleware package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2690
diff changeset
27 // DefaultLimit limits the incoming JSON payload to 2K to
6f9d00c8cc38 Made 'golint' and 'staticcheck' happy with middleware package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2690
diff changeset
28 // prevent flooding the server.
2690
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
29 const DefaultLimit = 2048
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
30
4164
6f9d00c8cc38 Made 'golint' and 'staticcheck' happy with middleware package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2690
diff changeset
31 // GetJSONInput returns the deserialized JSON data from
6f9d00c8cc38 Made 'golint' and 'staticcheck' happy with middleware package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2690
diff changeset
32 // the incoming request if any.
2690
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
33 func GetJSONInput(req *http.Request) interface{} {
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
34 return req.Context().Value(jsonInputKey)
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
35 }
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
36
4244
4394daeea96a Moved JSONHandler into middleware package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4164
diff changeset
37 // JSONMiddleware is a middleware to deserialize the incomming
4164
6f9d00c8cc38 Made 'golint' and 'staticcheck' happy with middleware package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2690
diff changeset
38 // request body to a object to be created by a given input function
6f9d00c8cc38 Made 'golint' and 'staticcheck' happy with middleware package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2690
diff changeset
39 // and stores the result into the context.
6f9d00c8cc38 Made 'golint' and 'staticcheck' happy with middleware package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2690
diff changeset
40 // GetJSONInput can be used to receive the deserialized data.
6f9d00c8cc38 Made 'golint' and 'staticcheck' happy with middleware package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2690
diff changeset
41 // limit limits the size of the incoming body to prevent
6f9d00c8cc38 Made 'golint' and 'staticcheck' happy with middleware package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2690
diff changeset
42 // flooding the server.
4244
4394daeea96a Moved JSONHandler into middleware package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4164
diff changeset
43 func JSONMiddleware(next http.Handler, input func(*http.Request) interface{}, limit int64) http.Handler {
2690
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
44
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
45 return http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
46 dst := input(req)
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
47 defer req.Body.Close()
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
48 var r io.Reader
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
49 switch {
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
50 case limit == 0:
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
51 r = io.LimitReader(req.Body, DefaultLimit)
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
52 case limit > 0:
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
53 r = io.LimitReader(req.Body, limit)
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
54 default:
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
55 r = req.Body
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
56 }
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
57 if err := json.NewDecoder(r).Decode(dst); err != nil {
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
58 http.Error(rw, "error: "+err.Error(), http.StatusBadRequest)
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
59 return
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
60 }
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
61 parent := req.Context()
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
62 ctx := context.WithValue(parent, jsonInputKey, input)
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
63 req = req.WithContext(ctx)
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
64 next.ServeHTTP(rw, req)
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
65 })
ef59a4255670 Added http middlewares to connect to db and parse input as JSON. This complements the JSONHandler which is for JSON in to JSON out. The new middlewares are for JSON in to abitrary out.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
66 }