File 0005-Bump-the-version-of-go-restful-to-2.16.0.patch of Package kubevirt.25865
From 550ea4bdc9753a7188b8f5ef7c99c71ba427b7be Mon Sep 17 00:00:00 2001
From: bmordeha <bmodeha@redhat.com>
Date: Wed, 13 Jul 2022 13:45:17 +0300
Subject: [PATCH 5/6] Bump the version of go-restful to 2.16.0 Because of a
security issue in go-restful v2.15.0
https://github.com/emicklei/go-restful/pull/503 Signed-off-by: bmordeha
<bmodeha@redhat.com>
---
go.mod | 2 +-
go.sum | 3 +-
.../emicklei/go-restful/.travis.yml | 9 +-
.../emicklei/go-restful/BUILD.bazel | 1 +
.../github.com/emicklei/go-restful/CHANGES.md | 158 +++++++++++-------
.../github.com/emicklei/go-restful/Makefile | 6 +-
.../github.com/emicklei/go-restful/README.md | 37 +++-
.../emicklei/go-restful/container.go | 121 +++++++++++---
.../emicklei/go-restful/cors_filter.go | 67 ++++----
.../github.com/emicklei/go-restful/jsr311.go | 23 ++-
.../emicklei/go-restful/parameter.go | 8 +
.../emicklei/go-restful/path_processor.go | 10 +-
.../github.com/emicklei/go-restful/request.go | 8 +-
.../emicklei/go-restful/response.go | 11 +-
.../github.com/emicklei/go-restful/route.go | 20 ++-
.../emicklei/go-restful/route_builder.go | 94 +++++++----
.../emicklei/go-restful/route_reader.go | 66 ++++++++
.../emicklei/go-restful/service_error.go | 11 +-
.../emicklei/go-restful/web_service.go | 17 ++
vendor/modules.txt | 2 +-
20 files changed, 492 insertions(+), 182 deletions(-)
create mode 100644 vendor/github.com/emicklei/go-restful/route_reader.go
diff --git a/go.mod b/go.mod
index 64b6e1995..54acc0f63 100644
--- a/go.mod
+++ b/go.mod
@@ -9,7 +9,7 @@ require (
github.com/coreos/go-semver v0.3.0
github.com/coreos/prometheus-operator v0.38.1-0.20200424145508-7e176fda06cc
github.com/davecgh/go-spew v1.1.1
- github.com/emicklei/go-restful v2.10.0+incompatible
+ github.com/emicklei/go-restful v2.16.0+incompatible
github.com/emicklei/go-restful-openapi v1.2.0
github.com/evanphx/json-patch v4.9.0+incompatible
github.com/fsnotify/fsnotify v1.4.9
diff --git a/go.sum b/go.sum
index 19fdd201c..2b37d3b7f 100644
--- a/go.sum
+++ b/go.sum
@@ -357,8 +357,9 @@ github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb
github.com/emicklei/go-restful v2.8.1+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
github.com/emicklei/go-restful v2.9.6+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
-github.com/emicklei/go-restful v2.10.0+incompatible h1:l6Soi8WCOOVAeCo4W98iBFC6Og7/X8bpRt51oNLZ2C8=
github.com/emicklei/go-restful v2.10.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
+github.com/emicklei/go-restful v2.16.0+incompatible h1:rgqiKNjTnFQA6kkhFe16D8epTksy9HQ1MyrbDXSdYhM=
+github.com/emicklei/go-restful v2.16.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
github.com/emicklei/go-restful-openapi v1.2.0 h1:ohRZ1yEZERGzqaozBgxa3A0lt6c6KF14xhs3IL9ECwg=
github.com/emicklei/go-restful-openapi v1.2.0/go.mod h1:cy7o3Ge8ZWZ5E90mpEY81sJZZFs2pkuYcLvfngYy1l0=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
diff --git a/vendor/github.com/emicklei/go-restful/.travis.yml b/vendor/github.com/emicklei/go-restful/.travis.yml
index b22f8f547..3a0bf5ff1 100644
--- a/vendor/github.com/emicklei/go-restful/.travis.yml
+++ b/vendor/github.com/emicklei/go-restful/.travis.yml
@@ -3,4 +3,11 @@ language: go
go:
- 1.x
-script: go test -v
\ No newline at end of file
+before_install:
+ - go test -v
+
+script:
+ - go test -race -coverprofile=coverage.txt -covermode=atomic
+
+after_success:
+ - bash <(curl -s https://codecov.io/bash)
\ No newline at end of file
diff --git a/vendor/github.com/emicklei/go-restful/BUILD.bazel b/vendor/github.com/emicklei/go-restful/BUILD.bazel
index 054d30e21..f2d7877cf 100644
--- a/vendor/github.com/emicklei/go-restful/BUILD.bazel
+++ b/vendor/github.com/emicklei/go-restful/BUILD.bazel
@@ -28,6 +28,7 @@ go_library(
"response.go",
"route.go",
"route_builder.go",
+ "route_reader.go",
"router.go",
"service_error.go",
"web_service.go",
diff --git a/vendor/github.com/emicklei/go-restful/CHANGES.md b/vendor/github.com/emicklei/go-restful/CHANGES.md
index cd5b4a60e..3a5299474 100644
--- a/vendor/github.com/emicklei/go-restful/CHANGES.md
+++ b/vendor/github.com/emicklei/go-restful/CHANGES.md
@@ -1,70 +1,104 @@
-## Change history of go-restful
+# Change history of go-restful (v2 only)
-v2.10.0
+## v2.16.0 - 2022-07-11
-- support for Custom Verbs (thanks Vinci Xu <277040271@qq.com>)
-- fixed static example (thanks Arthur <yang_yapo@126.com>)
-- simplify code (thanks Christian Muehlhaeuser <muesli@gmail.com>)
-- added JWT HMAC with SHA-512 authentication code example (thanks Amim Knabben <amim.knabben@gmail.com>)
+- Backported CORS filter. #489 (#493) #503
-v2.9.6
+## v2.15.0 - 2020-11-10
-- small optimization in filter code
+- Add OPTIONS in Webservice
-v2.9.5
+## v2.14.3 - 2020-08-31
+- Fixed duplicate compression in dispatch. #449
+
+
+## v2.14.2 - 2020-08-31
+
+- Added check on writer to prevent compression of response twice. #447
+
+## v2.14.0 - 2020-08-19
+
+- Enable content encoding on Handle and ServeHTTP (#446)
+- List available representations in 406 body (#437)
+- Convert to string using rune() (#443)
+
+## v2.13.0 - 2020-06-21
+
+- 405 Method Not Allowed must have Allow header (#436)
+- add field allowedMethodsWithoutContentType (#424)
+
+## v2.12.0
+
+- support describing response headers (#426)
+- fix openapi examples (#425)
+- merge v3 fix (#422)
+
+## v2.11.1
+
+- fix WriteError return value (#415)
+
+## v2.11.0
+
+- allow prefix and suffix in path variable expression (#414)
+
+## v2.9.6
+
+- support google custome verb (#413)
+
+## v2.9.5
- fix panic in Response.WriteError if err == nil
-v2.9.4
+## v2.9.4
- fix issue #400 , parsing mime type quality
- Route Builder added option for contentEncodingEnabled (#398)
-v2.9.3
+## v2.9.3
- Avoid return of 415 Unsupported Media Type when request body is empty (#396)
-v2.9.2
+## v2.9.2
- Reduce allocations in per-request methods to improve performance (#395)
-v2.9.1
+## v2.9.1
- Fix issue with default responses and invalid status code 0. (#393)
-v2.9.0
+## v2.9.0
- add per Route content encoding setting (overrides container setting)
-v2.8.0
+## v2.8.0
- add Request.QueryParameters()
- add json-iterator (via build tag)
- disable vgo module (until log is moved)
-v2.7.1
+## v2.7.1
- add vgo module
-v2.6.1
+## v2.6.1
- add JSONNewDecoderFunc to allow custom JSON Decoder usage (go 1.10+)
-v2.6.0
+## v2.6.0
- Make JSR 311 routing and path param processing consistent
- Adding description to RouteBuilder.Reads()
- Update example for Swagger12 and OpenAPI
-2017-09-13
+## 2017-09-13
- added route condition functions using `.If(func)` in route building.
-2017-02-16
+## 2017-02-16
- solved issue #304, make operation names unique
-2017-01-30
+## 2017-01-30
[IMPORTANT] For swagger users, change your import statement to:
swagger "github.com/emicklei/go-restful-swagger12"
@@ -72,60 +106,60 @@ v2.6.0
- moved swagger 1.2 code to go-restful-swagger12
- created TAG 2.0.0
-2017-01-27
+## 2017-01-27
- remove defer request body close
- expose Dispatch for testing filters and Routefunctions
- swagger response model cannot be array
- created TAG 1.0.0
-2016-12-22
+## 2016-12-22
- (API change) Remove code related to caching request content. Removes SetCacheReadEntity(doCache bool)
-2016-11-26
+## 2016-11-26
- Default change! now use CurlyRouter (was RouterJSR311)
- Default change! no more caching of request content
- Default change! do not recover from panics
-2016-09-22
+## 2016-09-22
- fix the DefaultRequestContentType feature
-2016-02-14
+## 2016-02-14
- take the qualify factor of the Accept header mediatype into account when deciding the contentype of the response
- add constructors for custom entity accessors for xml and json
-2015-09-27
+## 2015-09-27
- rename new WriteStatusAnd... to WriteHeaderAnd... for consistency
-2015-09-25
+## 2015-09-25
- fixed problem with changing Header after WriteHeader (issue 235)
-2015-09-14
+## 2015-09-14
- changed behavior of WriteHeader (immediate write) and WriteEntity (no status write)
- added support for custom EntityReaderWriters.
-2015-08-06
+## 2015-08-06
- add support for reading entities from compressed request content
- use sync.Pool for compressors of http response and request body
- add Description to Parameter for documentation in Swagger UI
-2015-03-20
+## 2015-03-20
- add configurable logging
-2015-03-18
+## 2015-03-18
- if not specified, the Operation is derived from the Route function
-2015-03-17
+## 2015-03-17
- expose Parameter creation functions
- make trace logger an interface
@@ -134,26 +168,26 @@ v2.6.0
- JSR311 router now handles wildcards
- add Notes to Route
-2014-11-27
+## 2014-11-27
- (api add) PrettyPrint per response. (as proposed in #167)
-2014-11-12
+## 2014-11-12
- (api add) ApiVersion(.) for documentation in Swagger UI
-2014-11-10
+## 2014-11-10
- (api change) struct fields tagged with "description" show up in Swagger UI
-2014-10-31
+## 2014-10-31
- (api change) ReturnsError -> Returns
- (api add) RouteBuilder.Do(aBuilder) for DRY use of RouteBuilder
- fix swagger nested structs
- sort Swagger response messages by code
-2014-10-23
+## 2014-10-23
- (api add) ReturnsError allows you to document Http codes in swagger
- fixed problem with greedy CurlyRouter
@@ -167,73 +201,73 @@ v2.6.0
- (api add) added AllowedDomains in CORS
- (api add) ParameterNamed for detailed documentation
-2014-04-16
+## 2014-04-16
- (api add) expose constructor of Request for testing.
-2014-06-27
+## 2014-06-27
- (api add) ParameterNamed gives access to a Parameter definition and its data (for further specification).
- (api add) SetCacheReadEntity allow scontrol over whether or not the request body is being cached (default true for compatibility reasons).
-2014-07-03
+## 2014-07-03
- (api add) CORS can be configured with a list of allowed domains
-2014-03-12
+## 2014-03-12
- (api add) Route path parameters can use wildcard or regular expressions. (requires CurlyRouter)
-2014-02-26
+## 2014-02-26
- (api add) Request now provides information about the matched Route, see method SelectedRoutePath
-2014-02-17
+## 2014-02-17
- (api change) renamed parameter constants (go-lint checks)
-2014-01-10
+## 2014-01-10
- (api add) support for CloseNotify, see http://golang.org/pkg/net/http/#CloseNotifier
-2014-01-07
+## 2014-01-07
- (api change) Write* methods in Response now return the error or nil.
- added example of serving HTML from a Go template.
- fixed comparing Allowed headers in CORS (is now case-insensitive)
-2013-11-13
+## 2013-11-13
- (api add) Response knows how many bytes are written to the response body.
-2013-10-29
+## 2013-10-29
- (api add) RecoverHandler(handler RecoverHandleFunction) to change how panic recovery is handled. Default behavior is to log and return a stacktrace. This may be a security issue as it exposes sourcecode information.
-2013-10-04
+## 2013-10-04
- (api add) Response knows what HTTP status has been written
- (api add) Request can have attributes (map of string->interface, also called request-scoped variables
-2013-09-12
+## 2013-09-12
- (api change) Router interface simplified
- Implemented CurlyRouter, a Router that does not use|allow regular expressions in paths
-2013-08-05
+## 2013-08-05
- add OPTIONS support
- add CORS support
-2013-08-27
+## 2013-08-27
- fixed some reported issues (see github)
- (api change) deprecated use of WriteError; use WriteErrorString instead
-2014-04-15
+## 2014-04-15
- (fix) v1.0.1 tag: fix Issue 111: WriteErrorString
-2013-08-08
+## 2013-08-08
- (api add) Added implementation Container: a WebServices collection with its own http.ServeMux allowing multiple endpoints per program. Existing uses of go-restful will register their services to the DefaultContainer.
- (api add) the swagger package has be extended to have a UI per container.
@@ -246,38 +280,38 @@ Important API changes:
- (api remove) package variable EnableContentEncoding no longer works ; use restful.DefaultContainer.EnableContentEncoding(true) instead.
-2013-07-06
+## 2013-07-06
- (api add) Added support for response encoding (gzip and deflate(zlib)). This feature is disabled on default (for backwards compatibility). Use restful.EnableContentEncoding = true in your initialization to enable this feature.
-2013-06-19
+## 2013-06-19
- (improve) DoNotRecover option, moved request body closer, improved ReadEntity
-2013-06-03
+## 2013-06-03
- (api change) removed Dispatcher interface, hide PathExpression
- changed receiver names of type functions to be more idiomatic Go
-2013-06-02
+## 2013-06-02
- (optimize) Cache the RegExp compilation of Paths.
-2013-05-22
+## 2013-05-22
- (api add) Added support for request/response filter functions
-2013-05-18
+## 2013-05-18
- (api add) Added feature to change the default Http Request Dispatch function (travis cline)
- (api change) Moved Swagger Webservice to swagger package (see example restful-user)
-[2012-11-14 .. 2013-05-18>
+## [2012-11-14 .. 2013-05-18>
- See https://github.com/emicklei/go-restful/commits
-2012-11-14
+## 2012-11-14
- Initial commit
diff --git a/vendor/github.com/emicklei/go-restful/Makefile b/vendor/github.com/emicklei/go-restful/Makefile
index b40081cc0..3a824ac3d 100644
--- a/vendor/github.com/emicklei/go-restful/Makefile
+++ b/vendor/github.com/emicklei/go-restful/Makefile
@@ -1,7 +1,5 @@
all: test
test:
- go test -v .
-
-ex:
- cd examples && ls *.go | xargs go build -o /tmp/ignore
\ No newline at end of file
+ go vet .
+ go test -cover -v .
\ No newline at end of file
diff --git a/vendor/github.com/emicklei/go-restful/README.md b/vendor/github.com/emicklei/go-restful/README.md
index 4fdbc2731..e5878a668 100644
--- a/vendor/github.com/emicklei/go-restful/README.md
+++ b/vendor/github.com/emicklei/go-restful/README.md
@@ -4,9 +4,10 @@ package for building REST-style Web Services using Google Go
[![Build Status](https://travis-ci.org/emicklei/go-restful.png)](https://travis-ci.org/emicklei/go-restful)
[![Go Report Card](https://goreportcard.com/badge/github.com/emicklei/go-restful)](https://goreportcard.com/report/github.com/emicklei/go-restful)
-[![GoDoc](https://godoc.org/github.com/emicklei/go-restful?status.svg)](https://godoc.org/github.com/emicklei/go-restful)
+[![GoDoc](https://godoc.org/github.com/emicklei/go-restful?status.svg)](https://pkg.go.dev/github.com/emicklei/go-restful)
+[![codecov](https://codecov.io/gh/emicklei/go-restful/branch/master/graph/badge.svg)](https://codecov.io/gh/emicklei/go-restful)
-- [Code examples](https://github.com/emicklei/go-restful/tree/master/examples)
+- [Code examples using v3](https://github.com/emicklei/go-restful/tree/master/examples)
REST asks developers to use HTTP methods explicitly and in a way that's consistent with the protocol definition. This basic REST design principle establishes a one-to-one mapping between create, read, update, and delete (CRUD) operations and HTTP methods. According to this mapping:
@@ -18,6 +19,28 @@ REST asks developers to use HTTP methods explicitly and in a way that's consiste
- PATCH = Update partial content of a resource
- OPTIONS = Get information about the communication options for the request URI
+### Usage
+
+#### Using Go Modules
+
+As of version `v3.0.0` (on the v3 branch), this package supports Go modules.
+
+```
+import (
+ restful "github.com/emicklei/go-restful/v3"
+)
+```
+
+#### Without Go Modules
+
+All versions up to `v2.*.*` (on the master) are not supporting Go modules.
+
+```
+import (
+ restful "github.com/emicklei/go-restful"
+)
+```
+
### Example
```Go
@@ -38,12 +61,12 @@ func (u UserResource) findUser(request *restful.Request, response *restful.Respo
...
}
```
-
-[Full API of a UserResource](https://github.com/emicklei/go-restful/tree/master/examples/restful-user-resource.go)
-
+
+[Full API of a UserResource](https://github.com/emicklei/go-restful/tree/master/examples/user-resource/restful-user-resource.go)
+
### Features
-- Routes for request → function mapping with path parameter (e.g. {id}) support
+- Routes for request → function mapping with path parameter (e.g. {id} but also prefix_{var} and {var}_suffix) support
- Configurable router:
- (default) Fast routing algorithm that allows static elements, [google custom method](https://cloud.google.com/apis/design/custom_methods), regular expressions and dynamic parameters in the URL path (e.g. /resource/name:customVerb, /meetings/{id} or /static/{subpath:*})
- Routing algorithm after [JSR311](http://jsr311.java.net/nonav/releases/1.1/spec/spec.html) that is implemented using (but does **not** accept) regular expressions
@@ -85,4 +108,4 @@ TODO: write examples of these.
Type ```git shortlog -s``` for a full list of contributors.
-© 2012 - 2018, http://ernestmicklei.com. MIT License. Contributions are welcome.
+© 2012 - 2020, http://ernestmicklei.com. MIT License. Contributions are welcome.
diff --git a/vendor/github.com/emicklei/go-restful/container.go b/vendor/github.com/emicklei/go-restful/container.go
index 2638cb292..afca312a4 100644
--- a/vendor/github.com/emicklei/go-restful/container.go
+++ b/vendor/github.com/emicklei/go-restful/container.go
@@ -185,6 +185,11 @@ func logStackOnRecover(panicReason interface{}, httpWriter http.ResponseWriter)
// when a ServiceError is returned during route selection. Default implementation
// calls resp.WriteErrorString(err.Code, err.Message)
func writeServiceError(err ServiceError, req *Request, resp *Response) {
+ for header, values := range err.Header {
+ for _, value := range values {
+ resp.Header().Add(header, value)
+ }
+ }
resp.WriteErrorString(err.Code, err.Message)
}
@@ -201,6 +206,7 @@ func (c *Container) Dispatch(httpWriter http.ResponseWriter, httpRequest *http.R
// Dispatch the incoming Http Request to a matching WebService.
func (c *Container) dispatch(httpWriter http.ResponseWriter, httpRequest *http.Request) {
+ // so we can assign a compressing one later
writer := httpWriter
// CompressingResponseWriter should be closed after all operations are done
@@ -231,28 +237,8 @@ func (c *Container) dispatch(httpWriter http.ResponseWriter, httpRequest *http.R
c.webServices,
httpRequest)
}()
-
- // Detect if compression is needed
- // assume without compression, test for override
- contentEncodingEnabled := c.contentEncodingEnabled
- if route != nil && route.contentEncodingEnabled != nil {
- contentEncodingEnabled = *route.contentEncodingEnabled
- }
- if contentEncodingEnabled {
- doCompress, encoding := wantsCompressedResponse(httpRequest)
- if doCompress {
- var err error
- writer, err = NewCompressingResponseWriter(httpWriter, encoding)
- if err != nil {
- log.Print("unable to install compressor: ", err)
- httpWriter.WriteHeader(http.StatusInternalServerError)
- return
- }
- }
- }
-
if err != nil {
- // a non-200 response has already been written
+ // a non-200 response (may be compressed) has already been written
// run container filters anyway ; they should not touch the response...
chain := FilterChain{Filters: c.containerFilters, Target: func(req *Request, resp *Response) {
switch err.(type) {
@@ -265,6 +251,29 @@ func (c *Container) dispatch(httpWriter http.ResponseWriter, httpRequest *http.R
chain.ProcessFilter(NewRequest(httpRequest), NewResponse(writer))
return
}
+
+ // Unless httpWriter is already an CompressingResponseWriter see if we need to install one
+ if _, isCompressing := httpWriter.(*CompressingResponseWriter); !isCompressing {
+ // Detect if compression is needed
+ // assume without compression, test for override
+ contentEncodingEnabled := c.contentEncodingEnabled
+ if route != nil && route.contentEncodingEnabled != nil {
+ contentEncodingEnabled = *route.contentEncodingEnabled
+ }
+ if contentEncodingEnabled {
+ doCompress, encoding := wantsCompressedResponse(httpRequest)
+ if doCompress {
+ var err error
+ writer, err = NewCompressingResponseWriter(httpWriter, encoding)
+ if err != nil {
+ log.Print("unable to install compressor: ", err)
+ httpWriter.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+ }
+ }
+ }
+
pathProcessor, routerProcessesPath := c.router.(PathProcessor)
if !routerProcessesPath {
pathProcessor = defaultPathProcessor{}
@@ -296,13 +305,75 @@ func fixedPrefixPath(pathspec string) string {
}
// ServeHTTP implements net/http.Handler therefore a Container can be a Handler in a http.Server
-func (c *Container) ServeHTTP(httpwriter http.ResponseWriter, httpRequest *http.Request) {
- c.ServeMux.ServeHTTP(httpwriter, httpRequest)
+func (c *Container) ServeHTTP(httpWriter http.ResponseWriter, httpRequest *http.Request) {
+ // Skip, if content encoding is disabled
+ if !c.contentEncodingEnabled {
+ c.ServeMux.ServeHTTP(httpWriter, httpRequest)
+ return
+ }
+ // content encoding is enabled
+
+ // Skip, if httpWriter is already an CompressingResponseWriter
+ if _, ok := httpWriter.(*CompressingResponseWriter); ok {
+ c.ServeMux.ServeHTTP(httpWriter, httpRequest)
+ return
+ }
+
+ writer := httpWriter
+ // CompressingResponseWriter should be closed after all operations are done
+ defer func() {
+ if compressWriter, ok := writer.(*CompressingResponseWriter); ok {
+ compressWriter.Close()
+ }
+ }()
+
+ doCompress, encoding := wantsCompressedResponse(httpRequest)
+ if doCompress {
+ var err error
+ writer, err = NewCompressingResponseWriter(httpWriter, encoding)
+ if err != nil {
+ log.Print("unable to install compressor: ", err)
+ httpWriter.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+ }
+
+ c.ServeMux.ServeHTTP(writer, httpRequest)
}
// Handle registers the handler for the given pattern. If a handler already exists for pattern, Handle panics.
func (c *Container) Handle(pattern string, handler http.Handler) {
- c.ServeMux.Handle(pattern, handler)
+ c.ServeMux.Handle(pattern, http.HandlerFunc(func(httpWriter http.ResponseWriter, httpRequest *http.Request) {
+ // Skip, if httpWriter is already an CompressingResponseWriter
+ if _, ok := httpWriter.(*CompressingResponseWriter); ok {
+ handler.ServeHTTP(httpWriter, httpRequest)
+ return
+ }
+
+ writer := httpWriter
+
+ // CompressingResponseWriter should be closed after all operations are done
+ defer func() {
+ if compressWriter, ok := writer.(*CompressingResponseWriter); ok {
+ compressWriter.Close()
+ }
+ }()
+
+ if c.contentEncodingEnabled {
+ doCompress, encoding := wantsCompressedResponse(httpRequest)
+ if doCompress {
+ var err error
+ writer, err = NewCompressingResponseWriter(httpWriter, encoding)
+ if err != nil {
+ log.Print("unable to install compressor: ", err)
+ httpWriter.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+ }
+ }
+
+ handler.ServeHTTP(writer, httpRequest)
+ }))
}
// HandleWithFilter registers the handler for the given pattern.
@@ -316,7 +387,7 @@ func (c *Container) HandleWithFilter(pattern string, handler http.Handler) {
}
chain := FilterChain{Filters: c.containerFilters, Target: func(req *Request, resp *Response) {
- handler.ServeHTTP(httpResponse, httpRequest)
+ handler.ServeHTTP(resp, req.Request)
}}
chain.ProcessFilter(NewRequest(httpRequest), NewResponse(httpResponse))
}
diff --git a/vendor/github.com/emicklei/go-restful/cors_filter.go b/vendor/github.com/emicklei/go-restful/cors_filter.go
index 1efeef072..9d18dfb7b 100644
--- a/vendor/github.com/emicklei/go-restful/cors_filter.go
+++ b/vendor/github.com/emicklei/go-restful/cors_filter.go
@@ -18,9 +18,22 @@ import (
// http://enable-cors.org/server.html
// http://www.html5rocks.com/en/tutorials/cors/#toc-handling-a-not-so-simple-request
type CrossOriginResourceSharing struct {
- ExposeHeaders []string // list of Header names
- AllowedHeaders []string // list of Header names
- AllowedDomains []string // list of allowed values for Http Origin. An allowed value can be a regular expression to support subdomain matching. If empty all are allowed.
+ ExposeHeaders []string // list of Header names
+
+ // AllowedHeaders is alist of Header names. Checking is case-insensitive.
+ // The list may contain the special wildcard string ".*" ; all is allowed
+ AllowedHeaders []string
+
+ // AllowedDomains is a list of allowed values for Http Origin.
+ // The list may contain the special wildcard string ".*" ; all is allowed
+ // If empty all are allowed.
+ AllowedDomains []string
+
+ // AllowedDomainFunc is optional and is a function that will do the check
+ // when the origin is not part of the AllowedDomains and it does not contain the wildcard ".*".
+ AllowedDomainFunc func(origin string) bool
+
+ // AllowedMethods is either empty or has a list of http methods names. Checking is case-insensitive.
AllowedMethods []string
MaxAge int // number of seconds before requiring new Options request
CookiesAllowed bool
@@ -119,36 +132,24 @@ func (c CrossOriginResourceSharing) isOriginAllowed(origin string) bool {
if len(origin) == 0 {
return false
}
+ lowerOrigin := strings.ToLower(origin)
if len(c.AllowedDomains) == 0 {
+ if c.AllowedDomainFunc != nil {
+ return c.AllowedDomainFunc(lowerOrigin)
+ }
return true
}
- allowed := false
+ // exact match on each allowed domain
for _, domain := range c.AllowedDomains {
- if domain == origin {
- allowed = true
- break
+ if domain == ".*" || strings.ToLower(domain) == lowerOrigin {
+ return true
}
}
-
- if !allowed {
- if len(c.allowedOriginPatterns) == 0 {
- // compile allowed domains to allowed origin patterns
- allowedOriginRegexps, err := compileRegexps(c.AllowedDomains)
- if err != nil {
- return false
- }
- c.allowedOriginPatterns = allowedOriginRegexps
- }
-
- for _, pattern := range c.allowedOriginPatterns {
- if allowed = pattern.MatchString(origin); allowed {
- break
- }
- }
+ if c.AllowedDomainFunc != nil {
+ return c.AllowedDomainFunc(origin)
}
-
- return allowed
+ return false
}
func (c CrossOriginResourceSharing) setAllowOriginHeader(req *Request, resp *Response) {
@@ -184,19 +185,9 @@ func (c CrossOriginResourceSharing) isValidAccessControlRequestHeader(header str
if strings.ToLower(each) == strings.ToLower(header) {
return true
}
- }
- return false
-}
-
-// Take a list of strings and compile them into a list of regular expressions.
-func compileRegexps(regexpStrings []string) ([]*regexp.Regexp, error) {
- regexps := []*regexp.Regexp{}
- for _, regexpStr := range regexpStrings {
- r, err := regexp.Compile(regexpStr)
- if err != nil {
- return regexps, err
+ if each == "*" {
+ return true
}
- regexps = append(regexps, r)
}
- return regexps, nil
+ return false
}
diff --git a/vendor/github.com/emicklei/go-restful/jsr311.go b/vendor/github.com/emicklei/go-restful/jsr311.go
index 3ede1891e..9cfd59a1c 100644
--- a/vendor/github.com/emicklei/go-restful/jsr311.go
+++ b/vendor/github.com/emicklei/go-restful/jsr311.go
@@ -9,6 +9,7 @@ import (
"fmt"
"net/http"
"sort"
+ "strings"
)
// RouterJSR311 implements the flow for matching Requests to Routes (and consequently Resource Functions)
@@ -98,7 +99,18 @@ func (r RouterJSR311) detectRoute(routes []Route, httpRequest *http.Request) (*R
if trace {
traceLogger.Printf("no Route found (in %d routes) that matches HTTP method %s\n", len(previous), httpRequest.Method)
}
- return nil, NewError(http.StatusMethodNotAllowed, "405: Method Not Allowed")
+ allowed := []string{}
+ allowedLoop:
+ for _, candidate := range previous {
+ for _, method := range allowed {
+ if method == candidate.Method {
+ continue allowedLoop
+ }
+ }
+ allowed = append(allowed, candidate.Method)
+ }
+ header := http.Header{"Allow": []string{strings.Join(allowed, ", ")}}
+ return nil, NewErrorWithHeader(http.StatusMethodNotAllowed, "405: Method Not Allowed", header)
}
// content-type
@@ -135,7 +147,14 @@ func (r RouterJSR311) detectRoute(routes []Route, httpRequest *http.Request) (*R
if trace {
traceLogger.Printf("no Route found (from %d) that matches HTTP Accept: %s\n", len(previous), accept)
}
- return nil, NewError(http.StatusNotAcceptable, "406: Not Acceptable")
+ available := []string{}
+ for _, candidate := range previous {
+ available = append(available, candidate.Produces...)
+ }
+ return nil, NewError(
+ http.StatusNotAcceptable,
+ fmt.Sprintf("406: Not Acceptable\n\nAvailable representations: %s", strings.Join(available, ", ")),
+ )
}
// return r.bestMatchByMedia(outputMediaOk, contentType, accept), nil
return candidates[0], nil
diff --git a/vendor/github.com/emicklei/go-restful/parameter.go b/vendor/github.com/emicklei/go-restful/parameter.go
index e8793304b..febe2cc17 100644
--- a/vendor/github.com/emicklei/go-restful/parameter.go
+++ b/vendor/github.com/emicklei/go-restful/parameter.go
@@ -20,6 +20,9 @@ const (
// FormParameterKind = indicator of Request parameter type "form"
FormParameterKind
+ // MultiPartFormParameterKind = indicator of Request parameter type "multipart/form-data"
+ MultiPartFormParameterKind
+
// CollectionFormatCSV comma separated values `foo,bar`
CollectionFormatCSV = CollectionFormat("csv")
@@ -94,6 +97,11 @@ func (p *Parameter) beForm() *Parameter {
return p
}
+func (p *Parameter) beMultiPartForm() *Parameter {
+ p.data.Kind = MultiPartFormParameterKind
+ return p
+}
+
// Required sets the required field and returns the receiver
func (p *Parameter) Required(required bool) *Parameter {
p.data.Required = required
diff --git a/vendor/github.com/emicklei/go-restful/path_processor.go b/vendor/github.com/emicklei/go-restful/path_processor.go
index 0141b7f3d..141573245 100644
--- a/vendor/github.com/emicklei/go-restful/path_processor.go
+++ b/vendor/github.com/emicklei/go-restful/path_processor.go
@@ -34,7 +34,7 @@ func (d defaultPathProcessor) ExtractParameters(r *Route, _ *WebService, urlPath
value = removeCustomVerb(value)
}
- if strings.HasPrefix(key, "{") { // path-parameter
+ if strings.Index(key, "{") > -1 { // path-parameter
if colon := strings.Index(key, ":"); colon != -1 {
// extract by regex
regPart := key[colon+1 : len(key)-1]
@@ -47,7 +47,13 @@ func (d defaultPathProcessor) ExtractParameters(r *Route, _ *WebService, urlPath
}
} else {
// without enclosing {}
- pathParameters[key[1:len(key)-1]] = value
+ startIndex := strings.Index(key, "{")
+ endKeyIndex := strings.Index(key, "}")
+
+ suffixLength := len(key) - endKeyIndex - 1
+ endValueIndex := len(value) - suffixLength
+
+ pathParameters[key[startIndex+1:endKeyIndex]] = value[startIndex:endValueIndex]
}
}
}
diff --git a/vendor/github.com/emicklei/go-restful/request.go b/vendor/github.com/emicklei/go-restful/request.go
index a20730feb..05d768117 100644
--- a/vendor/github.com/emicklei/go-restful/request.go
+++ b/vendor/github.com/emicklei/go-restful/request.go
@@ -17,6 +17,7 @@ type Request struct {
pathParameters map[string]string
attributes map[string]interface{} // for storing request-scoped values
selectedRoutePath string // root path + route path that matched the request, e.g. /meetings/{id}/attendees
+ selectedRoute *Route
}
func NewRequest(httpRequest *http.Request) *Request {
@@ -114,5 +115,10 @@ func (r Request) Attribute(name string) interface{} {
// SelectedRoutePath root path + route path that matched the request, e.g. /meetings/{id}/attendees
func (r Request) SelectedRoutePath() string {
- return r.selectedRoutePath
+ return r.selectedRoute.Path
+}
+
+// SelectedRoute return the Route that selected by the container
+func (r Request) SelectedRoute() RouteReader {
+ return routeAccessor{route: r.selectedRoute}
}
diff --git a/vendor/github.com/emicklei/go-restful/response.go b/vendor/github.com/emicklei/go-restful/response.go
index fbb48f2da..8f0b56aa2 100644
--- a/vendor/github.com/emicklei/go-restful/response.go
+++ b/vendor/github.com/emicklei/go-restful/response.go
@@ -174,15 +174,16 @@ func (r *Response) WriteHeaderAndJson(status int, value interface{}, contentType
return writeJSON(r, status, contentType, value)
}
-// WriteError write the http status and the error string on the response. err can be nil.
-func (r *Response) WriteError(httpStatus int, err error) error {
+// WriteError writes the http status and the error string on the response. err can be nil.
+// Return an error if writing was not successful.
+func (r *Response) WriteError(httpStatus int, err error) (writeErr error) {
r.err = err
if err == nil {
- r.WriteErrorString(httpStatus, "")
+ writeErr = r.WriteErrorString(httpStatus, "")
} else {
- r.WriteErrorString(httpStatus, err.Error())
+ writeErr = r.WriteErrorString(httpStatus, err.Error())
}
- return err
+ return writeErr
}
// WriteServiceError is a convenience method for a responding with a status and a ServiceError
diff --git a/vendor/github.com/emicklei/go-restful/route.go b/vendor/github.com/emicklei/go-restful/route.go
index fbac6ca14..6ac261293 100644
--- a/vendor/github.com/emicklei/go-restful/route.go
+++ b/vendor/github.com/emicklei/go-restful/route.go
@@ -52,6 +52,11 @@ type Route struct {
// indicate route path has custom verb
hasCustomVerb bool
+
+ // if a request does not include a content-type header then
+ // depending on the method, it may return a 415 Unsupported Media
+ // Must have uppercase HTTP Method names such as GET,HEAD,OPTIONS,...
+ allowedMethodsWithoutContentType []string
}
// Initialize for Route
@@ -64,7 +69,7 @@ func (r *Route) postBuild() {
func (r *Route) wrapRequestResponse(httpWriter http.ResponseWriter, httpRequest *http.Request, pathParams map[string]string) (*Request, *Response) {
wrappedRequest := NewRequest(httpRequest)
wrappedRequest.pathParameters = pathParams
- wrappedRequest.selectedRoutePath = r.Path
+ wrappedRequest.selectedRoute = r
wrappedResponse := NewResponse(httpWriter)
wrappedResponse.requestAccept = httpRequest.Header.Get(HEADER_Accept)
wrappedResponse.routeProduces = r.Produces
@@ -114,8 +119,17 @@ func (r Route) matchesContentType(mimeTypes string) bool {
if len(mimeTypes) == 0 {
// idempotent methods with (most-likely or guaranteed) empty content match missing Content-Type
m := r.Method
- if m == "GET" || m == "HEAD" || m == "OPTIONS" || m == "DELETE" || m == "TRACE" {
- return true
+ // if route specifies less or non-idempotent methods then use that
+ if len(r.allowedMethodsWithoutContentType) > 0 {
+ for _, each := range r.allowedMethodsWithoutContentType {
+ if m == each {
+ return true
+ }
+ }
+ } else {
+ if m == "GET" || m == "HEAD" || m == "OPTIONS" || m == "DELETE" || m == "TRACE" {
+ return true
+ }
}
// proceed with default
mimeTypes = MIME_OCTET
diff --git a/vendor/github.com/emicklei/go-restful/route_builder.go b/vendor/github.com/emicklei/go-restful/route_builder.go
index 0fccf61e9..1d67a4c23 100644
--- a/vendor/github.com/emicklei/go-restful/route_builder.go
+++ b/vendor/github.com/emicklei/go-restful/route_builder.go
@@ -17,14 +17,15 @@ import (
// RouteBuilder is a helper to construct Routes.
type RouteBuilder struct {
- rootPath string
- currentPath string
- produces []string
- consumes []string
- httpMethod string // required
- function RouteFunction // required
- filters []FilterFunction
- conditions []RouteSelectionConditionFunction
+ rootPath string
+ currentPath string
+ produces []string
+ consumes []string
+ httpMethod string // required
+ function RouteFunction // required
+ filters []FilterFunction
+ conditions []RouteSelectionConditionFunction
+ allowedMethodsWithoutContentType []string // see Route
typeNameHandleFunc TypeNameHandleFunction // required
@@ -176,6 +177,15 @@ func (b *RouteBuilder) Returns(code int, message string, model interface{}) *Rou
return b
}
+// ReturnsWithHeaders is similar to Returns, but can specify response headers
+func (b *RouteBuilder) ReturnsWithHeaders(code int, message string, model interface{}, headers map[string]Header) *RouteBuilder {
+ b.Returns(code, message, model)
+ err := b.errorMap[code]
+ err.Headers = headers
+ b.errorMap[code] = err
+ return b
+}
+
// DefaultReturns is a special Returns call that sets the default of the response.
func (b *RouteBuilder) DefaultReturns(message string, model interface{}) *RouteBuilder {
b.defaultResponse = &ResponseError{
@@ -200,14 +210,41 @@ func (b *RouteBuilder) Deprecate() *RouteBuilder {
return b
}
+// AllowedMethodsWithoutContentType overides the default list GET,HEAD,OPTIONS,DELETE,TRACE
+// If a request does not include a content-type header then
+// depending on the method, it may return a 415 Unsupported Media.
+// Must have uppercase HTTP Method names such as GET,HEAD,OPTIONS,...
+func (b *RouteBuilder) AllowedMethodsWithoutContentType(methods []string) *RouteBuilder {
+ b.allowedMethodsWithoutContentType = methods
+ return b
+}
+
// ResponseError represents a response; not necessarily an error.
type ResponseError struct {
Code int
Message string
Model interface{}
+ Headers map[string]Header
IsDefault bool
}
+// Header describes a header for a response of the API
+//
+// For more information: http://goo.gl/8us55a#headerObject
+type Header struct {
+ *Items
+ Description string
+}
+
+// Items describe swagger simple schemas for headers
+type Items struct {
+ Type string
+ Format string
+ Items *Items
+ CollectionFormat string
+ Default interface{}
+}
+
func (b *RouteBuilder) servicePath(path string) *RouteBuilder {
b.rootPath = path
return b
@@ -276,26 +313,27 @@ func (b *RouteBuilder) Build() Route {
operationName = nameOfFunction(b.function)
}
route := Route{
- Method: b.httpMethod,
- Path: concatPath(b.rootPath, b.currentPath),
- Produces: b.produces,
- Consumes: b.consumes,
- Function: b.function,
- Filters: b.filters,
- If: b.conditions,
- relativePath: b.currentPath,
- pathExpr: pathExpr,
- Doc: b.doc,
- Notes: b.notes,
- Operation: operationName,
- ParameterDocs: b.parameters,
- ResponseErrors: b.errorMap,
- DefaultResponse: b.defaultResponse,
- ReadSample: b.readSample,
- WriteSample: b.writeSample,
- Metadata: b.metadata,
- Deprecated: b.deprecated,
- contentEncodingEnabled: b.contentEncodingEnabled,
+ Method: b.httpMethod,
+ Path: concatPath(b.rootPath, b.currentPath),
+ Produces: b.produces,
+ Consumes: b.consumes,
+ Function: b.function,
+ Filters: b.filters,
+ If: b.conditions,
+ relativePath: b.currentPath,
+ pathExpr: pathExpr,
+ Doc: b.doc,
+ Notes: b.notes,
+ Operation: operationName,
+ ParameterDocs: b.parameters,
+ ResponseErrors: b.errorMap,
+ DefaultResponse: b.defaultResponse,
+ ReadSample: b.readSample,
+ WriteSample: b.writeSample,
+ Metadata: b.metadata,
+ Deprecated: b.deprecated,
+ contentEncodingEnabled: b.contentEncodingEnabled,
+ allowedMethodsWithoutContentType: b.allowedMethodsWithoutContentType,
}
route.postBuild()
return route
diff --git a/vendor/github.com/emicklei/go-restful/route_reader.go b/vendor/github.com/emicklei/go-restful/route_reader.go
new file mode 100644
index 000000000..c9f4ee75f
--- /dev/null
+++ b/vendor/github.com/emicklei/go-restful/route_reader.go
@@ -0,0 +1,66 @@
+package restful
+
+// Copyright 2021 Ernest Micklei. All rights reserved.
+// Use of this source code is governed by a license
+// that can be found in the LICENSE file.
+
+type RouteReader interface {
+ Method() string
+ Consumes() []string
+ Path() string
+ Doc() string
+ Notes() string
+ Operation() string
+ ParameterDocs() []*Parameter
+ // Returns a copy
+ Metadata() map[string]interface{}
+ Deprecated() bool
+}
+
+type routeAccessor struct {
+ route *Route
+}
+
+func (r routeAccessor) Method() string {
+ return r.route.Method
+}
+func (r routeAccessor) Consumes() []string {
+ return r.route.Consumes[:]
+}
+func (r routeAccessor) Path() string {
+ return r.route.Path
+}
+func (r routeAccessor) Doc() string {
+ return r.route.Doc
+}
+func (r routeAccessor) Notes() string {
+ return r.route.Notes
+}
+func (r routeAccessor) Operation() string {
+ return r.route.Operation
+}
+func (r routeAccessor) ParameterDocs() []*Parameter {
+ return r.route.ParameterDocs[:]
+}
+
+// Returns a copy
+func (r routeAccessor) Metadata() map[string]interface{} {
+ return copyMap(r.route.Metadata)
+}
+func (r routeAccessor) Deprecated() bool {
+ return r.route.Deprecated
+}
+
+// https://stackoverflow.com/questions/23057785/how-to-copy-a-map
+func copyMap(m map[string]interface{}) map[string]interface{} {
+ cp := make(map[string]interface{})
+ for k, v := range m {
+ vm, ok := v.(map[string]interface{})
+ if ok {
+ cp[k] = copyMap(vm)
+ } else {
+ cp[k] = v
+ }
+ }
+ return cp
+}
diff --git a/vendor/github.com/emicklei/go-restful/service_error.go b/vendor/github.com/emicklei/go-restful/service_error.go
index 62d1108bb..a41575469 100644
--- a/vendor/github.com/emicklei/go-restful/service_error.go
+++ b/vendor/github.com/emicklei/go-restful/service_error.go
@@ -4,12 +4,16 @@ package restful
// Use of this source code is governed by a license
// that can be found in the LICENSE file.
-import "fmt"
+import (
+ "fmt"
+ "net/http"
+)
// ServiceError is a transport object to pass information about a non-Http error occurred in a WebService while processing a request.
type ServiceError struct {
Code int
Message string
+ Header http.Header
}
// NewError returns a ServiceError using the code and reason
@@ -17,6 +21,11 @@ func NewError(code int, message string) ServiceError {
return ServiceError{Code: code, Message: message}
}
+// NewErrorWithHeader returns a ServiceError using the code, reason and header
+func NewErrorWithHeader(code int, message string, header http.Header) ServiceError {
+ return ServiceError{Code: code, Message: message, Header: header}
+}
+
// Error returns a text representation of the service error
func (s ServiceError) Error() string {
return fmt.Sprintf("[ServiceError:%v] %v", s.Code, s.Message)
diff --git a/vendor/github.com/emicklei/go-restful/web_service.go b/vendor/github.com/emicklei/go-restful/web_service.go
index 4f9079674..2eac41497 100644
--- a/vendor/github.com/emicklei/go-restful/web_service.go
+++ b/vendor/github.com/emicklei/go-restful/web_service.go
@@ -165,6 +165,18 @@ func FormParameter(name, description string) *Parameter {
return p
}
+// MultiPartFormParameter creates a new Parameter of kind Form (using multipart/form-data) for documentation purposes.
+// It is initialized as required with string as its DataType.
+func (w *WebService) MultiPartFormParameter(name, description string) *Parameter {
+ return MultiPartFormParameter(name, description)
+}
+
+func MultiPartFormParameter(name, description string) *Parameter {
+ p := &Parameter{&ParameterData{Name: name, Description: description, Required: false, DataType: "string"}}
+ p.beMultiPartForm()
+ return p
+}
+
// Route creates a new Route using the RouteBuilder and add to the ordered list of Routes.
func (w *WebService) Route(builder *RouteBuilder) *WebService {
w.routesLock.Lock()
@@ -288,3 +300,8 @@ func (w *WebService) PATCH(subPath string) *RouteBuilder {
func (w *WebService) DELETE(subPath string) *RouteBuilder {
return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("DELETE").Path(subPath)
}
+
+// OPTIONS is a shortcut for .Method("OPTIONS").Path(subPath)
+func (w *WebService) OPTIONS(subPath string) *RouteBuilder {
+ return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("OPTIONS").Path(subPath)
+}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index b1b07e193..fdf9d6c44 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -57,7 +57,7 @@ github.com/docker/go-units
# github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c
github.com/docker/spdystream
github.com/docker/spdystream/spdy
-# github.com/emicklei/go-restful v2.10.0+incompatible
+# github.com/emicklei/go-restful v2.16.0+incompatible
## explicit
github.com/emicklei/go-restful
github.com/emicklei/go-restful/log
--
2.37.1