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(), &params.{{.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