github.com/treeverse/lakefs@v1.24.1-0.20240520134607-95648127bfb0/pkg/api/tmpl/chi-middleware.tmpl (about) 1 // chi-middleware.tmpl based on https://github.com/deepmap/oapi-codegen/tree/master/pkg/codegen/templates 2 3 // ServerInterfaceWrapper converts contexts to parameters. 4 type ServerInterfaceWrapper struct { 5 Handler ServerInterface 6 HandlerMiddlewares []MiddlewareFunc 7 } 8 9 type MiddlewareFunc func(http.HandlerFunc) http.HandlerFunc 10 11 {{range .}}{{$opid := .OperationId}} 12 13 // {{$opid}} operation middleware 14 func (siw *ServerInterfaceWrapper) {{$opid}}(w http.ResponseWriter, r *http.Request) { 15 ctx := r.Context() 16 {{if or .RequiresParamObject (gt (len .PathParams) 0) }} 17 var err error 18 {{end}} 19 20 {{if .HasBody}}{{range .Bodies}}{{if and .Default (eq .NameTag "JSON")}}// ------------- Body parse ------------- 21 var body {{$opid}}{{.NameTag}}RequestBody 22 parseBody := {{if .Required}}true{{else}}r.ContentLength != 0{{end}} 23 if parseBody { 24 if err := json.NewDecoder(r.Body).Decode(&body); err != nil { 25 http.Error(w, "Error unmarshalling body '{{$opid}}' as JSON", http.StatusBadRequest) 26 return 27 } 28 } 29 {{end}}{{end}}{{end}} 30 31 {{range .PathParams}}// ------------- Path parameter "{{.ParamName}}" ------------- 32 var {{$varName := .GoVariableName}}{{$varName}} {{.TypeDef}} 33 34 {{if .IsPassThrough}} 35 {{$varName}} = chi.URLParam(r, "{{.ParamName}}") 36 {{end}} 37 {{if .IsJson}} 38 err = json.Unmarshal([]byte(chi.URLParam(r, "{{.ParamName}}")), &{{$varName}}) 39 if err != nil { 40 http.Error(w, "Error unmarshaling parameter '{{.ParamName}}' as JSON", http.StatusBadRequest) 41 return 42 } 43 {{end}} 44 {{if .IsStyled}} 45 err = runtime.BindStyledParameter("{{.Style}}",{{.Explode}}, "{{.ParamName}}", chi.URLParam(r, "{{.ParamName}}"), &{{$varName}}) 46 if err != nil { 47 http.Error(w, fmt.Sprintf("Invalid format for parameter {{.ParamName}}: %s", err), http.StatusBadRequest) 48 return 49 } 50 {{end}} 51 52 {{end}} 53 54 {{range .SecurityDefinitions}} 55 ctx = context.WithValue(ctx, {{.ProviderName | ucFirst}}Scopes, {{toStringArray .Scopes}}) 56 {{end}} 57 58 {{if .RequiresParamObject}} 59 // Parameter object where we will unmarshal all parameters from the context 60 var params {{.OperationId}}Params 61 62 {{range $paramIdx, $param := .QueryParams}}// ------------- {{if .Required}}Required{{else}}Optional{{end}} query parameter "{{.ParamName}}" ------------- 63 if paramValue := r.URL.Query().Get("{{.ParamName}}"); paramValue != "" { 64 65 {{if .IsPassThrough}} 66 params.{{.GoName}} = {{if not .Required}}&{{end}}paramValue 67 {{end}} 68 69 {{if .IsJson}} 70 var value {{.TypeDef}} 71 err = json.Unmarshal([]byte(paramValue), &value) 72 if err != nil { 73 http.Error(w, "Error unmarshaling parameter '{{.ParamName}}' as JSON", http.StatusBadRequest) 74 return 75 } 76 77 params.{{.GoName}} = {{if not .Required}}&{{end}}value 78 {{end}} 79 }{{if .Required}} else { 80 http.Error(w, "Query argument {{.ParamName}} is required, but not found", http.StatusBadRequest) 81 return 82 }{{end}} 83 {{if .IsStyled}} 84 err = runtime.BindQueryParameter("{{.Style}}", {{.Explode}}, {{.Required}}, "{{.ParamName}}", r.URL.Query(), ¶ms.{{.GoName}}) 85 if err != nil { 86 http.Error(w, fmt.Sprintf("Invalid format for parameter {{.ParamName}}: %s", err), http.StatusBadRequest) 87 return 88 } 89 {{end}} 90 {{end}} 91 92 {{if .HeaderParams}} 93 headers := r.Header 94 95 {{range .HeaderParams}}// ------------- {{if .Required}}Required{{else}}Optional{{end}} header parameter "{{.ParamName}}" ------------- 96 if valueList, found := headers[http.CanonicalHeaderKey("{{.ParamName}}")]; found { 97 var {{.GoName}} {{.TypeDef}} 98 n := len(valueList) 99 if n != 1 { 100 http.Error(w, fmt.Sprintf("Expected one value for {{.ParamName}}, got %d", n), http.StatusBadRequest) 101 return 102 } 103 104 {{if .IsPassThrough}} 105 params.{{.GoName}} = {{if not .Required}}&{{end}}valueList[0] 106 {{end}} 107 108 {{if .IsJson}} 109 err = json.Unmarshal([]byte(valueList[0]), &{{.GoName}}) 110 if err != nil { 111 http.Error(w, "Error unmarshaling parameter '{{.ParamName}}' as JSON", http.StatusBadRequest) 112 return 113 } 114 {{end}} 115 116 {{if .IsStyled}} 117 err = runtime.BindStyledParameter("{{.Style}}",{{.Explode}}, "{{.ParamName}}", valueList[0], &{{.GoName}}) 118 if err != nil { 119 http.Error(w, fmt.Sprintf("Invalid format for parameter {{.ParamName}}: %s", err), http.StatusBadRequest) 120 return 121 } 122 {{end}} 123 124 params.{{.GoName}} = {{if not .Required}}&{{end}}{{.GoName}} 125 126 } {{if .Required}}else { 127 http.Error(w, fmt.Sprintf("Header parameter {{.ParamName}} is required, but not found: %s", err), http.StatusBadRequest) 128 return 129 }{{end}} 130 131 {{end}} 132 {{end}} 133 134 {{range .CookieParams}} 135 var cookie *http.Cookie 136 137 if cookie, err = r.Cookie("{{.ParamName}}"); err == nil { 138 139 {{- if .IsPassThrough}} 140 params.{{.GoName}} = {{if not .Required}}&{{end}}cookie.Value 141 {{end}} 142 143 {{- if .IsJson}} 144 var value {{.TypeDef}} 145 var decoded string 146 decoded, err := url.QueryUnescape(cookie.Value) 147 if err != nil { 148 http.Error(w, "Error unescaping cookie parameter '{{.ParamName}}'", http.StatusBadRequest) 149 return 150 } 151 152 err = json.Unmarshal([]byte(decoded), &value) 153 if err != nil { 154 http.Error(w, "Error unmarshaling parameter '{{.ParamName}}' as JSON", http.StatusBadRequest) 155 return 156 } 157 158 params.{{.GoName}} = {{if not .Required}}&{{end}}value 159 {{end}} 160 161 {{- if .IsStyled}} 162 var value {{.TypeDef}} 163 err = runtime.BindStyledParameter("simple",{{.Explode}}, "{{.ParamName}}", cookie.Value, &value) 164 if err != nil { 165 http.Error(w, "Invalid format for parameter {{.ParamName}}: %s", http.StatusBadRequest) 166 return 167 } 168 params.{{.GoName}} = {{if not .Required}}&{{end}}value 169 {{end}} 170 171 } 172 173 {{- if .Required}} else { 174 http.Error(w, "Query argument {{.ParamName}} is required, but not found", http.StatusBadRequest) 175 return 176 } 177 {{- end}} 178 {{end}} 179 {{end}} 180 181 var handler = func(w http.ResponseWriter, r *http.Request) { 182 siw.Handler.{{.OperationId}}(w, r{{if .HasBody}}{{range .Bodies}}{{if and .Default (eq .NameTag "JSON")}}, body{{end}}{{end}}{{end}}{{genParamNames .PathParams}}{{if .RequiresParamObject}}, params{{end}}) 183 } 184 185 for _, middleware := range siw.HandlerMiddlewares { 186 handler = middleware(handler) 187 } 188 189 handler(w, r.WithContext(ctx)) 190 } 191 {{end}} 192 193 194