From a38c7fc1b16a45a35bd35d9e4f4c4cdf225fffca Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E2=80=9CShubham=5FPrajapati=E2=80=9D?=
<“shubhamprajapati032@gmail.com”>
Date: Mon, 26 Sep 2022 23:36:54 +0530
Subject: [PATCH 1/4] Shubh_gPRS-Model
---
.env-example | 4 +-
Caddy/Caddyfile | 72 +
Makefile | 36 +
NGINX/sites-available/tunnel.mydomain.com | 195 +
api/v1/caddy/caddy.go | 167 +-
api/v1/nginx/nginx.go | 164 +-
api/v1/nginx/pb/tunnel/tunnel.pb.go | 343 +
api/v1/nginx/pb/tunnel/tunnel_grpc.pb.go | 359 +
go.mod | 27 +-
go.sum | 100 +-
main.go | 83 +-
middleware/caddy.go | 13 +-
middleware/nginx.go | 2 +
proto/tunnel.proto | 45 +
.../danielkov/gin-helmet/.gitignore | 14 +
.../danielkov/gin-helmet/.travis.yml | 12 +
.../github.com/danielkov/gin-helmet/LICENSE | 21 +
.../github.com/danielkov/gin-helmet/README.md | 28 +
.../github.com/danielkov/gin-helmet/helmet.go | 176 +
vendor/github.com/gin-contrib/cors/.gitignore | 23 +
.../github.com/gin-contrib/cors/.travis.yml | 31 +
vendor/github.com/gin-contrib/cors/LICENSE | 21 +
vendor/github.com/gin-contrib/cors/README.md | 91 +
vendor/github.com/gin-contrib/cors/config.go | 134 +
vendor/github.com/gin-contrib/cors/cors.go | 171 +
vendor/github.com/gin-contrib/cors/utils.go | 85 +
vendor/github.com/gin-contrib/sse/.travis.yml | 26 +
vendor/github.com/gin-contrib/sse/LICENSE | 21 +
vendor/github.com/gin-contrib/sse/README.md | 58 +
.../github.com/gin-contrib/sse/sse-decoder.go | 116 +
.../github.com/gin-contrib/sse/sse-encoder.go | 110 +
vendor/github.com/gin-contrib/sse/writer.go | 24 +
.../github.com/gin-contrib/static/.gitignore | 4 +
.../github.com/gin-contrib/static/.travis.yml | 33 +
vendor/github.com/gin-contrib/static/LICENSE | 21 +
.../github.com/gin-contrib/static/README.md | 54 +
.../github.com/gin-contrib/static/static.go | 70 +
vendor/github.com/gin-gonic/gin/.gitignore | 7 +
vendor/github.com/gin-gonic/gin/.travis.yml | 50 +
vendor/github.com/gin-gonic/gin/AUTHORS.md | 233 +
vendor/github.com/gin-gonic/gin/BENCHMARKS.md | 666 ++
vendor/github.com/gin-gonic/gin/CHANGELOG.md | 418 +
.../gin-gonic/gin/CODE_OF_CONDUCT.md | 46 +
.../github.com/gin-gonic/gin/CONTRIBUTING.md | 13 +
vendor/github.com/gin-gonic/gin/LICENSE | 21 +
vendor/github.com/gin-gonic/gin/Makefile | 71 +
vendor/github.com/gin-gonic/gin/README.md | 2217 ++++
vendor/github.com/gin-gonic/gin/auth.go | 91 +
.../gin-gonic/gin/binding/binding.go | 118 +
.../gin/binding/binding_nomsgpack.go | 112 +
.../gin/binding/default_validator.go | 85 +
.../github.com/gin-gonic/gin/binding/form.go | 63 +
.../gin-gonic/gin/binding/form_mapping.go | 392 +
.../gin-gonic/gin/binding/header.go | 34 +
.../github.com/gin-gonic/gin/binding/json.go | 56 +
.../gin-gonic/gin/binding/msgpack.go | 38 +
.../gin/binding/multipart_form_mapping.go | 66 +
.../gin-gonic/gin/binding/protobuf.go | 36 +
.../github.com/gin-gonic/gin/binding/query.go | 21 +
.../github.com/gin-gonic/gin/binding/uri.go | 18 +
.../github.com/gin-gonic/gin/binding/xml.go | 33 +
.../github.com/gin-gonic/gin/binding/yaml.go | 35 +
vendor/github.com/gin-gonic/gin/codecov.yml | 5 +
vendor/github.com/gin-gonic/gin/context.go | 1178 ++
.../gin-gonic/gin/context_appengine.go | 12 +
vendor/github.com/gin-gonic/gin/debug.go | 103 +
vendor/github.com/gin-gonic/gin/deprecated.go | 21 +
vendor/github.com/gin-gonic/gin/doc.go | 6 +
vendor/github.com/gin-gonic/gin/errors.go | 174 +
vendor/github.com/gin-gonic/gin/fs.go | 45 +
vendor/github.com/gin-gonic/gin/gin.go | 577 +
.../gin/internal/bytesconv/bytesconv.go | 24 +
.../gin-gonic/gin/internal/json/json.go | 23 +
.../gin-gonic/gin/internal/json/jsoniter.go | 24 +
vendor/github.com/gin-gonic/gin/logger.go | 271 +
vendor/github.com/gin-gonic/gin/mode.go | 92 +
vendor/github.com/gin-gonic/gin/path.go | 150 +
vendor/github.com/gin-gonic/gin/recovery.go | 171 +
.../github.com/gin-gonic/gin/render/data.go | 25 +
.../github.com/gin-gonic/gin/render/html.go | 92 +
.../github.com/gin-gonic/gin/render/json.go | 193 +
.../gin-gonic/gin/render/msgpack.go | 42 +
.../gin-gonic/gin/render/protobuf.go | 36 +
.../github.com/gin-gonic/gin/render/reader.go | 48 +
.../gin-gonic/gin/render/redirect.go | 29 +
.../github.com/gin-gonic/gin/render/render.go | 40 +
.../github.com/gin-gonic/gin/render/text.go | 41 +
vendor/github.com/gin-gonic/gin/render/xml.go | 28 +
.../github.com/gin-gonic/gin/render/yaml.go | 36 +
.../gin-gonic/gin/response_writer.go | 126 +
.../github.com/gin-gonic/gin/routergroup.go | 230 +
.../github.com/gin-gonic/gin/test_helpers.go | 16 +
vendor/github.com/gin-gonic/gin/tree.go | 806 ++
vendor/github.com/gin-gonic/gin/utils.go | 153 +
vendor/github.com/gin-gonic/gin/version.go | 8 +
.../go-playground/locales/.gitignore | 24 +
.../go-playground/locales/.travis.yml | 26 +
.../github.com/go-playground/locales/LICENSE | 21 +
.../go-playground/locales/README.md | 172 +
.../locales/currency/currency.go | 308 +
.../github.com/go-playground/locales/logo.png | Bin 0 -> 37360 bytes
.../github.com/go-playground/locales/rules.go | 293 +
.../universal-translator/.gitignore | 25 +
.../universal-translator/.travis.yml | 27 +
.../universal-translator/LICENSE | 21 +
.../universal-translator/README.md | 89 +
.../universal-translator/errors.go | 148 +
.../universal-translator/import_export.go | 274 +
.../universal-translator/logo.png | Bin 0 -> 16598 bytes
.../universal-translator/translator.go | 420 +
.../universal_translator.go | 113 +
.../go-playground/validator/v10/.gitignore | 30 +
.../go-playground/validator/v10/.travis.yml | 29 +
.../go-playground/validator/v10/LICENSE | 22 +
.../go-playground/validator/v10/Makefile | 18 +
.../go-playground/validator/v10/README.md | 299 +
.../go-playground/validator/v10/baked_in.go | 2285 ++++
.../go-playground/validator/v10/cache.go | 322 +
.../validator/v10/country_codes.go | 162 +
.../go-playground/validator/v10/doc.go | 1308 +++
.../go-playground/validator/v10/errors.go | 275 +
.../validator/v10/field_level.go | 119 +
.../go-playground/validator/v10/logo.png | Bin 0 -> 13443 bytes
.../go-playground/validator/v10/regexes.go | 101 +
.../validator/v10/struct_level.go | 175 +
.../validator/v10/translations.go | 11 +
.../go-playground/validator/v10/util.go | 288 +
.../go-playground/validator/v10/validator.go | 477 +
.../validator/v10/validator_instance.go | 619 ++
vendor/github.com/golang/protobuf/AUTHORS | 3 +
.../github.com/golang/protobuf/CONTRIBUTORS | 3 +
vendor/github.com/golang/protobuf/LICENSE | 28 +
.../golang/protobuf/jsonpb/decode.go | 524 +
.../golang/protobuf/jsonpb/encode.go | 559 +
.../github.com/golang/protobuf/jsonpb/json.go | 69 +
.../golang/protobuf/proto/buffer.go | 324 +
.../golang/protobuf/proto/defaults.go | 63 +
.../golang/protobuf/proto/deprecated.go | 113 +
.../golang/protobuf/proto/discard.go | 58 +
.../golang/protobuf/proto/extensions.go | 356 +
.../golang/protobuf/proto/properties.go | 306 +
.../github.com/golang/protobuf/proto/proto.go | 167 +
.../golang/protobuf/proto/registry.go | 317 +
.../golang/protobuf/proto/text_decode.go | 801 ++
.../golang/protobuf/proto/text_encode.go | 560 +
.../github.com/golang/protobuf/proto/wire.go | 78 +
.../golang/protobuf/proto/wrappers.go | 34 +
.../github.com/golang/protobuf/ptypes/any.go | 179 +
.../golang/protobuf/ptypes/any/any.pb.go | 62 +
.../github.com/golang/protobuf/ptypes/doc.go | 10 +
.../golang/protobuf/ptypes/duration.go | 76 +
.../protobuf/ptypes/duration/duration.pb.go | 63 +
.../golang/protobuf/ptypes/timestamp.go | 112 +
.../protobuf/ptypes/timestamp/timestamp.pb.go | 64 +
vendor/github.com/joho/godotenv/.gitignore | 1 +
vendor/github.com/joho/godotenv/.travis.yml | 8 +
vendor/github.com/joho/godotenv/LICENCE | 23 +
vendor/github.com/joho/godotenv/README.md | 163 +
vendor/github.com/joho/godotenv/godotenv.go | 346 +
.../github.com/json-iterator/go/.codecov.yml | 3 +
vendor/github.com/json-iterator/go/.gitignore | 4 +
.../github.com/json-iterator/go/.travis.yml | 14 +
vendor/github.com/json-iterator/go/Gopkg.lock | 21 +
vendor/github.com/json-iterator/go/Gopkg.toml | 26 +
vendor/github.com/json-iterator/go/LICENSE | 21 +
vendor/github.com/json-iterator/go/README.md | 87 +
vendor/github.com/json-iterator/go/adapter.go | 150 +
vendor/github.com/json-iterator/go/any.go | 325 +
.../github.com/json-iterator/go/any_array.go | 278 +
.../github.com/json-iterator/go/any_bool.go | 137 +
.../github.com/json-iterator/go/any_float.go | 83 +
.../github.com/json-iterator/go/any_int32.go | 74 +
.../github.com/json-iterator/go/any_int64.go | 74 +
.../json-iterator/go/any_invalid.go | 82 +
vendor/github.com/json-iterator/go/any_nil.go | 69 +
.../github.com/json-iterator/go/any_number.go | 123 +
.../github.com/json-iterator/go/any_object.go | 374 +
vendor/github.com/json-iterator/go/any_str.go | 166 +
.../github.com/json-iterator/go/any_uint32.go | 74 +
.../github.com/json-iterator/go/any_uint64.go | 74 +
vendor/github.com/json-iterator/go/build.sh | 12 +
vendor/github.com/json-iterator/go/config.go | 375 +
.../go/fuzzy_mode_convert_table.md | 7 +
vendor/github.com/json-iterator/go/iter.go | 349 +
.../github.com/json-iterator/go/iter_array.go | 64 +
.../github.com/json-iterator/go/iter_float.go | 339 +
.../github.com/json-iterator/go/iter_int.go | 345 +
.../json-iterator/go/iter_object.go | 267 +
.../github.com/json-iterator/go/iter_skip.go | 130 +
.../json-iterator/go/iter_skip_sloppy.go | 163 +
.../json-iterator/go/iter_skip_strict.go | 99 +
.../github.com/json-iterator/go/iter_str.go | 215 +
.../github.com/json-iterator/go/jsoniter.go | 18 +
vendor/github.com/json-iterator/go/pool.go | 42 +
vendor/github.com/json-iterator/go/reflect.go | 337 +
.../json-iterator/go/reflect_array.go | 104 +
.../json-iterator/go/reflect_dynamic.go | 70 +
.../json-iterator/go/reflect_extension.go | 483 +
.../json-iterator/go/reflect_json_number.go | 112 +
.../go/reflect_json_raw_message.go | 60 +
.../json-iterator/go/reflect_map.go | 346 +
.../json-iterator/go/reflect_marshaler.go | 225 +
.../json-iterator/go/reflect_native.go | 453 +
.../json-iterator/go/reflect_optional.go | 129 +
.../json-iterator/go/reflect_slice.go | 99 +
.../go/reflect_struct_decoder.go | 1092 ++
.../go/reflect_struct_encoder.go | 211 +
vendor/github.com/json-iterator/go/stream.go | 210 +
.../json-iterator/go/stream_float.go | 111 +
.../github.com/json-iterator/go/stream_int.go | 190 +
.../github.com/json-iterator/go/stream_str.go | 372 +
vendor/github.com/json-iterator/go/test.sh | 12 +
vendor/github.com/leodido/go-urn/.gitignore | 11 +
vendor/github.com/leodido/go-urn/.travis.yml | 18 +
vendor/github.com/leodido/go-urn/LICENSE | 21 +
vendor/github.com/leodido/go-urn/README.md | 55 +
vendor/github.com/leodido/go-urn/machine.go | 1691 +++
.../github.com/leodido/go-urn/machine.go.rl | 159 +
vendor/github.com/leodido/go-urn/makefile | 39 +
vendor/github.com/leodido/go-urn/urn.go | 63 +
vendor/github.com/mattn/go-isatty/.travis.yml | 14 +
vendor/github.com/mattn/go-isatty/LICENSE | 9 +
vendor/github.com/mattn/go-isatty/README.md | 50 +
vendor/github.com/mattn/go-isatty/doc.go | 2 +
vendor/github.com/mattn/go-isatty/go.test.sh | 12 +
.../github.com/mattn/go-isatty/isatty_bsd.go | 18 +
.../mattn/go-isatty/isatty_others.go | 15 +
.../mattn/go-isatty/isatty_plan9.go | 22 +
.../mattn/go-isatty/isatty_solaris.go | 22 +
.../mattn/go-isatty/isatty_tcgets.go | 18 +
.../mattn/go-isatty/isatty_windows.go | 125 +
.../github.com/mattn/go-isatty/renovate.json | 8 +
.../modern-go/concurrent/.gitignore | 1 +
.../modern-go/concurrent/.travis.yml | 14 +
.../github.com/modern-go/concurrent/LICENSE | 201 +
.../github.com/modern-go/concurrent/README.md | 49 +
.../modern-go/concurrent/executor.go | 14 +
.../modern-go/concurrent/go_above_19.go | 15 +
.../modern-go/concurrent/go_below_19.go | 33 +
vendor/github.com/modern-go/concurrent/log.go | 13 +
.../github.com/modern-go/concurrent/test.sh | 12 +
.../concurrent/unbounded_executor.go | 119 +
.../github.com/modern-go/reflect2/.gitignore | 2 +
.../github.com/modern-go/reflect2/.travis.yml | 15 +
.../github.com/modern-go/reflect2/Gopkg.lock | 15 +
.../github.com/modern-go/reflect2/Gopkg.toml | 35 +
vendor/github.com/modern-go/reflect2/LICENSE | 201 +
.../github.com/modern-go/reflect2/README.md | 71 +
.../modern-go/reflect2/go_above_17.go | 8 +
.../modern-go/reflect2/go_above_19.go | 14 +
.../modern-go/reflect2/go_below_17.go | 9 +
.../modern-go/reflect2/go_below_19.go | 14 +
.../github.com/modern-go/reflect2/reflect2.go | 298 +
.../modern-go/reflect2/reflect2_amd64.s | 0
.../modern-go/reflect2/reflect2_kind.go | 30 +
.../modern-go/reflect2/relfect2_386.s | 0
.../modern-go/reflect2/relfect2_amd64p32.s | 0
.../modern-go/reflect2/relfect2_arm.s | 0
.../modern-go/reflect2/relfect2_arm64.s | 0
.../modern-go/reflect2/relfect2_mips64x.s | 0
.../modern-go/reflect2/relfect2_mipsx.s | 0
.../modern-go/reflect2/relfect2_ppc64x.s | 0
.../modern-go/reflect2/relfect2_s390x.s | 0
.../modern-go/reflect2/safe_field.go | 58 +
.../github.com/modern-go/reflect2/safe_map.go | 101 +
.../modern-go/reflect2/safe_slice.go | 92 +
.../modern-go/reflect2/safe_struct.go | 29 +
.../modern-go/reflect2/safe_type.go | 78 +
vendor/github.com/modern-go/reflect2/test.sh | 12 +
.../github.com/modern-go/reflect2/type_map.go | 113 +
.../modern-go/reflect2/unsafe_array.go | 65 +
.../modern-go/reflect2/unsafe_eface.go | 59 +
.../modern-go/reflect2/unsafe_field.go | 74 +
.../modern-go/reflect2/unsafe_iface.go | 64 +
.../modern-go/reflect2/unsafe_link.go | 70 +
.../modern-go/reflect2/unsafe_map.go | 138 +
.../modern-go/reflect2/unsafe_ptr.go | 46 +
.../modern-go/reflect2/unsafe_slice.go | 177 +
.../modern-go/reflect2/unsafe_struct.go | 59 +
.../modern-go/reflect2/unsafe_type.go | 85 +
.../patrickmn/go-cache/CONTRIBUTORS | 9 +
vendor/github.com/patrickmn/go-cache/LICENSE | 19 +
.../github.com/patrickmn/go-cache/README.md | 83 +
vendor/github.com/patrickmn/go-cache/cache.go | 1161 ++
.../github.com/patrickmn/go-cache/sharded.go | 192 +
vendor/github.com/sirupsen/logrus/.gitignore | 4 +
.../github.com/sirupsen/logrus/.golangci.yml | 40 +
vendor/github.com/sirupsen/logrus/.travis.yml | 15 +
.../github.com/sirupsen/logrus/CHANGELOG.md | 259 +
vendor/github.com/sirupsen/logrus/LICENSE | 21 +
vendor/github.com/sirupsen/logrus/README.md | 513 +
vendor/github.com/sirupsen/logrus/alt_exit.go | 76 +
.../github.com/sirupsen/logrus/appveyor.yml | 14 +
.../github.com/sirupsen/logrus/buffer_pool.go | 52 +
vendor/github.com/sirupsen/logrus/doc.go | 26 +
vendor/github.com/sirupsen/logrus/entry.go | 431 +
vendor/github.com/sirupsen/logrus/exported.go | 270 +
.../github.com/sirupsen/logrus/formatter.go | 78 +
vendor/github.com/sirupsen/logrus/hooks.go | 34 +
.../sirupsen/logrus/json_formatter.go | 128 +
vendor/github.com/sirupsen/logrus/logger.go | 404 +
vendor/github.com/sirupsen/logrus/logrus.go | 186 +
.../logrus/terminal_check_appengine.go | 11 +
.../sirupsen/logrus/terminal_check_bsd.go | 13 +
.../sirupsen/logrus/terminal_check_js.go | 7 +
.../logrus/terminal_check_no_terminal.go | 11 +
.../logrus/terminal_check_notappengine.go | 17 +
.../sirupsen/logrus/terminal_check_solaris.go | 11 +
.../sirupsen/logrus/terminal_check_unix.go | 13 +
.../sirupsen/logrus/terminal_check_windows.go | 27 +
.../sirupsen/logrus/text_formatter.go | 339 +
vendor/github.com/sirupsen/logrus/writer.go | 70 +
.../ugorji/go/codec/0_importpath.go | 7 +
vendor/github.com/ugorji/go/codec/LICENSE | 22 +
vendor/github.com/ugorji/go/codec/binc.go | 1219 +++
vendor/github.com/ugorji/go/codec/build.sh | 272 +
vendor/github.com/ugorji/go/codec/cbor.go | 846 ++
vendor/github.com/ugorji/go/codec/codecgen.go | 13 +
vendor/github.com/ugorji/go/codec/decode.go | 2034 ++++
vendor/github.com/ugorji/go/codec/doc.go | 226 +
vendor/github.com/ugorji/go/codec/encode.go | 1373 +++
.../ugorji/go/codec/fast-path.generated.go | 8950 ++++++++++++++++
.../ugorji/go/codec/fast-path.go.tmpl | 503 +
.../ugorji/go/codec/fast-path.not.go | 41 +
vendor/github.com/ugorji/go/codec/float.go | 313 +
.../ugorji/go/codec/gen-dec-array.go.tmpl | 90 +
.../ugorji/go/codec/gen-dec-map.go.tmpl | 53 +
.../ugorji/go/codec/gen-enc-chan.go.tmpl | 27 +
.../ugorji/go/codec/gen-helper.generated.go | 273 +
.../ugorji/go/codec/gen-helper.go.tmpl | 241 +
.../ugorji/go/codec/gen.generated.go | 187 +
vendor/github.com/ugorji/go/codec/gen.go | 2339 ++++
.../go/codec/goversion_arrayof_gte_go15.go | 14 +
.../go/codec/goversion_arrayof_lt_go15.go | 14 +
.../go/codec/goversion_fmt_time_gte_go15.go | 12 +
.../go/codec/goversion_fmt_time_lt_go15.go | 15 +
.../go/codec/goversion_makemap_gte_go19.go | 15 +
.../go/codec/goversion_makemap_lt_go19.go | 12 +
.../go/codec/goversion_maprange_gte_go112.go | 44 +
.../go/codec/goversion_maprange_lt_go112.go | 47 +
...version_unexportedembeddedptr_gte_go110.go | 8 +
...oversion_unexportedembeddedptr_lt_go110.go | 8 +
.../go/codec/goversion_unsupported_lt_go14.go | 17 +
.../go/codec/goversion_vendor_eq_go15.go | 10 +
.../go/codec/goversion_vendor_eq_go16.go | 10 +
.../go/codec/goversion_vendor_gte_go17.go | 8 +
.../go/codec/goversion_vendor_lt_go15.go | 8 +
vendor/github.com/ugorji/go/codec/helper.go | 2682 +++++
vendor/github.com/ugorji/go/codec/helper.s | 0
.../ugorji/go/codec/helper_internal.go | 124 +
.../ugorji/go/codec/helper_not_unsafe.go | 409 +
.../ugorji/go/codec/helper_unsafe.go | 867 ++
vendor/github.com/ugorji/go/codec/json.go | 1493 +++
.../ugorji/go/codec/mammoth-test.go.tmpl | 162 +
.../ugorji/go/codec/mammoth2-test.go.tmpl | 94 +
vendor/github.com/ugorji/go/codec/msgpack.go | 1108 ++
vendor/github.com/ugorji/go/codec/prebuild.go | 136 +
vendor/github.com/ugorji/go/codec/reader.go | 1017 ++
.../ugorji/go/codec/register_ext.go | 38 +
vendor/github.com/ugorji/go/codec/rpc.go | 222 +
vendor/github.com/ugorji/go/codec/simple.go | 647 ++
.../ugorji/go/codec/sort-slice.generated.go | 266 +
.../ugorji/go/codec/sort-slice.go.tmpl | 64 +
.../ugorji/go/codec/test-cbor-goldens.json | 639 ++
vendor/github.com/ugorji/go/codec/test.py | 126 +
vendor/github.com/ugorji/go/codec/writer.go | 267 +
vendor/golang.org/x/crypto/AUTHORS | 3 +
vendor/golang.org/x/crypto/CONTRIBUTORS | 3 +
vendor/golang.org/x/crypto/LICENSE | 27 +
vendor/golang.org/x/crypto/PATENTS | 22 +
vendor/golang.org/x/crypto/sha3/doc.go | 66 +
vendor/golang.org/x/crypto/sha3/hashes.go | 97 +
.../x/crypto/sha3/hashes_generic.go | 27 +
vendor/golang.org/x/crypto/sha3/keccakf.go | 412 +
.../golang.org/x/crypto/sha3/keccakf_amd64.go | 13 +
.../golang.org/x/crypto/sha3/keccakf_amd64.s | 390 +
vendor/golang.org/x/crypto/sha3/register.go | 18 +
vendor/golang.org/x/crypto/sha3/sha3.go | 193 +
vendor/golang.org/x/crypto/sha3/sha3_s390x.go | 284 +
vendor/golang.org/x/crypto/sha3/sha3_s390x.s | 33 +
vendor/golang.org/x/crypto/sha3/shake.go | 173 +
.../golang.org/x/crypto/sha3/shake_generic.go | 19 +
vendor/golang.org/x/crypto/sha3/xor.go | 23 +
.../golang.org/x/crypto/sha3/xor_generic.go | 28 +
.../golang.org/x/crypto/sha3/xor_unaligned.go | 76 +
vendor/golang.org/x/net/AUTHORS | 3 +
vendor/golang.org/x/net/CONTRIBUTORS | 3 +
vendor/golang.org/x/net/LICENSE | 27 +
vendor/golang.org/x/net/PATENTS | 22 +
vendor/golang.org/x/net/http/httpguts/guts.go | 50 +
.../golang.org/x/net/http/httpguts/httplex.go | 348 +
vendor/golang.org/x/net/http2/.gitignore | 2 +
vendor/golang.org/x/net/http2/Dockerfile | 51 +
vendor/golang.org/x/net/http2/Makefile | 3 +
vendor/golang.org/x/net/http2/README | 20 +
vendor/golang.org/x/net/http2/ascii.go | 53 +
vendor/golang.org/x/net/http2/ciphers.go | 641 ++
.../x/net/http2/client_conn_pool.go | 313 +
vendor/golang.org/x/net/http2/databuffer.go | 146 +
vendor/golang.org/x/net/http2/errors.go | 133 +
vendor/golang.org/x/net/http2/flow.go | 52 +
vendor/golang.org/x/net/http2/frame.go | 1614 +++
vendor/golang.org/x/net/http2/go111.go | 30 +
vendor/golang.org/x/net/http2/go115.go | 27 +
vendor/golang.org/x/net/http2/gotrack.go | 170 +
vendor/golang.org/x/net/http2/headermap.go | 87 +
vendor/golang.org/x/net/http2/hpack/encode.go | 240 +
vendor/golang.org/x/net/http2/hpack/hpack.go | 504 +
.../golang.org/x/net/http2/hpack/huffman.go | 229 +
vendor/golang.org/x/net/http2/hpack/tables.go | 479 +
vendor/golang.org/x/net/http2/http2.go | 385 +
vendor/golang.org/x/net/http2/not_go111.go | 21 +
vendor/golang.org/x/net/http2/not_go115.go | 31 +
vendor/golang.org/x/net/http2/pipe.go | 168 +
vendor/golang.org/x/net/http2/server.go | 2978 ++++++
vendor/golang.org/x/net/http2/transport.go | 2757 +++++
vendor/golang.org/x/net/http2/write.go | 370 +
vendor/golang.org/x/net/http2/writesched.go | 248 +
.../x/net/http2/writesched_priority.go | 452 +
.../x/net/http2/writesched_random.go | 77 +
vendor/golang.org/x/net/idna/idna10.0.0.go | 770 ++
vendor/golang.org/x/net/idna/idna9.0.0.go | 718 ++
vendor/golang.org/x/net/idna/punycode.go | 203 +
vendor/golang.org/x/net/idna/tables10.0.0.go | 4560 ++++++++
vendor/golang.org/x/net/idna/tables11.0.0.go | 4654 ++++++++
vendor/golang.org/x/net/idna/tables12.0.0.go | 4734 +++++++++
vendor/golang.org/x/net/idna/tables13.0.0.go | 4840 +++++++++
vendor/golang.org/x/net/idna/tables9.0.0.go | 4487 ++++++++
vendor/golang.org/x/net/idna/trie.go | 72 +
vendor/golang.org/x/net/idna/trieval.go | 119 +
.../x/net/internal/timeseries/timeseries.go | 525 +
vendor/golang.org/x/net/trace/events.go | 532 +
vendor/golang.org/x/net/trace/histogram.go | 365 +
vendor/golang.org/x/net/trace/trace.go | 1130 ++
vendor/golang.org/x/sys/LICENSE | 27 +
vendor/golang.org/x/sys/PATENTS | 22 +
vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s | 18 +
vendor/golang.org/x/sys/cpu/byteorder.go | 66 +
vendor/golang.org/x/sys/cpu/cpu.go | 287 +
vendor/golang.org/x/sys/cpu/cpu_aix.go | 34 +
vendor/golang.org/x/sys/cpu/cpu_arm.go | 73 +
vendor/golang.org/x/sys/cpu/cpu_arm64.go | 172 +
vendor/golang.org/x/sys/cpu/cpu_arm64.s | 32 +
vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go | 12 +
vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go | 22 +
vendor/golang.org/x/sys/cpu/cpu_gc_x86.go | 17 +
.../golang.org/x/sys/cpu/cpu_gccgo_arm64.go | 12 +
.../golang.org/x/sys/cpu/cpu_gccgo_s390x.go | 23 +
vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c | 38 +
vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go | 33 +
vendor/golang.org/x/sys/cpu/cpu_linux.go | 16 +
vendor/golang.org/x/sys/cpu/cpu_linux_arm.go | 39 +
.../golang.org/x/sys/cpu/cpu_linux_arm64.go | 71 +
.../golang.org/x/sys/cpu/cpu_linux_mips64x.go | 24 +
.../golang.org/x/sys/cpu/cpu_linux_noinit.go | 10 +
.../golang.org/x/sys/cpu/cpu_linux_ppc64x.go | 32 +
.../golang.org/x/sys/cpu/cpu_linux_s390x.go | 40 +
vendor/golang.org/x/sys/cpu/cpu_loong64.go | 13 +
vendor/golang.org/x/sys/cpu/cpu_mips64x.go | 16 +
vendor/golang.org/x/sys/cpu/cpu_mipsx.go | 12 +
.../golang.org/x/sys/cpu/cpu_netbsd_arm64.go | 173 +
.../golang.org/x/sys/cpu/cpu_openbsd_arm64.go | 65 +
.../golang.org/x/sys/cpu/cpu_openbsd_arm64.s | 11 +
vendor/golang.org/x/sys/cpu/cpu_other_arm.go | 10 +
.../golang.org/x/sys/cpu/cpu_other_arm64.go | 10 +
.../golang.org/x/sys/cpu/cpu_other_mips64x.go | 13 +
.../golang.org/x/sys/cpu/cpu_other_riscv64.go | 12 +
vendor/golang.org/x/sys/cpu/cpu_ppc64x.go | 17 +
vendor/golang.org/x/sys/cpu/cpu_riscv64.go | 12 +
vendor/golang.org/x/sys/cpu/cpu_s390x.go | 172 +
vendor/golang.org/x/sys/cpu/cpu_s390x.s | 58 +
vendor/golang.org/x/sys/cpu/cpu_wasm.go | 18 +
vendor/golang.org/x/sys/cpu/cpu_x86.go | 145 +
vendor/golang.org/x/sys/cpu/cpu_x86.s | 28 +
vendor/golang.org/x/sys/cpu/cpu_zos.go | 10 +
vendor/golang.org/x/sys/cpu/cpu_zos_s390x.go | 25 +
vendor/golang.org/x/sys/cpu/hwcap_linux.go | 56 +
.../golang.org/x/sys/cpu/syscall_aix_gccgo.go | 27 +
.../x/sys/cpu/syscall_aix_ppc64_gc.go | 36 +
.../sys/internal/unsafeheader/unsafeheader.go | 30 +
vendor/golang.org/x/sys/unix/.gitignore | 2 +
vendor/golang.org/x/sys/unix/README.md | 184 +
.../golang.org/x/sys/unix/affinity_linux.go | 86 +
vendor/golang.org/x/sys/unix/aliases.go | 15 +
vendor/golang.org/x/sys/unix/asm_aix_ppc64.s | 18 +
vendor/golang.org/x/sys/unix/asm_bsd_386.s | 29 +
vendor/golang.org/x/sys/unix/asm_bsd_amd64.s | 29 +
vendor/golang.org/x/sys/unix/asm_bsd_arm.s | 29 +
vendor/golang.org/x/sys/unix/asm_bsd_arm64.s | 29 +
.../golang.org/x/sys/unix/asm_bsd_riscv64.s | 29 +
vendor/golang.org/x/sys/unix/asm_linux_386.s | 66 +
.../golang.org/x/sys/unix/asm_linux_amd64.s | 58 +
vendor/golang.org/x/sys/unix/asm_linux_arm.s | 57 +
.../golang.org/x/sys/unix/asm_linux_arm64.s | 53 +
.../golang.org/x/sys/unix/asm_linux_loong64.s | 54 +
.../golang.org/x/sys/unix/asm_linux_mips64x.s | 57 +
.../golang.org/x/sys/unix/asm_linux_mipsx.s | 55 +
.../golang.org/x/sys/unix/asm_linux_ppc64x.s | 45 +
.../golang.org/x/sys/unix/asm_linux_riscv64.s | 49 +
.../golang.org/x/sys/unix/asm_linux_s390x.s | 57 +
.../x/sys/unix/asm_openbsd_mips64.s | 30 +
.../golang.org/x/sys/unix/asm_solaris_amd64.s | 18 +
vendor/golang.org/x/sys/unix/asm_zos_s390x.s | 426 +
.../golang.org/x/sys/unix/bluetooth_linux.go | 36 +
vendor/golang.org/x/sys/unix/cap_freebsd.go | 196 +
vendor/golang.org/x/sys/unix/constants.go | 14 +
vendor/golang.org/x/sys/unix/dev_aix_ppc.go | 27 +
vendor/golang.org/x/sys/unix/dev_aix_ppc64.go | 29 +
vendor/golang.org/x/sys/unix/dev_darwin.go | 24 +
vendor/golang.org/x/sys/unix/dev_dragonfly.go | 30 +
vendor/golang.org/x/sys/unix/dev_freebsd.go | 30 +
vendor/golang.org/x/sys/unix/dev_linux.go | 42 +
vendor/golang.org/x/sys/unix/dev_netbsd.go | 29 +
vendor/golang.org/x/sys/unix/dev_openbsd.go | 29 +
vendor/golang.org/x/sys/unix/dev_zos.go | 29 +
vendor/golang.org/x/sys/unix/dirent.go | 103 +
vendor/golang.org/x/sys/unix/endian_big.go | 10 +
vendor/golang.org/x/sys/unix/endian_little.go | 10 +
vendor/golang.org/x/sys/unix/env_unix.go | 32 +
vendor/golang.org/x/sys/unix/epoll_zos.go | 221 +
vendor/golang.org/x/sys/unix/fcntl.go | 37 +
vendor/golang.org/x/sys/unix/fcntl_darwin.go | 24 +
.../x/sys/unix/fcntl_linux_32bit.go | 14 +
vendor/golang.org/x/sys/unix/fdset.go | 30 +
vendor/golang.org/x/sys/unix/fstatfs_zos.go | 164 +
vendor/golang.org/x/sys/unix/gccgo.go | 60 +
vendor/golang.org/x/sys/unix/gccgo_c.c | 45 +
.../x/sys/unix/gccgo_linux_amd64.go | 21 +
vendor/golang.org/x/sys/unix/ifreq_linux.go | 142 +
vendor/golang.org/x/sys/unix/ioctl.go | 75 +
vendor/golang.org/x/sys/unix/ioctl_linux.go | 233 +
vendor/golang.org/x/sys/unix/ioctl_zos.go | 74 +
vendor/golang.org/x/sys/unix/mkall.sh | 231 +
vendor/golang.org/x/sys/unix/mkerrors.sh | 778 ++
vendor/golang.org/x/sys/unix/pagesize_unix.go | 16 +
.../golang.org/x/sys/unix/pledge_openbsd.go | 163 +
vendor/golang.org/x/sys/unix/ptrace_darwin.go | 12 +
vendor/golang.org/x/sys/unix/ptrace_ios.go | 12 +
vendor/golang.org/x/sys/unix/race.go | 31 +
vendor/golang.org/x/sys/unix/race0.go | 26 +
.../x/sys/unix/readdirent_getdents.go | 13 +
.../x/sys/unix/readdirent_getdirentries.go | 20 +
.../x/sys/unix/sockcmsg_dragonfly.go | 16 +
.../golang.org/x/sys/unix/sockcmsg_linux.go | 85 +
vendor/golang.org/x/sys/unix/sockcmsg_unix.go | 93 +
.../x/sys/unix/sockcmsg_unix_other.go | 47 +
vendor/golang.org/x/sys/unix/syscall.go | 87 +
vendor/golang.org/x/sys/unix/syscall_aix.go | 600 ++
.../golang.org/x/sys/unix/syscall_aix_ppc.go | 54 +
.../x/sys/unix/syscall_aix_ppc64.go | 85 +
vendor/golang.org/x/sys/unix/syscall_bsd.go | 625 ++
.../golang.org/x/sys/unix/syscall_darwin.go | 830 ++
.../x/sys/unix/syscall_darwin_amd64.go | 51 +
.../x/sys/unix/syscall_darwin_arm64.go | 51 +
.../x/sys/unix/syscall_darwin_libSystem.go | 27 +
.../x/sys/unix/syscall_dragonfly.go | 544 +
.../x/sys/unix/syscall_dragonfly_amd64.go | 57 +
.../golang.org/x/sys/unix/syscall_freebsd.go | 614 ++
.../x/sys/unix/syscall_freebsd_386.go | 67 +
.../x/sys/unix/syscall_freebsd_amd64.go | 67 +
.../x/sys/unix/syscall_freebsd_arm.go | 63 +
.../x/sys/unix/syscall_freebsd_arm64.go | 63 +
.../x/sys/unix/syscall_freebsd_riscv64.go | 63 +
.../golang.org/x/sys/unix/syscall_illumos.go | 185 +
vendor/golang.org/x/sys/unix/syscall_linux.go | 2467 +++++
.../x/sys/unix/syscall_linux_386.go | 342 +
.../x/sys/unix/syscall_linux_alarm.go | 14 +
.../x/sys/unix/syscall_linux_amd64.go | 147 +
.../x/sys/unix/syscall_linux_amd64_gc.go | 13 +
.../x/sys/unix/syscall_linux_arm.go | 244 +
.../x/sys/unix/syscall_linux_arm64.go | 195 +
.../golang.org/x/sys/unix/syscall_linux_gc.go | 15 +
.../x/sys/unix/syscall_linux_gc_386.go | 17 +
.../x/sys/unix/syscall_linux_gc_arm.go | 14 +
.../x/sys/unix/syscall_linux_gccgo_386.go | 31 +
.../x/sys/unix/syscall_linux_gccgo_arm.go | 21 +
.../x/sys/unix/syscall_linux_loong64.go | 222 +
.../x/sys/unix/syscall_linux_mips64x.go | 191 +
.../x/sys/unix/syscall_linux_mipsx.go | 203 +
.../x/sys/unix/syscall_linux_ppc.go | 232 +
.../x/sys/unix/syscall_linux_ppc64x.go | 118 +
.../x/sys/unix/syscall_linux_riscv64.go | 180 +
.../x/sys/unix/syscall_linux_s390x.go | 298 +
.../x/sys/unix/syscall_linux_sparc64.go | 114 +
.../golang.org/x/sys/unix/syscall_netbsd.go | 609 ++
.../x/sys/unix/syscall_netbsd_386.go | 38 +
.../x/sys/unix/syscall_netbsd_amd64.go | 38 +
.../x/sys/unix/syscall_netbsd_arm.go | 38 +
.../x/sys/unix/syscall_netbsd_arm64.go | 38 +
.../golang.org/x/sys/unix/syscall_openbsd.go | 389 +
.../x/sys/unix/syscall_openbsd_386.go | 42 +
.../x/sys/unix/syscall_openbsd_amd64.go | 42 +
.../x/sys/unix/syscall_openbsd_arm.go | 42 +
.../x/sys/unix/syscall_openbsd_arm64.go | 42 +
.../x/sys/unix/syscall_openbsd_libc.go | 27 +
.../x/sys/unix/syscall_openbsd_mips64.go | 39 +
.../golang.org/x/sys/unix/syscall_solaris.go | 1028 ++
.../x/sys/unix/syscall_solaris_amd64.go | 28 +
vendor/golang.org/x/sys/unix/syscall_unix.go | 550 +
.../golang.org/x/sys/unix/syscall_unix_gc.go | 18 +
.../x/sys/unix/syscall_unix_gc_ppc64x.go | 25 +
.../x/sys/unix/syscall_zos_s390x.go | 1823 ++++
vendor/golang.org/x/sys/unix/sysvshm_linux.go | 21 +
vendor/golang.org/x/sys/unix/sysvshm_unix.go | 52 +
.../x/sys/unix/sysvshm_unix_other.go | 14 +
vendor/golang.org/x/sys/unix/timestruct.go | 77 +
.../golang.org/x/sys/unix/unveil_openbsd.go | 42 +
vendor/golang.org/x/sys/unix/xattr_bsd.go | 276 +
.../golang.org/x/sys/unix/zerrors_aix_ppc.go | 1385 +++
.../x/sys/unix/zerrors_aix_ppc64.go | 1386 +++
.../x/sys/unix/zerrors_darwin_amd64.go | 1892 ++++
.../x/sys/unix/zerrors_darwin_arm64.go | 1892 ++++
.../x/sys/unix/zerrors_dragonfly_amd64.go | 1738 +++
.../x/sys/unix/zerrors_freebsd_386.go | 2043 ++++
.../x/sys/unix/zerrors_freebsd_amd64.go | 2040 ++++
.../x/sys/unix/zerrors_freebsd_arm.go | 2034 ++++
.../x/sys/unix/zerrors_freebsd_arm64.go | 2034 ++++
.../x/sys/unix/zerrors_freebsd_riscv64.go | 2148 ++++
vendor/golang.org/x/sys/unix/zerrors_linux.go | 3457 ++++++
.../x/sys/unix/zerrors_linux_386.go | 828 ++
.../x/sys/unix/zerrors_linux_amd64.go | 828 ++
.../x/sys/unix/zerrors_linux_arm.go | 834 ++
.../x/sys/unix/zerrors_linux_arm64.go | 826 ++
.../x/sys/unix/zerrors_linux_loong64.go | 818 ++
.../x/sys/unix/zerrors_linux_mips.go | 835 ++
.../x/sys/unix/zerrors_linux_mips64.go | 835 ++
.../x/sys/unix/zerrors_linux_mips64le.go | 835 ++
.../x/sys/unix/zerrors_linux_mipsle.go | 835 ++
.../x/sys/unix/zerrors_linux_ppc.go | 887 ++
.../x/sys/unix/zerrors_linux_ppc64.go | 891 ++
.../x/sys/unix/zerrors_linux_ppc64le.go | 891 ++
.../x/sys/unix/zerrors_linux_riscv64.go | 815 ++
.../x/sys/unix/zerrors_linux_s390x.go | 890 ++
.../x/sys/unix/zerrors_linux_sparc64.go | 885 ++
.../x/sys/unix/zerrors_netbsd_386.go | 1780 ++++
.../x/sys/unix/zerrors_netbsd_amd64.go | 1770 +++
.../x/sys/unix/zerrors_netbsd_arm.go | 1759 +++
.../x/sys/unix/zerrors_netbsd_arm64.go | 1770 +++
.../x/sys/unix/zerrors_openbsd_386.go | 1668 +++
.../x/sys/unix/zerrors_openbsd_amd64.go | 1775 +++
.../x/sys/unix/zerrors_openbsd_arm.go | 1670 +++
.../x/sys/unix/zerrors_openbsd_arm64.go | 1798 ++++
.../x/sys/unix/zerrors_openbsd_mips64.go | 1863 ++++
.../x/sys/unix/zerrors_solaris_amd64.go | 1557 +++
.../x/sys/unix/zerrors_zos_s390x.go | 860 ++
.../x/sys/unix/zptrace_armnn_linux.go | 42 +
.../x/sys/unix/zptrace_linux_arm64.go | 17 +
.../x/sys/unix/zptrace_mipsnn_linux.go | 51 +
.../x/sys/unix/zptrace_mipsnnle_linux.go | 51 +
.../x/sys/unix/zptrace_x86_linux.go | 81 +
.../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 1485 +++
.../x/sys/unix/zsyscall_aix_ppc64.go | 1443 +++
.../x/sys/unix/zsyscall_aix_ppc64_gc.go | 1192 +++
.../x/sys/unix/zsyscall_aix_ppc64_gccgo.go | 1070 ++
.../x/sys/unix/zsyscall_darwin_amd64.go | 2545 +++++
.../x/sys/unix/zsyscall_darwin_amd64.s | 904 ++
.../x/sys/unix/zsyscall_darwin_arm64.go | 2545 +++++
.../x/sys/unix/zsyscall_darwin_arm64.s | 904 ++
.../x/sys/unix/zsyscall_dragonfly_amd64.go | 1679 +++
.../x/sys/unix/zsyscall_freebsd_386.go | 1889 ++++
.../x/sys/unix/zsyscall_freebsd_amd64.go | 1889 ++++
.../x/sys/unix/zsyscall_freebsd_arm.go | 1889 ++++
.../x/sys/unix/zsyscall_freebsd_arm64.go | 1889 ++++
.../x/sys/unix/zsyscall_freebsd_riscv64.go | 1889 ++++
.../x/sys/unix/zsyscall_illumos_amd64.go | 128 +
.../golang.org/x/sys/unix/zsyscall_linux.go | 2153 ++++
.../x/sys/unix/zsyscall_linux_386.go | 497 +
.../x/sys/unix/zsyscall_linux_amd64.go | 664 ++
.../x/sys/unix/zsyscall_linux_arm.go | 612 ++
.../x/sys/unix/zsyscall_linux_arm64.go | 563 +
.../x/sys/unix/zsyscall_linux_loong64.go | 487 +
.../x/sys/unix/zsyscall_linux_mips.go | 664 ++
.../x/sys/unix/zsyscall_linux_mips64.go | 658 ++
.../x/sys/unix/zsyscall_linux_mips64le.go | 647 ++
.../x/sys/unix/zsyscall_linux_mipsle.go | 664 ++
.../x/sys/unix/zsyscall_linux_ppc.go | 669 ++
.../x/sys/unix/zsyscall_linux_ppc64.go | 715 ++
.../x/sys/unix/zsyscall_linux_ppc64le.go | 715 ++
.../x/sys/unix/zsyscall_linux_riscv64.go | 543 +
.../x/sys/unix/zsyscall_linux_s390x.go | 506 +
.../x/sys/unix/zsyscall_linux_sparc64.go | 659 ++
.../x/sys/unix/zsyscall_netbsd_386.go | 1850 ++++
.../x/sys/unix/zsyscall_netbsd_amd64.go | 1850 ++++
.../x/sys/unix/zsyscall_netbsd_arm.go | 1850 ++++
.../x/sys/unix/zsyscall_netbsd_arm64.go | 1850 ++++
.../x/sys/unix/zsyscall_openbsd_386.go | 2221 ++++
.../x/sys/unix/zsyscall_openbsd_386.s | 796 ++
.../x/sys/unix/zsyscall_openbsd_amd64.go | 2221 ++++
.../x/sys/unix/zsyscall_openbsd_amd64.s | 796 ++
.../x/sys/unix/zsyscall_openbsd_arm.go | 2221 ++++
.../x/sys/unix/zsyscall_openbsd_arm.s | 796 ++
.../x/sys/unix/zsyscall_openbsd_arm64.go | 2221 ++++
.../x/sys/unix/zsyscall_openbsd_arm64.s | 796 ++
.../x/sys/unix/zsyscall_openbsd_mips64.go | 1693 +++
.../x/sys/unix/zsyscall_solaris_amd64.go | 2067 ++++
.../x/sys/unix/zsyscall_zos_s390x.go | 1255 +++
.../x/sys/unix/zsysctl_openbsd_386.go | 274 +
.../x/sys/unix/zsysctl_openbsd_amd64.go | 272 +
.../x/sys/unix/zsysctl_openbsd_arm.go | 274 +
.../x/sys/unix/zsysctl_openbsd_arm64.go | 276 +
.../x/sys/unix/zsysctl_openbsd_mips64.go | 280 +
.../x/sys/unix/zsysnum_darwin_amd64.go | 440 +
.../x/sys/unix/zsysnum_darwin_arm64.go | 438 +
.../x/sys/unix/zsysnum_dragonfly_amd64.go | 317 +
.../x/sys/unix/zsysnum_freebsd_386.go | 394 +
.../x/sys/unix/zsysnum_freebsd_amd64.go | 394 +
.../x/sys/unix/zsysnum_freebsd_arm.go | 394 +
.../x/sys/unix/zsysnum_freebsd_arm64.go | 394 +
.../x/sys/unix/zsysnum_freebsd_riscv64.go | 394 +
.../x/sys/unix/zsysnum_linux_386.go | 450 +
.../x/sys/unix/zsysnum_linux_amd64.go | 372 +
.../x/sys/unix/zsysnum_linux_arm.go | 414 +
.../x/sys/unix/zsysnum_linux_arm64.go | 317 +
.../x/sys/unix/zsysnum_linux_loong64.go | 311 +
.../x/sys/unix/zsysnum_linux_mips.go | 434 +
.../x/sys/unix/zsysnum_linux_mips64.go | 364 +
.../x/sys/unix/zsysnum_linux_mips64le.go | 364 +
.../x/sys/unix/zsysnum_linux_mipsle.go | 434 +
.../x/sys/unix/zsysnum_linux_ppc.go | 441 +
.../x/sys/unix/zsysnum_linux_ppc64.go | 413 +
.../x/sys/unix/zsysnum_linux_ppc64le.go | 413 +
.../x/sys/unix/zsysnum_linux_riscv64.go | 316 +
.../x/sys/unix/zsysnum_linux_s390x.go | 378 +
.../x/sys/unix/zsysnum_linux_sparc64.go | 392 +
.../x/sys/unix/zsysnum_netbsd_386.go | 275 +
.../x/sys/unix/zsysnum_netbsd_amd64.go | 275 +
.../x/sys/unix/zsysnum_netbsd_arm.go | 275 +
.../x/sys/unix/zsysnum_netbsd_arm64.go | 275 +
.../x/sys/unix/zsysnum_openbsd_386.go | 220 +
.../x/sys/unix/zsysnum_openbsd_amd64.go | 220 +
.../x/sys/unix/zsysnum_openbsd_arm.go | 220 +
.../x/sys/unix/zsysnum_openbsd_arm64.go | 219 +
.../x/sys/unix/zsysnum_openbsd_mips64.go | 221 +
.../x/sys/unix/zsysnum_zos_s390x.go | 2670 +++++
.../golang.org/x/sys/unix/ztypes_aix_ppc.go | 354 +
.../golang.org/x/sys/unix/ztypes_aix_ppc64.go | 358 +
.../x/sys/unix/ztypes_darwin_amd64.go | 795 ++
.../x/sys/unix/ztypes_darwin_arm64.go | 795 ++
.../x/sys/unix/ztypes_dragonfly_amd64.go | 474 +
.../x/sys/unix/ztypes_freebsd_386.go | 651 ++
.../x/sys/unix/ztypes_freebsd_amd64.go | 656 ++
.../x/sys/unix/ztypes_freebsd_arm.go | 642 ++
.../x/sys/unix/ztypes_freebsd_arm64.go | 636 ++
.../x/sys/unix/ztypes_freebsd_riscv64.go | 638 ++
.../x/sys/unix/ztypes_illumos_amd64.go | 42 +
vendor/golang.org/x/sys/unix/ztypes_linux.go | 5609 ++++++++++
.../golang.org/x/sys/unix/ztypes_linux_386.go | 690 ++
.../x/sys/unix/ztypes_linux_amd64.go | 705 ++
.../golang.org/x/sys/unix/ztypes_linux_arm.go | 685 ++
.../x/sys/unix/ztypes_linux_arm64.go | 684 ++
.../x/sys/unix/ztypes_linux_loong64.go | 685 ++
.../x/sys/unix/ztypes_linux_mips.go | 690 ++
.../x/sys/unix/ztypes_linux_mips64.go | 687 ++
.../x/sys/unix/ztypes_linux_mips64le.go | 687 ++
.../x/sys/unix/ztypes_linux_mipsle.go | 690 ++
.../golang.org/x/sys/unix/ztypes_linux_ppc.go | 698 ++
.../x/sys/unix/ztypes_linux_ppc64.go | 693 ++
.../x/sys/unix/ztypes_linux_ppc64le.go | 693 ++
.../x/sys/unix/ztypes_linux_riscv64.go | 712 ++
.../x/sys/unix/ztypes_linux_s390x.go | 707 ++
.../x/sys/unix/ztypes_linux_sparc64.go | 688 ++
.../x/sys/unix/ztypes_netbsd_386.go | 502 +
.../x/sys/unix/ztypes_netbsd_amd64.go | 510 +
.../x/sys/unix/ztypes_netbsd_arm.go | 507 +
.../x/sys/unix/ztypes_netbsd_arm64.go | 510 +
.../x/sys/unix/ztypes_openbsd_386.go | 574 +
.../x/sys/unix/ztypes_openbsd_amd64.go | 574 +
.../x/sys/unix/ztypes_openbsd_arm.go | 575 +
.../x/sys/unix/ztypes_openbsd_arm64.go | 568 +
.../x/sys/unix/ztypes_openbsd_mips64.go | 568 +
.../x/sys/unix/ztypes_solaris_amd64.go | 482 +
.../golang.org/x/sys/unix/ztypes_zos_s390x.go | 406 +
vendor/golang.org/x/sys/windows/aliases.go | 13 +
.../golang.org/x/sys/windows/dll_windows.go | 416 +
vendor/golang.org/x/sys/windows/empty.s | 9 +
.../golang.org/x/sys/windows/env_windows.go | 54 +
vendor/golang.org/x/sys/windows/eventlog.go | 21 +
.../golang.org/x/sys/windows/exec_windows.go | 178 +
.../x/sys/windows/memory_windows.go | 48 +
vendor/golang.org/x/sys/windows/mkerrors.bash | 70 +
.../x/sys/windows/mkknownfolderids.bash | 27 +
vendor/golang.org/x/sys/windows/mksyscall.go | 10 +
vendor/golang.org/x/sys/windows/race.go | 31 +
vendor/golang.org/x/sys/windows/race0.go | 26 +
.../x/sys/windows/security_windows.go | 1444 +++
vendor/golang.org/x/sys/windows/service.go | 247 +
.../x/sys/windows/setupapi_windows.go | 1425 +++
vendor/golang.org/x/sys/windows/str.go | 23 +
vendor/golang.org/x/sys/windows/syscall.go | 105 +
.../x/sys/windows/syscall_windows.go | 1811 ++++
.../golang.org/x/sys/windows/types_windows.go | 3260 ++++++
.../x/sys/windows/types_windows_386.go | 35 +
.../x/sys/windows/types_windows_amd64.go | 34 +
.../x/sys/windows/types_windows_arm.go | 35 +
.../x/sys/windows/types_windows_arm64.go | 34 +
.../x/sys/windows/zerrors_windows.go | 9468 +++++++++++++++++
.../x/sys/windows/zknownfolderids_windows.go | 149 +
.../x/sys/windows/zsyscall_windows.go | 4302 ++++++++
vendor/golang.org/x/text/AUTHORS | 3 +
vendor/golang.org/x/text/CONTRIBUTORS | 3 +
vendor/golang.org/x/text/LICENSE | 27 +
vendor/golang.org/x/text/PATENTS | 22 +
.../x/text/secure/bidirule/bidirule.go | 336 +
.../x/text/secure/bidirule/bidirule10.0.0.go | 12 +
.../x/text/secure/bidirule/bidirule9.0.0.go | 15 +
.../golang.org/x/text/transform/transform.go | 709 ++
vendor/golang.org/x/text/unicode/bidi/bidi.go | 359 +
.../golang.org/x/text/unicode/bidi/bracket.go | 335 +
vendor/golang.org/x/text/unicode/bidi/core.go | 1071 ++
vendor/golang.org/x/text/unicode/bidi/prop.go | 206 +
.../x/text/unicode/bidi/tables10.0.0.go | 1816 ++++
.../x/text/unicode/bidi/tables11.0.0.go | 1888 ++++
.../x/text/unicode/bidi/tables12.0.0.go | 1924 ++++
.../x/text/unicode/bidi/tables13.0.0.go | 1956 ++++
.../x/text/unicode/bidi/tables9.0.0.go | 1782 ++++
.../golang.org/x/text/unicode/bidi/trieval.go | 60 +
.../x/text/unicode/norm/composition.go | 512 +
.../x/text/unicode/norm/forminfo.go | 278 +
.../golang.org/x/text/unicode/norm/input.go | 109 +
vendor/golang.org/x/text/unicode/norm/iter.go | 458 +
.../x/text/unicode/norm/normalize.go | 609 ++
.../x/text/unicode/norm/readwriter.go | 125 +
.../x/text/unicode/norm/tables10.0.0.go | 7658 +++++++++++++
.../x/text/unicode/norm/tables11.0.0.go | 7694 ++++++++++++++
.../x/text/unicode/norm/tables12.0.0.go | 7711 ++++++++++++++
.../x/text/unicode/norm/tables13.0.0.go | 7761 ++++++++++++++
.../x/text/unicode/norm/tables9.0.0.go | 7638 +++++++++++++
.../x/text/unicode/norm/transform.go | 88 +
vendor/golang.org/x/text/unicode/norm/trie.go | 54 +
vendor/google.golang.org/genproto/LICENSE | 202 +
.../googleapis/rpc/status/status.pb.go | 206 +
vendor/google.golang.org/grpc/AUTHORS | 1 +
.../google.golang.org/grpc/CODE-OF-CONDUCT.md | 3 +
vendor/google.golang.org/grpc/CONTRIBUTING.md | 60 +
vendor/google.golang.org/grpc/GOVERNANCE.md | 1 +
vendor/google.golang.org/grpc/LICENSE | 202 +
vendor/google.golang.org/grpc/MAINTAINERS.md | 28 +
vendor/google.golang.org/grpc/Makefile | 46 +
vendor/google.golang.org/grpc/NOTICE.txt | 13 +
vendor/google.golang.org/grpc/README.md | 141 +
vendor/google.golang.org/grpc/SECURITY.md | 3 +
.../grpc/attributes/attributes.go | 101 +
vendor/google.golang.org/grpc/backoff.go | 61 +
.../google.golang.org/grpc/backoff/backoff.go | 52 +
.../grpc/balancer/balancer.go | 373 +
.../grpc/balancer/base/balancer.go | 254 +
.../grpc/balancer/base/base.go | 71 +
.../grpc/balancer/conn_state_evaluator.go | 70 +
.../grpc/balancer/grpclb/state/state.go | 51 +
.../grpc/balancer/roundrobin/roundrobin.go | 83 +
.../grpc/balancer_conn_wrappers.go | 416 +
.../grpc_binarylog_v1/binarylog.pb.go | 1187 +++
vendor/google.golang.org/grpc/call.go | 74 +
.../grpc/channelz/channelz.go | 36 +
vendor/google.golang.org/grpc/clientconn.go | 1686 +++
vendor/google.golang.org/grpc/codec.go | 50 +
vendor/google.golang.org/grpc/codegen.sh | 17 +
.../grpc/codes/code_string.go | 62 +
vendor/google.golang.org/grpc/codes/codes.go | 244 +
.../grpc/connectivity/connectivity.go | 94 +
.../grpc/credentials/credentials.go | 291 +
.../grpc/credentials/insecure/insecure.go | 98 +
.../google.golang.org/grpc/credentials/tls.go | 236 +
vendor/google.golang.org/grpc/dialoptions.go | 609 ++
vendor/google.golang.org/grpc/doc.go | 26 +
.../grpc/encoding/encoding.go | 130 +
.../grpc/encoding/proto/proto.go | 58 +
.../grpc/grpclog/component.go | 117 +
.../google.golang.org/grpc/grpclog/grpclog.go | 132 +
.../google.golang.org/grpc/grpclog/logger.go | 87 +
.../grpc/grpclog/loggerv2.go | 259 +
vendor/google.golang.org/grpc/interceptor.go | 104 +
.../grpc/internal/backoff/backoff.go | 73 +
.../balancer/gracefulswitch/gracefulswitch.go | 384 +
.../grpc/internal/balancerload/load.go | 46 +
.../grpc/internal/binarylog/binarylog.go | 189 +
.../internal/binarylog/binarylog_testutil.go | 42 +
.../grpc/internal/binarylog/env_config.go | 208 +
.../grpc/internal/binarylog/method_logger.go | 432 +
.../grpc/internal/binarylog/sink.go | 170 +
.../grpc/internal/buffer/unbounded.go | 85 +
.../grpc/internal/channelz/funcs.go | 789 ++
.../grpc/internal/channelz/id.go | 75 +
.../grpc/internal/channelz/logging.go | 79 +
.../grpc/internal/channelz/types.go | 722 ++
.../grpc/internal/channelz/types_linux.go | 51 +
.../grpc/internal/channelz/types_nonlinux.go | 43 +
.../grpc/internal/channelz/util_linux.go | 37 +
.../grpc/internal/channelz/util_nonlinux.go | 27 +
.../grpc/internal/credentials/credentials.go | 49 +
.../grpc/internal/credentials/spiffe.go | 75 +
.../grpc/internal/credentials/syscallconn.go | 58 +
.../grpc/internal/credentials/util.go | 52 +
.../grpc/internal/envconfig/envconfig.go | 35 +
.../grpc/internal/envconfig/xds.go | 100 +
.../grpc/internal/grpclog/grpclog.go | 126 +
.../grpc/internal/grpclog/prefixLogger.go | 81 +
.../grpc/internal/grpcrand/grpcrand.go | 67 +
.../grpc/internal/grpcsync/event.go | 61 +
.../grpc/internal/grpcutil/encode_duration.go | 63 +
.../grpc/internal/grpcutil/grpcutil.go | 20 +
.../grpc/internal/grpcutil/metadata.go | 40 +
.../grpc/internal/grpcutil/method.go | 89 +
.../grpc/internal/grpcutil/regex.go | 31 +
.../grpc/internal/internal.go | 163 +
.../grpc/internal/metadata/metadata.go | 120 +
.../grpc/internal/pretty/pretty.go | 82 +
.../grpc/internal/resolver/config_selector.go | 167 +
.../internal/resolver/dns/dns_resolver.go | 458 +
.../resolver/passthrough/passthrough.go | 57 +
.../grpc/internal/resolver/unix/unix.go | 73 +
.../internal/serviceconfig/serviceconfig.go | 180 +
.../grpc/internal/status/status.go | 166 +
.../grpc/internal/syscall/syscall_linux.go | 112 +
.../grpc/internal/syscall/syscall_nonlinux.go | 77 +
.../grpc/internal/transport/bdp_estimator.go | 141 +
.../grpc/internal/transport/controlbuf.go | 990 ++
.../grpc/internal/transport/defaults.go | 49 +
.../grpc/internal/transport/flowcontrol.go | 215 +
.../grpc/internal/transport/handler_server.go | 462 +
.../grpc/internal/transport/http2_client.go | 1700 +++
.../grpc/internal/transport/http2_server.go | 1442 +++
.../grpc/internal/transport/http_util.go | 413 +
.../transport/networktype/networktype.go | 46 +
.../grpc/internal/transport/proxy.go | 142 +
.../grpc/internal/transport/transport.go | 813 ++
.../grpc/internal/xds_handshake_cluster.go | 40 +
.../grpc/keepalive/keepalive.go | 85 +
.../grpc/metadata/metadata.go | 251 +
vendor/google.golang.org/grpc/peer/peer.go | 51 +
.../google.golang.org/grpc/picker_wrapper.go | 183 +
vendor/google.golang.org/grpc/pickfirst.go | 183 +
vendor/google.golang.org/grpc/preloader.go | 67 +
.../grpc/reflection/README.md | 18 +
.../grpc_reflection_v1alpha/reflection.pb.go | 953 ++
.../grpc_reflection_v1alpha/reflection.proto | 138 +
.../reflection_grpc.pb.go | 139 +
.../grpc/reflection/serverreflection.go | 324 +
vendor/google.golang.org/grpc/regenerate.sh | 126 +
vendor/google.golang.org/grpc/resolver/map.go | 138 +
.../grpc/resolver/resolver.go | 292 +
.../grpc/resolver_conn_wrapper.go | 176 +
vendor/google.golang.org/grpc/rpc_util.go | 914 ++
vendor/google.golang.org/grpc/server.go | 1909 ++++
.../google.golang.org/grpc/service_config.go | 406 +
.../grpc/serviceconfig/serviceconfig.go | 44 +
.../google.golang.org/grpc/stats/handlers.go | 63 +
vendor/google.golang.org/grpc/stats/stats.go | 319 +
.../google.golang.org/grpc/status/status.go | 135 +
vendor/google.golang.org/grpc/stream.go | 1661 +++
vendor/google.golang.org/grpc/tap/tap.go | 56 +
vendor/google.golang.org/grpc/trace.go | 123 +
vendor/google.golang.org/grpc/version.go | 22 +
vendor/google.golang.org/grpc/vet.sh | 210 +
vendor/google.golang.org/protobuf/LICENSE | 27 +
vendor/google.golang.org/protobuf/PATENTS | 22 +
.../protobuf/encoding/protojson/decode.go | 665 ++
.../protobuf/encoding/protojson/doc.go | 11 +
.../protobuf/encoding/protojson/encode.go | 343 +
.../encoding/protojson/well_known_types.go | 889 ++
.../protobuf/encoding/prototext/decode.go | 770 ++
.../protobuf/encoding/prototext/doc.go | 7 +
.../protobuf/encoding/prototext/encode.go | 370 +
.../protobuf/encoding/protowire/wire.go | 551 +
.../protobuf/internal/descfmt/stringer.go | 318 +
.../protobuf/internal/descopts/options.go | 29 +
.../protobuf/internal/detrand/rand.go | 69 +
.../internal/encoding/defval/default.go | 213 +
.../protobuf/internal/encoding/json/decode.go | 340 +
.../internal/encoding/json/decode_number.go | 254 +
.../internal/encoding/json/decode_string.go | 91 +
.../internal/encoding/json/decode_token.go | 192 +
.../protobuf/internal/encoding/json/encode.go | 276 +
.../encoding/messageset/messageset.go | 242 +
.../protobuf/internal/encoding/tag/tag.go | 207 +
.../protobuf/internal/encoding/text/decode.go | 685 ++
.../internal/encoding/text/decode_number.go | 192 +
.../internal/encoding/text/decode_string.go | 161 +
.../internal/encoding/text/decode_token.go | 373 +
.../protobuf/internal/encoding/text/doc.go | 29 +
.../protobuf/internal/encoding/text/encode.go | 270 +
.../protobuf/internal/errors/errors.go | 89 +
.../protobuf/internal/errors/is_go112.go | 40 +
.../protobuf/internal/errors/is_go113.go | 13 +
.../protobuf/internal/filedesc/build.go | 157 +
.../protobuf/internal/filedesc/desc.go | 633 ++
.../protobuf/internal/filedesc/desc_init.go | 471 +
.../protobuf/internal/filedesc/desc_lazy.go | 704 ++
.../protobuf/internal/filedesc/desc_list.go | 457 +
.../internal/filedesc/desc_list_gen.go | 356 +
.../protobuf/internal/filedesc/placeholder.go | 109 +
.../protobuf/internal/filetype/build.go | 296 +
.../protobuf/internal/flags/flags.go | 24 +
.../internal/flags/proto_legacy_disable.go | 10 +
.../internal/flags/proto_legacy_enable.go | 10 +
.../protobuf/internal/genid/any_gen.go | 34 +
.../protobuf/internal/genid/api_gen.go | 106 +
.../protobuf/internal/genid/descriptor_gen.go | 829 ++
.../protobuf/internal/genid/doc.go | 11 +
.../protobuf/internal/genid/duration_gen.go | 34 +
.../protobuf/internal/genid/empty_gen.go | 19 +
.../protobuf/internal/genid/field_mask_gen.go | 31 +
.../protobuf/internal/genid/goname.go | 25 +
.../protobuf/internal/genid/map_entry.go | 16 +
.../internal/genid/source_context_gen.go | 31 +
.../protobuf/internal/genid/struct_gen.go | 116 +
.../protobuf/internal/genid/timestamp_gen.go | 34 +
.../protobuf/internal/genid/type_gen.go | 184 +
.../protobuf/internal/genid/wrappers.go | 13 +
.../protobuf/internal/genid/wrappers_gen.go | 175 +
.../protobuf/internal/impl/api_export.go | 177 +
.../protobuf/internal/impl/checkinit.go | 141 +
.../protobuf/internal/impl/codec_extension.go | 223 +
.../protobuf/internal/impl/codec_field.go | 830 ++
.../protobuf/internal/impl/codec_gen.go | 5637 ++++++++++
.../protobuf/internal/impl/codec_map.go | 388 +
.../protobuf/internal/impl/codec_map_go111.go | 38 +
.../protobuf/internal/impl/codec_map_go112.go | 12 +
.../protobuf/internal/impl/codec_message.go | 217 +
.../internal/impl/codec_messageset.go | 123 +
.../protobuf/internal/impl/codec_reflect.go | 210 +
.../protobuf/internal/impl/codec_tables.go | 557 +
.../protobuf/internal/impl/codec_unsafe.go | 18 +
.../protobuf/internal/impl/convert.go | 496 +
.../protobuf/internal/impl/convert_list.go | 141 +
.../protobuf/internal/impl/convert_map.go | 121 +
.../protobuf/internal/impl/decode.go | 285 +
.../protobuf/internal/impl/encode.go | 201 +
.../protobuf/internal/impl/enum.go | 21 +
.../protobuf/internal/impl/extension.go | 156 +
.../protobuf/internal/impl/legacy_enum.go | 218 +
.../protobuf/internal/impl/legacy_export.go | 92 +
.../internal/impl/legacy_extension.go | 176 +
.../protobuf/internal/impl/legacy_file.go | 81 +
.../protobuf/internal/impl/legacy_message.go | 563 +
.../protobuf/internal/impl/merge.go | 176 +
.../protobuf/internal/impl/merge_gen.go | 209 +
.../protobuf/internal/impl/message.go | 279 +
.../protobuf/internal/impl/message_reflect.go | 463 +
.../internal/impl/message_reflect_field.go | 543 +
.../internal/impl/message_reflect_gen.go | 249 +
.../protobuf/internal/impl/pointer_reflect.go | 179 +
.../protobuf/internal/impl/pointer_unsafe.go | 175 +
.../protobuf/internal/impl/validate.go | 576 +
.../protobuf/internal/impl/weak.go | 74 +
.../protobuf/internal/order/order.go | 89 +
.../protobuf/internal/order/range.go | 115 +
.../protobuf/internal/pragma/pragma.go | 29 +
.../protobuf/internal/set/ints.go | 58 +
.../protobuf/internal/strs/strings.go | 196 +
.../protobuf/internal/strs/strings_pure.go | 28 +
.../protobuf/internal/strs/strings_unsafe.go | 95 +
.../protobuf/internal/version/version.go | 79 +
.../protobuf/proto/checkinit.go | 71 +
.../protobuf/proto/decode.go | 294 +
.../protobuf/proto/decode_gen.go | 603 ++
.../google.golang.org/protobuf/proto/doc.go | 89 +
.../protobuf/proto/encode.go | 322 +
.../protobuf/proto/encode_gen.go | 97 +
.../google.golang.org/protobuf/proto/equal.go | 171 +
.../protobuf/proto/extension.go | 92 +
.../google.golang.org/protobuf/proto/merge.go | 139 +
.../protobuf/proto/messageset.go | 93 +
.../google.golang.org/protobuf/proto/proto.go | 43 +
.../protobuf/proto/proto_methods.go | 20 +
.../protobuf/proto/proto_reflect.go | 20 +
.../google.golang.org/protobuf/proto/reset.go | 43 +
.../google.golang.org/protobuf/proto/size.go | 97 +
.../protobuf/proto/size_gen.go | 55 +
.../protobuf/proto/wrappers.go | 29 +
.../protobuf/reflect/protodesc/desc.go | 276 +
.../protobuf/reflect/protodesc/desc_init.go | 248 +
.../reflect/protodesc/desc_resolve.go | 286 +
.../reflect/protodesc/desc_validate.go | 374 +
.../protobuf/reflect/protodesc/proto.go | 252 +
.../protobuf/reflect/protoreflect/methods.go | 78 +
.../protobuf/reflect/protoreflect/proto.go | 508 +
.../protobuf/reflect/protoreflect/source.go | 129 +
.../reflect/protoreflect/source_gen.go | 461 +
.../protobuf/reflect/protoreflect/type.go | 666 ++
.../protobuf/reflect/protoreflect/value.go | 285 +
.../reflect/protoreflect/value_pure.go | 60 +
.../reflect/protoreflect/value_union.go | 438 +
.../reflect/protoreflect/value_unsafe.go | 99 +
.../reflect/protoregistry/registry.go | 882 ++
.../protobuf/runtime/protoiface/legacy.go | 15 +
.../protobuf/runtime/protoiface/methods.go | 168 +
.../protobuf/runtime/protoimpl/impl.go | 44 +
.../protobuf/runtime/protoimpl/version.go | 60 +
.../types/descriptorpb/descriptor.pb.go | 3957 +++++++
.../protobuf/types/known/anypb/any.pb.go | 498 +
.../types/known/durationpb/duration.pb.go | 379 +
.../types/known/timestamppb/timestamp.pb.go | 390 +
vendor/gopkg.in/yaml.v2/.travis.yml | 16 +
vendor/gopkg.in/yaml.v2/LICENSE | 201 +
vendor/gopkg.in/yaml.v2/LICENSE.libyaml | 31 +
vendor/gopkg.in/yaml.v2/NOTICE | 13 +
vendor/gopkg.in/yaml.v2/README.md | 133 +
vendor/gopkg.in/yaml.v2/apic.go | 740 ++
vendor/gopkg.in/yaml.v2/decode.go | 815 ++
vendor/gopkg.in/yaml.v2/emitterc.go | 1685 +++
vendor/gopkg.in/yaml.v2/encode.go | 390 +
vendor/gopkg.in/yaml.v2/parserc.go | 1095 ++
vendor/gopkg.in/yaml.v2/readerc.go | 412 +
vendor/gopkg.in/yaml.v2/resolve.go | 258 +
vendor/gopkg.in/yaml.v2/scannerc.go | 2711 +++++
vendor/gopkg.in/yaml.v2/sorter.go | 113 +
vendor/gopkg.in/yaml.v2/writerc.go | 26 +
vendor/gopkg.in/yaml.v2/yaml.go | 466 +
vendor/gopkg.in/yaml.v2/yamlh.go | 739 ++
vendor/gopkg.in/yaml.v2/yamlprivateh.go | 173 +
vendor/modules.txt | 185 +
1112 files changed, 450815 insertions(+), 21 deletions(-)
create mode 100644 Caddy/Caddyfile
create mode 100644 Makefile
create mode 100644 NGINX/sites-available/tunnel.mydomain.com
create mode 100644 api/v1/nginx/pb/tunnel/tunnel.pb.go
create mode 100644 api/v1/nginx/pb/tunnel/tunnel_grpc.pb.go
create mode 100644 proto/tunnel.proto
create mode 100644 vendor/github.com/danielkov/gin-helmet/.gitignore
create mode 100644 vendor/github.com/danielkov/gin-helmet/.travis.yml
create mode 100644 vendor/github.com/danielkov/gin-helmet/LICENSE
create mode 100644 vendor/github.com/danielkov/gin-helmet/README.md
create mode 100644 vendor/github.com/danielkov/gin-helmet/helmet.go
create mode 100644 vendor/github.com/gin-contrib/cors/.gitignore
create mode 100644 vendor/github.com/gin-contrib/cors/.travis.yml
create mode 100644 vendor/github.com/gin-contrib/cors/LICENSE
create mode 100644 vendor/github.com/gin-contrib/cors/README.md
create mode 100644 vendor/github.com/gin-contrib/cors/config.go
create mode 100644 vendor/github.com/gin-contrib/cors/cors.go
create mode 100644 vendor/github.com/gin-contrib/cors/utils.go
create mode 100644 vendor/github.com/gin-contrib/sse/.travis.yml
create mode 100644 vendor/github.com/gin-contrib/sse/LICENSE
create mode 100644 vendor/github.com/gin-contrib/sse/README.md
create mode 100644 vendor/github.com/gin-contrib/sse/sse-decoder.go
create mode 100644 vendor/github.com/gin-contrib/sse/sse-encoder.go
create mode 100644 vendor/github.com/gin-contrib/sse/writer.go
create mode 100644 vendor/github.com/gin-contrib/static/.gitignore
create mode 100644 vendor/github.com/gin-contrib/static/.travis.yml
create mode 100644 vendor/github.com/gin-contrib/static/LICENSE
create mode 100644 vendor/github.com/gin-contrib/static/README.md
create mode 100644 vendor/github.com/gin-contrib/static/static.go
create mode 100644 vendor/github.com/gin-gonic/gin/.gitignore
create mode 100644 vendor/github.com/gin-gonic/gin/.travis.yml
create mode 100644 vendor/github.com/gin-gonic/gin/AUTHORS.md
create mode 100644 vendor/github.com/gin-gonic/gin/BENCHMARKS.md
create mode 100644 vendor/github.com/gin-gonic/gin/CHANGELOG.md
create mode 100644 vendor/github.com/gin-gonic/gin/CODE_OF_CONDUCT.md
create mode 100644 vendor/github.com/gin-gonic/gin/CONTRIBUTING.md
create mode 100644 vendor/github.com/gin-gonic/gin/LICENSE
create mode 100644 vendor/github.com/gin-gonic/gin/Makefile
create mode 100644 vendor/github.com/gin-gonic/gin/README.md
create mode 100644 vendor/github.com/gin-gonic/gin/auth.go
create mode 100644 vendor/github.com/gin-gonic/gin/binding/binding.go
create mode 100644 vendor/github.com/gin-gonic/gin/binding/binding_nomsgpack.go
create mode 100644 vendor/github.com/gin-gonic/gin/binding/default_validator.go
create mode 100644 vendor/github.com/gin-gonic/gin/binding/form.go
create mode 100644 vendor/github.com/gin-gonic/gin/binding/form_mapping.go
create mode 100644 vendor/github.com/gin-gonic/gin/binding/header.go
create mode 100644 vendor/github.com/gin-gonic/gin/binding/json.go
create mode 100644 vendor/github.com/gin-gonic/gin/binding/msgpack.go
create mode 100644 vendor/github.com/gin-gonic/gin/binding/multipart_form_mapping.go
create mode 100644 vendor/github.com/gin-gonic/gin/binding/protobuf.go
create mode 100644 vendor/github.com/gin-gonic/gin/binding/query.go
create mode 100644 vendor/github.com/gin-gonic/gin/binding/uri.go
create mode 100644 vendor/github.com/gin-gonic/gin/binding/xml.go
create mode 100644 vendor/github.com/gin-gonic/gin/binding/yaml.go
create mode 100644 vendor/github.com/gin-gonic/gin/codecov.yml
create mode 100644 vendor/github.com/gin-gonic/gin/context.go
create mode 100644 vendor/github.com/gin-gonic/gin/context_appengine.go
create mode 100644 vendor/github.com/gin-gonic/gin/debug.go
create mode 100644 vendor/github.com/gin-gonic/gin/deprecated.go
create mode 100644 vendor/github.com/gin-gonic/gin/doc.go
create mode 100644 vendor/github.com/gin-gonic/gin/errors.go
create mode 100644 vendor/github.com/gin-gonic/gin/fs.go
create mode 100644 vendor/github.com/gin-gonic/gin/gin.go
create mode 100644 vendor/github.com/gin-gonic/gin/internal/bytesconv/bytesconv.go
create mode 100644 vendor/github.com/gin-gonic/gin/internal/json/json.go
create mode 100644 vendor/github.com/gin-gonic/gin/internal/json/jsoniter.go
create mode 100644 vendor/github.com/gin-gonic/gin/logger.go
create mode 100644 vendor/github.com/gin-gonic/gin/mode.go
create mode 100644 vendor/github.com/gin-gonic/gin/path.go
create mode 100644 vendor/github.com/gin-gonic/gin/recovery.go
create mode 100644 vendor/github.com/gin-gonic/gin/render/data.go
create mode 100644 vendor/github.com/gin-gonic/gin/render/html.go
create mode 100644 vendor/github.com/gin-gonic/gin/render/json.go
create mode 100644 vendor/github.com/gin-gonic/gin/render/msgpack.go
create mode 100644 vendor/github.com/gin-gonic/gin/render/protobuf.go
create mode 100644 vendor/github.com/gin-gonic/gin/render/reader.go
create mode 100644 vendor/github.com/gin-gonic/gin/render/redirect.go
create mode 100644 vendor/github.com/gin-gonic/gin/render/render.go
create mode 100644 vendor/github.com/gin-gonic/gin/render/text.go
create mode 100644 vendor/github.com/gin-gonic/gin/render/xml.go
create mode 100644 vendor/github.com/gin-gonic/gin/render/yaml.go
create mode 100644 vendor/github.com/gin-gonic/gin/response_writer.go
create mode 100644 vendor/github.com/gin-gonic/gin/routergroup.go
create mode 100644 vendor/github.com/gin-gonic/gin/test_helpers.go
create mode 100644 vendor/github.com/gin-gonic/gin/tree.go
create mode 100644 vendor/github.com/gin-gonic/gin/utils.go
create mode 100644 vendor/github.com/gin-gonic/gin/version.go
create mode 100644 vendor/github.com/go-playground/locales/.gitignore
create mode 100644 vendor/github.com/go-playground/locales/.travis.yml
create mode 100644 vendor/github.com/go-playground/locales/LICENSE
create mode 100644 vendor/github.com/go-playground/locales/README.md
create mode 100644 vendor/github.com/go-playground/locales/currency/currency.go
create mode 100644 vendor/github.com/go-playground/locales/logo.png
create mode 100644 vendor/github.com/go-playground/locales/rules.go
create mode 100644 vendor/github.com/go-playground/universal-translator/.gitignore
create mode 100644 vendor/github.com/go-playground/universal-translator/.travis.yml
create mode 100644 vendor/github.com/go-playground/universal-translator/LICENSE
create mode 100644 vendor/github.com/go-playground/universal-translator/README.md
create mode 100644 vendor/github.com/go-playground/universal-translator/errors.go
create mode 100644 vendor/github.com/go-playground/universal-translator/import_export.go
create mode 100644 vendor/github.com/go-playground/universal-translator/logo.png
create mode 100644 vendor/github.com/go-playground/universal-translator/translator.go
create mode 100644 vendor/github.com/go-playground/universal-translator/universal_translator.go
create mode 100644 vendor/github.com/go-playground/validator/v10/.gitignore
create mode 100644 vendor/github.com/go-playground/validator/v10/.travis.yml
create mode 100644 vendor/github.com/go-playground/validator/v10/LICENSE
create mode 100644 vendor/github.com/go-playground/validator/v10/Makefile
create mode 100644 vendor/github.com/go-playground/validator/v10/README.md
create mode 100644 vendor/github.com/go-playground/validator/v10/baked_in.go
create mode 100644 vendor/github.com/go-playground/validator/v10/cache.go
create mode 100644 vendor/github.com/go-playground/validator/v10/country_codes.go
create mode 100644 vendor/github.com/go-playground/validator/v10/doc.go
create mode 100644 vendor/github.com/go-playground/validator/v10/errors.go
create mode 100644 vendor/github.com/go-playground/validator/v10/field_level.go
create mode 100644 vendor/github.com/go-playground/validator/v10/logo.png
create mode 100644 vendor/github.com/go-playground/validator/v10/regexes.go
create mode 100644 vendor/github.com/go-playground/validator/v10/struct_level.go
create mode 100644 vendor/github.com/go-playground/validator/v10/translations.go
create mode 100644 vendor/github.com/go-playground/validator/v10/util.go
create mode 100644 vendor/github.com/go-playground/validator/v10/validator.go
create mode 100644 vendor/github.com/go-playground/validator/v10/validator_instance.go
create mode 100644 vendor/github.com/golang/protobuf/AUTHORS
create mode 100644 vendor/github.com/golang/protobuf/CONTRIBUTORS
create mode 100644 vendor/github.com/golang/protobuf/LICENSE
create mode 100644 vendor/github.com/golang/protobuf/jsonpb/decode.go
create mode 100644 vendor/github.com/golang/protobuf/jsonpb/encode.go
create mode 100644 vendor/github.com/golang/protobuf/jsonpb/json.go
create mode 100644 vendor/github.com/golang/protobuf/proto/buffer.go
create mode 100644 vendor/github.com/golang/protobuf/proto/defaults.go
create mode 100644 vendor/github.com/golang/protobuf/proto/deprecated.go
create mode 100644 vendor/github.com/golang/protobuf/proto/discard.go
create mode 100644 vendor/github.com/golang/protobuf/proto/extensions.go
create mode 100644 vendor/github.com/golang/protobuf/proto/properties.go
create mode 100644 vendor/github.com/golang/protobuf/proto/proto.go
create mode 100644 vendor/github.com/golang/protobuf/proto/registry.go
create mode 100644 vendor/github.com/golang/protobuf/proto/text_decode.go
create mode 100644 vendor/github.com/golang/protobuf/proto/text_encode.go
create mode 100644 vendor/github.com/golang/protobuf/proto/wire.go
create mode 100644 vendor/github.com/golang/protobuf/proto/wrappers.go
create mode 100644 vendor/github.com/golang/protobuf/ptypes/any.go
create mode 100644 vendor/github.com/golang/protobuf/ptypes/any/any.pb.go
create mode 100644 vendor/github.com/golang/protobuf/ptypes/doc.go
create mode 100644 vendor/github.com/golang/protobuf/ptypes/duration.go
create mode 100644 vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go
create mode 100644 vendor/github.com/golang/protobuf/ptypes/timestamp.go
create mode 100644 vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go
create mode 100644 vendor/github.com/joho/godotenv/.gitignore
create mode 100644 vendor/github.com/joho/godotenv/.travis.yml
create mode 100644 vendor/github.com/joho/godotenv/LICENCE
create mode 100644 vendor/github.com/joho/godotenv/README.md
create mode 100644 vendor/github.com/joho/godotenv/godotenv.go
create mode 100644 vendor/github.com/json-iterator/go/.codecov.yml
create mode 100644 vendor/github.com/json-iterator/go/.gitignore
create mode 100644 vendor/github.com/json-iterator/go/.travis.yml
create mode 100644 vendor/github.com/json-iterator/go/Gopkg.lock
create mode 100644 vendor/github.com/json-iterator/go/Gopkg.toml
create mode 100644 vendor/github.com/json-iterator/go/LICENSE
create mode 100644 vendor/github.com/json-iterator/go/README.md
create mode 100644 vendor/github.com/json-iterator/go/adapter.go
create mode 100644 vendor/github.com/json-iterator/go/any.go
create mode 100644 vendor/github.com/json-iterator/go/any_array.go
create mode 100644 vendor/github.com/json-iterator/go/any_bool.go
create mode 100644 vendor/github.com/json-iterator/go/any_float.go
create mode 100644 vendor/github.com/json-iterator/go/any_int32.go
create mode 100644 vendor/github.com/json-iterator/go/any_int64.go
create mode 100644 vendor/github.com/json-iterator/go/any_invalid.go
create mode 100644 vendor/github.com/json-iterator/go/any_nil.go
create mode 100644 vendor/github.com/json-iterator/go/any_number.go
create mode 100644 vendor/github.com/json-iterator/go/any_object.go
create mode 100644 vendor/github.com/json-iterator/go/any_str.go
create mode 100644 vendor/github.com/json-iterator/go/any_uint32.go
create mode 100644 vendor/github.com/json-iterator/go/any_uint64.go
create mode 100644 vendor/github.com/json-iterator/go/build.sh
create mode 100644 vendor/github.com/json-iterator/go/config.go
create mode 100644 vendor/github.com/json-iterator/go/fuzzy_mode_convert_table.md
create mode 100644 vendor/github.com/json-iterator/go/iter.go
create mode 100644 vendor/github.com/json-iterator/go/iter_array.go
create mode 100644 vendor/github.com/json-iterator/go/iter_float.go
create mode 100644 vendor/github.com/json-iterator/go/iter_int.go
create mode 100644 vendor/github.com/json-iterator/go/iter_object.go
create mode 100644 vendor/github.com/json-iterator/go/iter_skip.go
create mode 100644 vendor/github.com/json-iterator/go/iter_skip_sloppy.go
create mode 100644 vendor/github.com/json-iterator/go/iter_skip_strict.go
create mode 100644 vendor/github.com/json-iterator/go/iter_str.go
create mode 100644 vendor/github.com/json-iterator/go/jsoniter.go
create mode 100644 vendor/github.com/json-iterator/go/pool.go
create mode 100644 vendor/github.com/json-iterator/go/reflect.go
create mode 100644 vendor/github.com/json-iterator/go/reflect_array.go
create mode 100644 vendor/github.com/json-iterator/go/reflect_dynamic.go
create mode 100644 vendor/github.com/json-iterator/go/reflect_extension.go
create mode 100644 vendor/github.com/json-iterator/go/reflect_json_number.go
create mode 100644 vendor/github.com/json-iterator/go/reflect_json_raw_message.go
create mode 100644 vendor/github.com/json-iterator/go/reflect_map.go
create mode 100644 vendor/github.com/json-iterator/go/reflect_marshaler.go
create mode 100644 vendor/github.com/json-iterator/go/reflect_native.go
create mode 100644 vendor/github.com/json-iterator/go/reflect_optional.go
create mode 100644 vendor/github.com/json-iterator/go/reflect_slice.go
create mode 100644 vendor/github.com/json-iterator/go/reflect_struct_decoder.go
create mode 100644 vendor/github.com/json-iterator/go/reflect_struct_encoder.go
create mode 100644 vendor/github.com/json-iterator/go/stream.go
create mode 100644 vendor/github.com/json-iterator/go/stream_float.go
create mode 100644 vendor/github.com/json-iterator/go/stream_int.go
create mode 100644 vendor/github.com/json-iterator/go/stream_str.go
create mode 100644 vendor/github.com/json-iterator/go/test.sh
create mode 100644 vendor/github.com/leodido/go-urn/.gitignore
create mode 100644 vendor/github.com/leodido/go-urn/.travis.yml
create mode 100644 vendor/github.com/leodido/go-urn/LICENSE
create mode 100644 vendor/github.com/leodido/go-urn/README.md
create mode 100644 vendor/github.com/leodido/go-urn/machine.go
create mode 100644 vendor/github.com/leodido/go-urn/machine.go.rl
create mode 100644 vendor/github.com/leodido/go-urn/makefile
create mode 100644 vendor/github.com/leodido/go-urn/urn.go
create mode 100644 vendor/github.com/mattn/go-isatty/.travis.yml
create mode 100644 vendor/github.com/mattn/go-isatty/LICENSE
create mode 100644 vendor/github.com/mattn/go-isatty/README.md
create mode 100644 vendor/github.com/mattn/go-isatty/doc.go
create mode 100644 vendor/github.com/mattn/go-isatty/go.test.sh
create mode 100644 vendor/github.com/mattn/go-isatty/isatty_bsd.go
create mode 100644 vendor/github.com/mattn/go-isatty/isatty_others.go
create mode 100644 vendor/github.com/mattn/go-isatty/isatty_plan9.go
create mode 100644 vendor/github.com/mattn/go-isatty/isatty_solaris.go
create mode 100644 vendor/github.com/mattn/go-isatty/isatty_tcgets.go
create mode 100644 vendor/github.com/mattn/go-isatty/isatty_windows.go
create mode 100644 vendor/github.com/mattn/go-isatty/renovate.json
create mode 100644 vendor/github.com/modern-go/concurrent/.gitignore
create mode 100644 vendor/github.com/modern-go/concurrent/.travis.yml
create mode 100644 vendor/github.com/modern-go/concurrent/LICENSE
create mode 100644 vendor/github.com/modern-go/concurrent/README.md
create mode 100644 vendor/github.com/modern-go/concurrent/executor.go
create mode 100644 vendor/github.com/modern-go/concurrent/go_above_19.go
create mode 100644 vendor/github.com/modern-go/concurrent/go_below_19.go
create mode 100644 vendor/github.com/modern-go/concurrent/log.go
create mode 100644 vendor/github.com/modern-go/concurrent/test.sh
create mode 100644 vendor/github.com/modern-go/concurrent/unbounded_executor.go
create mode 100644 vendor/github.com/modern-go/reflect2/.gitignore
create mode 100644 vendor/github.com/modern-go/reflect2/.travis.yml
create mode 100644 vendor/github.com/modern-go/reflect2/Gopkg.lock
create mode 100644 vendor/github.com/modern-go/reflect2/Gopkg.toml
create mode 100644 vendor/github.com/modern-go/reflect2/LICENSE
create mode 100644 vendor/github.com/modern-go/reflect2/README.md
create mode 100644 vendor/github.com/modern-go/reflect2/go_above_17.go
create mode 100644 vendor/github.com/modern-go/reflect2/go_above_19.go
create mode 100644 vendor/github.com/modern-go/reflect2/go_below_17.go
create mode 100644 vendor/github.com/modern-go/reflect2/go_below_19.go
create mode 100644 vendor/github.com/modern-go/reflect2/reflect2.go
create mode 100644 vendor/github.com/modern-go/reflect2/reflect2_amd64.s
create mode 100644 vendor/github.com/modern-go/reflect2/reflect2_kind.go
create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_386.s
create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_amd64p32.s
create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_arm.s
create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_arm64.s
create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_mips64x.s
create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_mipsx.s
create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_ppc64x.s
create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_s390x.s
create mode 100644 vendor/github.com/modern-go/reflect2/safe_field.go
create mode 100644 vendor/github.com/modern-go/reflect2/safe_map.go
create mode 100644 vendor/github.com/modern-go/reflect2/safe_slice.go
create mode 100644 vendor/github.com/modern-go/reflect2/safe_struct.go
create mode 100644 vendor/github.com/modern-go/reflect2/safe_type.go
create mode 100644 vendor/github.com/modern-go/reflect2/test.sh
create mode 100644 vendor/github.com/modern-go/reflect2/type_map.go
create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_array.go
create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_eface.go
create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_field.go
create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_iface.go
create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_link.go
create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_map.go
create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_ptr.go
create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_slice.go
create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_struct.go
create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_type.go
create mode 100644 vendor/github.com/patrickmn/go-cache/CONTRIBUTORS
create mode 100644 vendor/github.com/patrickmn/go-cache/LICENSE
create mode 100644 vendor/github.com/patrickmn/go-cache/README.md
create mode 100644 vendor/github.com/patrickmn/go-cache/cache.go
create mode 100644 vendor/github.com/patrickmn/go-cache/sharded.go
create mode 100644 vendor/github.com/sirupsen/logrus/.gitignore
create mode 100644 vendor/github.com/sirupsen/logrus/.golangci.yml
create mode 100644 vendor/github.com/sirupsen/logrus/.travis.yml
create mode 100644 vendor/github.com/sirupsen/logrus/CHANGELOG.md
create mode 100644 vendor/github.com/sirupsen/logrus/LICENSE
create mode 100644 vendor/github.com/sirupsen/logrus/README.md
create mode 100644 vendor/github.com/sirupsen/logrus/alt_exit.go
create mode 100644 vendor/github.com/sirupsen/logrus/appveyor.yml
create mode 100644 vendor/github.com/sirupsen/logrus/buffer_pool.go
create mode 100644 vendor/github.com/sirupsen/logrus/doc.go
create mode 100644 vendor/github.com/sirupsen/logrus/entry.go
create mode 100644 vendor/github.com/sirupsen/logrus/exported.go
create mode 100644 vendor/github.com/sirupsen/logrus/formatter.go
create mode 100644 vendor/github.com/sirupsen/logrus/hooks.go
create mode 100644 vendor/github.com/sirupsen/logrus/json_formatter.go
create mode 100644 vendor/github.com/sirupsen/logrus/logger.go
create mode 100644 vendor/github.com/sirupsen/logrus/logrus.go
create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_appengine.go
create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_bsd.go
create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_js.go
create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_no_terminal.go
create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go
create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_solaris.go
create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_unix.go
create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_windows.go
create mode 100644 vendor/github.com/sirupsen/logrus/text_formatter.go
create mode 100644 vendor/github.com/sirupsen/logrus/writer.go
create mode 100644 vendor/github.com/ugorji/go/codec/0_importpath.go
create mode 100644 vendor/github.com/ugorji/go/codec/LICENSE
create mode 100644 vendor/github.com/ugorji/go/codec/binc.go
create mode 100644 vendor/github.com/ugorji/go/codec/build.sh
create mode 100644 vendor/github.com/ugorji/go/codec/cbor.go
create mode 100644 vendor/github.com/ugorji/go/codec/codecgen.go
create mode 100644 vendor/github.com/ugorji/go/codec/decode.go
create mode 100644 vendor/github.com/ugorji/go/codec/doc.go
create mode 100644 vendor/github.com/ugorji/go/codec/encode.go
create mode 100644 vendor/github.com/ugorji/go/codec/fast-path.generated.go
create mode 100644 vendor/github.com/ugorji/go/codec/fast-path.go.tmpl
create mode 100644 vendor/github.com/ugorji/go/codec/fast-path.not.go
create mode 100644 vendor/github.com/ugorji/go/codec/float.go
create mode 100644 vendor/github.com/ugorji/go/codec/gen-dec-array.go.tmpl
create mode 100644 vendor/github.com/ugorji/go/codec/gen-dec-map.go.tmpl
create mode 100644 vendor/github.com/ugorji/go/codec/gen-enc-chan.go.tmpl
create mode 100644 vendor/github.com/ugorji/go/codec/gen-helper.generated.go
create mode 100644 vendor/github.com/ugorji/go/codec/gen-helper.go.tmpl
create mode 100644 vendor/github.com/ugorji/go/codec/gen.generated.go
create mode 100644 vendor/github.com/ugorji/go/codec/gen.go
create mode 100644 vendor/github.com/ugorji/go/codec/goversion_arrayof_gte_go15.go
create mode 100644 vendor/github.com/ugorji/go/codec/goversion_arrayof_lt_go15.go
create mode 100644 vendor/github.com/ugorji/go/codec/goversion_fmt_time_gte_go15.go
create mode 100644 vendor/github.com/ugorji/go/codec/goversion_fmt_time_lt_go15.go
create mode 100644 vendor/github.com/ugorji/go/codec/goversion_makemap_gte_go19.go
create mode 100644 vendor/github.com/ugorji/go/codec/goversion_makemap_lt_go19.go
create mode 100644 vendor/github.com/ugorji/go/codec/goversion_maprange_gte_go112.go
create mode 100644 vendor/github.com/ugorji/go/codec/goversion_maprange_lt_go112.go
create mode 100644 vendor/github.com/ugorji/go/codec/goversion_unexportedembeddedptr_gte_go110.go
create mode 100644 vendor/github.com/ugorji/go/codec/goversion_unexportedembeddedptr_lt_go110.go
create mode 100644 vendor/github.com/ugorji/go/codec/goversion_unsupported_lt_go14.go
create mode 100644 vendor/github.com/ugorji/go/codec/goversion_vendor_eq_go15.go
create mode 100644 vendor/github.com/ugorji/go/codec/goversion_vendor_eq_go16.go
create mode 100644 vendor/github.com/ugorji/go/codec/goversion_vendor_gte_go17.go
create mode 100644 vendor/github.com/ugorji/go/codec/goversion_vendor_lt_go15.go
create mode 100644 vendor/github.com/ugorji/go/codec/helper.go
create mode 100644 vendor/github.com/ugorji/go/codec/helper.s
create mode 100644 vendor/github.com/ugorji/go/codec/helper_internal.go
create mode 100644 vendor/github.com/ugorji/go/codec/helper_not_unsafe.go
create mode 100644 vendor/github.com/ugorji/go/codec/helper_unsafe.go
create mode 100644 vendor/github.com/ugorji/go/codec/json.go
create mode 100644 vendor/github.com/ugorji/go/codec/mammoth-test.go.tmpl
create mode 100644 vendor/github.com/ugorji/go/codec/mammoth2-test.go.tmpl
create mode 100644 vendor/github.com/ugorji/go/codec/msgpack.go
create mode 100644 vendor/github.com/ugorji/go/codec/prebuild.go
create mode 100644 vendor/github.com/ugorji/go/codec/reader.go
create mode 100644 vendor/github.com/ugorji/go/codec/register_ext.go
create mode 100644 vendor/github.com/ugorji/go/codec/rpc.go
create mode 100644 vendor/github.com/ugorji/go/codec/simple.go
create mode 100644 vendor/github.com/ugorji/go/codec/sort-slice.generated.go
create mode 100644 vendor/github.com/ugorji/go/codec/sort-slice.go.tmpl
create mode 100644 vendor/github.com/ugorji/go/codec/test-cbor-goldens.json
create mode 100644 vendor/github.com/ugorji/go/codec/test.py
create mode 100644 vendor/github.com/ugorji/go/codec/writer.go
create mode 100644 vendor/golang.org/x/crypto/AUTHORS
create mode 100644 vendor/golang.org/x/crypto/CONTRIBUTORS
create mode 100644 vendor/golang.org/x/crypto/LICENSE
create mode 100644 vendor/golang.org/x/crypto/PATENTS
create mode 100644 vendor/golang.org/x/crypto/sha3/doc.go
create mode 100644 vendor/golang.org/x/crypto/sha3/hashes.go
create mode 100644 vendor/golang.org/x/crypto/sha3/hashes_generic.go
create mode 100644 vendor/golang.org/x/crypto/sha3/keccakf.go
create mode 100644 vendor/golang.org/x/crypto/sha3/keccakf_amd64.go
create mode 100644 vendor/golang.org/x/crypto/sha3/keccakf_amd64.s
create mode 100644 vendor/golang.org/x/crypto/sha3/register.go
create mode 100644 vendor/golang.org/x/crypto/sha3/sha3.go
create mode 100644 vendor/golang.org/x/crypto/sha3/sha3_s390x.go
create mode 100644 vendor/golang.org/x/crypto/sha3/sha3_s390x.s
create mode 100644 vendor/golang.org/x/crypto/sha3/shake.go
create mode 100644 vendor/golang.org/x/crypto/sha3/shake_generic.go
create mode 100644 vendor/golang.org/x/crypto/sha3/xor.go
create mode 100644 vendor/golang.org/x/crypto/sha3/xor_generic.go
create mode 100644 vendor/golang.org/x/crypto/sha3/xor_unaligned.go
create mode 100644 vendor/golang.org/x/net/AUTHORS
create mode 100644 vendor/golang.org/x/net/CONTRIBUTORS
create mode 100644 vendor/golang.org/x/net/LICENSE
create mode 100644 vendor/golang.org/x/net/PATENTS
create mode 100644 vendor/golang.org/x/net/http/httpguts/guts.go
create mode 100644 vendor/golang.org/x/net/http/httpguts/httplex.go
create mode 100644 vendor/golang.org/x/net/http2/.gitignore
create mode 100644 vendor/golang.org/x/net/http2/Dockerfile
create mode 100644 vendor/golang.org/x/net/http2/Makefile
create mode 100644 vendor/golang.org/x/net/http2/README
create mode 100644 vendor/golang.org/x/net/http2/ascii.go
create mode 100644 vendor/golang.org/x/net/http2/ciphers.go
create mode 100644 vendor/golang.org/x/net/http2/client_conn_pool.go
create mode 100644 vendor/golang.org/x/net/http2/databuffer.go
create mode 100644 vendor/golang.org/x/net/http2/errors.go
create mode 100644 vendor/golang.org/x/net/http2/flow.go
create mode 100644 vendor/golang.org/x/net/http2/frame.go
create mode 100644 vendor/golang.org/x/net/http2/go111.go
create mode 100644 vendor/golang.org/x/net/http2/go115.go
create mode 100644 vendor/golang.org/x/net/http2/gotrack.go
create mode 100644 vendor/golang.org/x/net/http2/headermap.go
create mode 100644 vendor/golang.org/x/net/http2/hpack/encode.go
create mode 100644 vendor/golang.org/x/net/http2/hpack/hpack.go
create mode 100644 vendor/golang.org/x/net/http2/hpack/huffman.go
create mode 100644 vendor/golang.org/x/net/http2/hpack/tables.go
create mode 100644 vendor/golang.org/x/net/http2/http2.go
create mode 100644 vendor/golang.org/x/net/http2/not_go111.go
create mode 100644 vendor/golang.org/x/net/http2/not_go115.go
create mode 100644 vendor/golang.org/x/net/http2/pipe.go
create mode 100644 vendor/golang.org/x/net/http2/server.go
create mode 100644 vendor/golang.org/x/net/http2/transport.go
create mode 100644 vendor/golang.org/x/net/http2/write.go
create mode 100644 vendor/golang.org/x/net/http2/writesched.go
create mode 100644 vendor/golang.org/x/net/http2/writesched_priority.go
create mode 100644 vendor/golang.org/x/net/http2/writesched_random.go
create mode 100644 vendor/golang.org/x/net/idna/idna10.0.0.go
create mode 100644 vendor/golang.org/x/net/idna/idna9.0.0.go
create mode 100644 vendor/golang.org/x/net/idna/punycode.go
create mode 100644 vendor/golang.org/x/net/idna/tables10.0.0.go
create mode 100644 vendor/golang.org/x/net/idna/tables11.0.0.go
create mode 100644 vendor/golang.org/x/net/idna/tables12.0.0.go
create mode 100644 vendor/golang.org/x/net/idna/tables13.0.0.go
create mode 100644 vendor/golang.org/x/net/idna/tables9.0.0.go
create mode 100644 vendor/golang.org/x/net/idna/trie.go
create mode 100644 vendor/golang.org/x/net/idna/trieval.go
create mode 100644 vendor/golang.org/x/net/internal/timeseries/timeseries.go
create mode 100644 vendor/golang.org/x/net/trace/events.go
create mode 100644 vendor/golang.org/x/net/trace/histogram.go
create mode 100644 vendor/golang.org/x/net/trace/trace.go
create mode 100644 vendor/golang.org/x/sys/LICENSE
create mode 100644 vendor/golang.org/x/sys/PATENTS
create mode 100644 vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s
create mode 100644 vendor/golang.org/x/sys/cpu/byteorder.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_aix.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm64.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm64.s
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_x86.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_arm.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_loong64.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_mips64x.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_mipsx.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_netbsd_arm64.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.s
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_arm.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_arm64.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_mips64x.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_riscv64.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_ppc64x.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_riscv64.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_s390x.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_s390x.s
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_wasm.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_x86.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_x86.s
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_zos.go
create mode 100644 vendor/golang.org/x/sys/cpu/cpu_zos_s390x.go
create mode 100644 vendor/golang.org/x/sys/cpu/hwcap_linux.go
create mode 100644 vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go
create mode 100644 vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go
create mode 100644 vendor/golang.org/x/sys/internal/unsafeheader/unsafeheader.go
create mode 100644 vendor/golang.org/x/sys/unix/.gitignore
create mode 100644 vendor/golang.org/x/sys/unix/README.md
create mode 100644 vendor/golang.org/x/sys/unix/affinity_linux.go
create mode 100644 vendor/golang.org/x/sys/unix/aliases.go
create mode 100644 vendor/golang.org/x/sys/unix/asm_aix_ppc64.s
create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_386.s
create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_amd64.s
create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_arm.s
create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_arm64.s
create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_riscv64.s
create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_386.s
create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_amd64.s
create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_arm.s
create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_arm64.s
create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_loong64.s
create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_mips64x.s
create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_mipsx.s
create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s
create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_riscv64.s
create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_s390x.s
create mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_mips64.s
create mode 100644 vendor/golang.org/x/sys/unix/asm_solaris_amd64.s
create mode 100644 vendor/golang.org/x/sys/unix/asm_zos_s390x.s
create mode 100644 vendor/golang.org/x/sys/unix/bluetooth_linux.go
create mode 100644 vendor/golang.org/x/sys/unix/cap_freebsd.go
create mode 100644 vendor/golang.org/x/sys/unix/constants.go
create mode 100644 vendor/golang.org/x/sys/unix/dev_aix_ppc.go
create mode 100644 vendor/golang.org/x/sys/unix/dev_aix_ppc64.go
create mode 100644 vendor/golang.org/x/sys/unix/dev_darwin.go
create mode 100644 vendor/golang.org/x/sys/unix/dev_dragonfly.go
create mode 100644 vendor/golang.org/x/sys/unix/dev_freebsd.go
create mode 100644 vendor/golang.org/x/sys/unix/dev_linux.go
create mode 100644 vendor/golang.org/x/sys/unix/dev_netbsd.go
create mode 100644 vendor/golang.org/x/sys/unix/dev_openbsd.go
create mode 100644 vendor/golang.org/x/sys/unix/dev_zos.go
create mode 100644 vendor/golang.org/x/sys/unix/dirent.go
create mode 100644 vendor/golang.org/x/sys/unix/endian_big.go
create mode 100644 vendor/golang.org/x/sys/unix/endian_little.go
create mode 100644 vendor/golang.org/x/sys/unix/env_unix.go
create mode 100644 vendor/golang.org/x/sys/unix/epoll_zos.go
create mode 100644 vendor/golang.org/x/sys/unix/fcntl.go
create mode 100644 vendor/golang.org/x/sys/unix/fcntl_darwin.go
create mode 100644 vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go
create mode 100644 vendor/golang.org/x/sys/unix/fdset.go
create mode 100644 vendor/golang.org/x/sys/unix/fstatfs_zos.go
create mode 100644 vendor/golang.org/x/sys/unix/gccgo.go
create mode 100644 vendor/golang.org/x/sys/unix/gccgo_c.c
create mode 100644 vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/ifreq_linux.go
create mode 100644 vendor/golang.org/x/sys/unix/ioctl.go
create mode 100644 vendor/golang.org/x/sys/unix/ioctl_linux.go
create mode 100644 vendor/golang.org/x/sys/unix/ioctl_zos.go
create mode 100644 vendor/golang.org/x/sys/unix/mkall.sh
create mode 100644 vendor/golang.org/x/sys/unix/mkerrors.sh
create mode 100644 vendor/golang.org/x/sys/unix/pagesize_unix.go
create mode 100644 vendor/golang.org/x/sys/unix/pledge_openbsd.go
create mode 100644 vendor/golang.org/x/sys/unix/ptrace_darwin.go
create mode 100644 vendor/golang.org/x/sys/unix/ptrace_ios.go
create mode 100644 vendor/golang.org/x/sys/unix/race.go
create mode 100644 vendor/golang.org/x/sys/unix/race0.go
create mode 100644 vendor/golang.org/x/sys/unix/readdirent_getdents.go
create mode 100644 vendor/golang.org/x/sys/unix/readdirent_getdirentries.go
create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_dragonfly.go
create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_linux.go
create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_unix.go
create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_aix.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_aix_ppc.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_bsd.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_dragonfly.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_386.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_illumos.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_386.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_alarm.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_loong64.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_ppc.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_s390x.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_386.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_386.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_solaris.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_unix.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_unix_gc.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go
create mode 100644 vendor/golang.org/x/sys/unix/syscall_zos_s390x.go
create mode 100644 vendor/golang.org/x/sys/unix/sysvshm_linux.go
create mode 100644 vendor/golang.org/x/sys/unix/sysvshm_unix.go
create mode 100644 vendor/golang.org/x/sys/unix/sysvshm_unix_other.go
create mode 100644 vendor/golang.org/x/sys/unix/timestruct.go
create mode 100644 vendor/golang.org/x/sys/unix/unveil_openbsd.go
create mode 100644 vendor/golang.org/x/sys/unix/xattr_bsd.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_386.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go
create mode 100644 vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go
create mode 100644 vendor/golang.org/x/sys/unix/zptrace_linux_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go
create mode 100644 vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go
create mode 100644 vendor/golang.org/x/sys/unix/zptrace_x86_linux.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_386.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_386.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go
create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_illumos_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_386.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go
create mode 100644 vendor/golang.org/x/sys/unix/ztypes_zos_s390x.go
create mode 100644 vendor/golang.org/x/sys/windows/aliases.go
create mode 100644 vendor/golang.org/x/sys/windows/dll_windows.go
create mode 100644 vendor/golang.org/x/sys/windows/empty.s
create mode 100644 vendor/golang.org/x/sys/windows/env_windows.go
create mode 100644 vendor/golang.org/x/sys/windows/eventlog.go
create mode 100644 vendor/golang.org/x/sys/windows/exec_windows.go
create mode 100644 vendor/golang.org/x/sys/windows/memory_windows.go
create mode 100644 vendor/golang.org/x/sys/windows/mkerrors.bash
create mode 100644 vendor/golang.org/x/sys/windows/mkknownfolderids.bash
create mode 100644 vendor/golang.org/x/sys/windows/mksyscall.go
create mode 100644 vendor/golang.org/x/sys/windows/race.go
create mode 100644 vendor/golang.org/x/sys/windows/race0.go
create mode 100644 vendor/golang.org/x/sys/windows/security_windows.go
create mode 100644 vendor/golang.org/x/sys/windows/service.go
create mode 100644 vendor/golang.org/x/sys/windows/setupapi_windows.go
create mode 100644 vendor/golang.org/x/sys/windows/str.go
create mode 100644 vendor/golang.org/x/sys/windows/syscall.go
create mode 100644 vendor/golang.org/x/sys/windows/syscall_windows.go
create mode 100644 vendor/golang.org/x/sys/windows/types_windows.go
create mode 100644 vendor/golang.org/x/sys/windows/types_windows_386.go
create mode 100644 vendor/golang.org/x/sys/windows/types_windows_amd64.go
create mode 100644 vendor/golang.org/x/sys/windows/types_windows_arm.go
create mode 100644 vendor/golang.org/x/sys/windows/types_windows_arm64.go
create mode 100644 vendor/golang.org/x/sys/windows/zerrors_windows.go
create mode 100644 vendor/golang.org/x/sys/windows/zknownfolderids_windows.go
create mode 100644 vendor/golang.org/x/sys/windows/zsyscall_windows.go
create mode 100644 vendor/golang.org/x/text/AUTHORS
create mode 100644 vendor/golang.org/x/text/CONTRIBUTORS
create mode 100644 vendor/golang.org/x/text/LICENSE
create mode 100644 vendor/golang.org/x/text/PATENTS
create mode 100644 vendor/golang.org/x/text/secure/bidirule/bidirule.go
create mode 100644 vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go
create mode 100644 vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go
create mode 100644 vendor/golang.org/x/text/transform/transform.go
create mode 100644 vendor/golang.org/x/text/unicode/bidi/bidi.go
create mode 100644 vendor/golang.org/x/text/unicode/bidi/bracket.go
create mode 100644 vendor/golang.org/x/text/unicode/bidi/core.go
create mode 100644 vendor/golang.org/x/text/unicode/bidi/prop.go
create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go
create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go
create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go
create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go
create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go
create mode 100644 vendor/golang.org/x/text/unicode/bidi/trieval.go
create mode 100644 vendor/golang.org/x/text/unicode/norm/composition.go
create mode 100644 vendor/golang.org/x/text/unicode/norm/forminfo.go
create mode 100644 vendor/golang.org/x/text/unicode/norm/input.go
create mode 100644 vendor/golang.org/x/text/unicode/norm/iter.go
create mode 100644 vendor/golang.org/x/text/unicode/norm/normalize.go
create mode 100644 vendor/golang.org/x/text/unicode/norm/readwriter.go
create mode 100644 vendor/golang.org/x/text/unicode/norm/tables10.0.0.go
create mode 100644 vendor/golang.org/x/text/unicode/norm/tables11.0.0.go
create mode 100644 vendor/golang.org/x/text/unicode/norm/tables12.0.0.go
create mode 100644 vendor/golang.org/x/text/unicode/norm/tables13.0.0.go
create mode 100644 vendor/golang.org/x/text/unicode/norm/tables9.0.0.go
create mode 100644 vendor/golang.org/x/text/unicode/norm/transform.go
create mode 100644 vendor/golang.org/x/text/unicode/norm/trie.go
create mode 100644 vendor/google.golang.org/genproto/LICENSE
create mode 100644 vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go
create mode 100644 vendor/google.golang.org/grpc/AUTHORS
create mode 100644 vendor/google.golang.org/grpc/CODE-OF-CONDUCT.md
create mode 100644 vendor/google.golang.org/grpc/CONTRIBUTING.md
create mode 100644 vendor/google.golang.org/grpc/GOVERNANCE.md
create mode 100644 vendor/google.golang.org/grpc/LICENSE
create mode 100644 vendor/google.golang.org/grpc/MAINTAINERS.md
create mode 100644 vendor/google.golang.org/grpc/Makefile
create mode 100644 vendor/google.golang.org/grpc/NOTICE.txt
create mode 100644 vendor/google.golang.org/grpc/README.md
create mode 100644 vendor/google.golang.org/grpc/SECURITY.md
create mode 100644 vendor/google.golang.org/grpc/attributes/attributes.go
create mode 100644 vendor/google.golang.org/grpc/backoff.go
create mode 100644 vendor/google.golang.org/grpc/backoff/backoff.go
create mode 100644 vendor/google.golang.org/grpc/balancer/balancer.go
create mode 100644 vendor/google.golang.org/grpc/balancer/base/balancer.go
create mode 100644 vendor/google.golang.org/grpc/balancer/base/base.go
create mode 100644 vendor/google.golang.org/grpc/balancer/conn_state_evaluator.go
create mode 100644 vendor/google.golang.org/grpc/balancer/grpclb/state/state.go
create mode 100644 vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go
create mode 100644 vendor/google.golang.org/grpc/balancer_conn_wrappers.go
create mode 100644 vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go
create mode 100644 vendor/google.golang.org/grpc/call.go
create mode 100644 vendor/google.golang.org/grpc/channelz/channelz.go
create mode 100644 vendor/google.golang.org/grpc/clientconn.go
create mode 100644 vendor/google.golang.org/grpc/codec.go
create mode 100644 vendor/google.golang.org/grpc/codegen.sh
create mode 100644 vendor/google.golang.org/grpc/codes/code_string.go
create mode 100644 vendor/google.golang.org/grpc/codes/codes.go
create mode 100644 vendor/google.golang.org/grpc/connectivity/connectivity.go
create mode 100644 vendor/google.golang.org/grpc/credentials/credentials.go
create mode 100644 vendor/google.golang.org/grpc/credentials/insecure/insecure.go
create mode 100644 vendor/google.golang.org/grpc/credentials/tls.go
create mode 100644 vendor/google.golang.org/grpc/dialoptions.go
create mode 100644 vendor/google.golang.org/grpc/doc.go
create mode 100644 vendor/google.golang.org/grpc/encoding/encoding.go
create mode 100644 vendor/google.golang.org/grpc/encoding/proto/proto.go
create mode 100644 vendor/google.golang.org/grpc/grpclog/component.go
create mode 100644 vendor/google.golang.org/grpc/grpclog/grpclog.go
create mode 100644 vendor/google.golang.org/grpc/grpclog/logger.go
create mode 100644 vendor/google.golang.org/grpc/grpclog/loggerv2.go
create mode 100644 vendor/google.golang.org/grpc/interceptor.go
create mode 100644 vendor/google.golang.org/grpc/internal/backoff/backoff.go
create mode 100644 vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.go
create mode 100644 vendor/google.golang.org/grpc/internal/balancerload/load.go
create mode 100644 vendor/google.golang.org/grpc/internal/binarylog/binarylog.go
create mode 100644 vendor/google.golang.org/grpc/internal/binarylog/binarylog_testutil.go
create mode 100644 vendor/google.golang.org/grpc/internal/binarylog/env_config.go
create mode 100644 vendor/google.golang.org/grpc/internal/binarylog/method_logger.go
create mode 100644 vendor/google.golang.org/grpc/internal/binarylog/sink.go
create mode 100644 vendor/google.golang.org/grpc/internal/buffer/unbounded.go
create mode 100644 vendor/google.golang.org/grpc/internal/channelz/funcs.go
create mode 100644 vendor/google.golang.org/grpc/internal/channelz/id.go
create mode 100644 vendor/google.golang.org/grpc/internal/channelz/logging.go
create mode 100644 vendor/google.golang.org/grpc/internal/channelz/types.go
create mode 100644 vendor/google.golang.org/grpc/internal/channelz/types_linux.go
create mode 100644 vendor/google.golang.org/grpc/internal/channelz/types_nonlinux.go
create mode 100644 vendor/google.golang.org/grpc/internal/channelz/util_linux.go
create mode 100644 vendor/google.golang.org/grpc/internal/channelz/util_nonlinux.go
create mode 100644 vendor/google.golang.org/grpc/internal/credentials/credentials.go
create mode 100644 vendor/google.golang.org/grpc/internal/credentials/spiffe.go
create mode 100644 vendor/google.golang.org/grpc/internal/credentials/syscallconn.go
create mode 100644 vendor/google.golang.org/grpc/internal/credentials/util.go
create mode 100644 vendor/google.golang.org/grpc/internal/envconfig/envconfig.go
create mode 100644 vendor/google.golang.org/grpc/internal/envconfig/xds.go
create mode 100644 vendor/google.golang.org/grpc/internal/grpclog/grpclog.go
create mode 100644 vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go
create mode 100644 vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go
create mode 100644 vendor/google.golang.org/grpc/internal/grpcsync/event.go
create mode 100644 vendor/google.golang.org/grpc/internal/grpcutil/encode_duration.go
create mode 100644 vendor/google.golang.org/grpc/internal/grpcutil/grpcutil.go
create mode 100644 vendor/google.golang.org/grpc/internal/grpcutil/metadata.go
create mode 100644 vendor/google.golang.org/grpc/internal/grpcutil/method.go
create mode 100644 vendor/google.golang.org/grpc/internal/grpcutil/regex.go
create mode 100644 vendor/google.golang.org/grpc/internal/internal.go
create mode 100644 vendor/google.golang.org/grpc/internal/metadata/metadata.go
create mode 100644 vendor/google.golang.org/grpc/internal/pretty/pretty.go
create mode 100644 vendor/google.golang.org/grpc/internal/resolver/config_selector.go
create mode 100644 vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go
create mode 100644 vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go
create mode 100644 vendor/google.golang.org/grpc/internal/resolver/unix/unix.go
create mode 100644 vendor/google.golang.org/grpc/internal/serviceconfig/serviceconfig.go
create mode 100644 vendor/google.golang.org/grpc/internal/status/status.go
create mode 100644 vendor/google.golang.org/grpc/internal/syscall/syscall_linux.go
create mode 100644 vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go
create mode 100644 vendor/google.golang.org/grpc/internal/transport/bdp_estimator.go
create mode 100644 vendor/google.golang.org/grpc/internal/transport/controlbuf.go
create mode 100644 vendor/google.golang.org/grpc/internal/transport/defaults.go
create mode 100644 vendor/google.golang.org/grpc/internal/transport/flowcontrol.go
create mode 100644 vendor/google.golang.org/grpc/internal/transport/handler_server.go
create mode 100644 vendor/google.golang.org/grpc/internal/transport/http2_client.go
create mode 100644 vendor/google.golang.org/grpc/internal/transport/http2_server.go
create mode 100644 vendor/google.golang.org/grpc/internal/transport/http_util.go
create mode 100644 vendor/google.golang.org/grpc/internal/transport/networktype/networktype.go
create mode 100644 vendor/google.golang.org/grpc/internal/transport/proxy.go
create mode 100644 vendor/google.golang.org/grpc/internal/transport/transport.go
create mode 100644 vendor/google.golang.org/grpc/internal/xds_handshake_cluster.go
create mode 100644 vendor/google.golang.org/grpc/keepalive/keepalive.go
create mode 100644 vendor/google.golang.org/grpc/metadata/metadata.go
create mode 100644 vendor/google.golang.org/grpc/peer/peer.go
create mode 100644 vendor/google.golang.org/grpc/picker_wrapper.go
create mode 100644 vendor/google.golang.org/grpc/pickfirst.go
create mode 100644 vendor/google.golang.org/grpc/preloader.go
create mode 100644 vendor/google.golang.org/grpc/reflection/README.md
create mode 100644 vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection.pb.go
create mode 100644 vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection.proto
create mode 100644 vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection_grpc.pb.go
create mode 100644 vendor/google.golang.org/grpc/reflection/serverreflection.go
create mode 100644 vendor/google.golang.org/grpc/regenerate.sh
create mode 100644 vendor/google.golang.org/grpc/resolver/map.go
create mode 100644 vendor/google.golang.org/grpc/resolver/resolver.go
create mode 100644 vendor/google.golang.org/grpc/resolver_conn_wrapper.go
create mode 100644 vendor/google.golang.org/grpc/rpc_util.go
create mode 100644 vendor/google.golang.org/grpc/server.go
create mode 100644 vendor/google.golang.org/grpc/service_config.go
create mode 100644 vendor/google.golang.org/grpc/serviceconfig/serviceconfig.go
create mode 100644 vendor/google.golang.org/grpc/stats/handlers.go
create mode 100644 vendor/google.golang.org/grpc/stats/stats.go
create mode 100644 vendor/google.golang.org/grpc/status/status.go
create mode 100644 vendor/google.golang.org/grpc/stream.go
create mode 100644 vendor/google.golang.org/grpc/tap/tap.go
create mode 100644 vendor/google.golang.org/grpc/trace.go
create mode 100644 vendor/google.golang.org/grpc/version.go
create mode 100644 vendor/google.golang.org/grpc/vet.sh
create mode 100644 vendor/google.golang.org/protobuf/LICENSE
create mode 100644 vendor/google.golang.org/protobuf/PATENTS
create mode 100644 vendor/google.golang.org/protobuf/encoding/protojson/decode.go
create mode 100644 vendor/google.golang.org/protobuf/encoding/protojson/doc.go
create mode 100644 vendor/google.golang.org/protobuf/encoding/protojson/encode.go
create mode 100644 vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go
create mode 100644 vendor/google.golang.org/protobuf/encoding/prototext/decode.go
create mode 100644 vendor/google.golang.org/protobuf/encoding/prototext/doc.go
create mode 100644 vendor/google.golang.org/protobuf/encoding/prototext/encode.go
create mode 100644 vendor/google.golang.org/protobuf/encoding/protowire/wire.go
create mode 100644 vendor/google.golang.org/protobuf/internal/descfmt/stringer.go
create mode 100644 vendor/google.golang.org/protobuf/internal/descopts/options.go
create mode 100644 vendor/google.golang.org/protobuf/internal/detrand/rand.go
create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/defval/default.go
create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/json/decode.go
create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/json/decode_number.go
create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/json/decode_string.go
create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/json/decode_token.go
create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/json/encode.go
create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go
create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go
create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/decode.go
create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go
create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/decode_string.go
create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/decode_token.go
create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/doc.go
create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/encode.go
create mode 100644 vendor/google.golang.org/protobuf/internal/errors/errors.go
create mode 100644 vendor/google.golang.org/protobuf/internal/errors/is_go112.go
create mode 100644 vendor/google.golang.org/protobuf/internal/errors/is_go113.go
create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/build.go
create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc.go
create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go
create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go
create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go
create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc_list_gen.go
create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go
create mode 100644 vendor/google.golang.org/protobuf/internal/filetype/build.go
create mode 100644 vendor/google.golang.org/protobuf/internal/flags/flags.go
create mode 100644 vendor/google.golang.org/protobuf/internal/flags/proto_legacy_disable.go
create mode 100644 vendor/google.golang.org/protobuf/internal/flags/proto_legacy_enable.go
create mode 100644 vendor/google.golang.org/protobuf/internal/genid/any_gen.go
create mode 100644 vendor/google.golang.org/protobuf/internal/genid/api_gen.go
create mode 100644 vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go
create mode 100644 vendor/google.golang.org/protobuf/internal/genid/doc.go
create mode 100644 vendor/google.golang.org/protobuf/internal/genid/duration_gen.go
create mode 100644 vendor/google.golang.org/protobuf/internal/genid/empty_gen.go
create mode 100644 vendor/google.golang.org/protobuf/internal/genid/field_mask_gen.go
create mode 100644 vendor/google.golang.org/protobuf/internal/genid/goname.go
create mode 100644 vendor/google.golang.org/protobuf/internal/genid/map_entry.go
create mode 100644 vendor/google.golang.org/protobuf/internal/genid/source_context_gen.go
create mode 100644 vendor/google.golang.org/protobuf/internal/genid/struct_gen.go
create mode 100644 vendor/google.golang.org/protobuf/internal/genid/timestamp_gen.go
create mode 100644 vendor/google.golang.org/protobuf/internal/genid/type_gen.go
create mode 100644 vendor/google.golang.org/protobuf/internal/genid/wrappers.go
create mode 100644 vendor/google.golang.org/protobuf/internal/genid/wrappers_gen.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/api_export.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/checkinit.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_extension.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_field.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_gen.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_map.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_map_go111.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_map_go112.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_message.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_messageset.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_reflect.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_tables.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_unsafe.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/convert.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/convert_list.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/convert_map.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/decode.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/encode.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/enum.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/extension.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_export.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_file.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_message.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/merge.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/merge_gen.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/message.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/message_reflect.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/message_reflect_gen.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/pointer_reflect.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/validate.go
create mode 100644 vendor/google.golang.org/protobuf/internal/impl/weak.go
create mode 100644 vendor/google.golang.org/protobuf/internal/order/order.go
create mode 100644 vendor/google.golang.org/protobuf/internal/order/range.go
create mode 100644 vendor/google.golang.org/protobuf/internal/pragma/pragma.go
create mode 100644 vendor/google.golang.org/protobuf/internal/set/ints.go
create mode 100644 vendor/google.golang.org/protobuf/internal/strs/strings.go
create mode 100644 vendor/google.golang.org/protobuf/internal/strs/strings_pure.go
create mode 100644 vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go
create mode 100644 vendor/google.golang.org/protobuf/internal/version/version.go
create mode 100644 vendor/google.golang.org/protobuf/proto/checkinit.go
create mode 100644 vendor/google.golang.org/protobuf/proto/decode.go
create mode 100644 vendor/google.golang.org/protobuf/proto/decode_gen.go
create mode 100644 vendor/google.golang.org/protobuf/proto/doc.go
create mode 100644 vendor/google.golang.org/protobuf/proto/encode.go
create mode 100644 vendor/google.golang.org/protobuf/proto/encode_gen.go
create mode 100644 vendor/google.golang.org/protobuf/proto/equal.go
create mode 100644 vendor/google.golang.org/protobuf/proto/extension.go
create mode 100644 vendor/google.golang.org/protobuf/proto/merge.go
create mode 100644 vendor/google.golang.org/protobuf/proto/messageset.go
create mode 100644 vendor/google.golang.org/protobuf/proto/proto.go
create mode 100644 vendor/google.golang.org/protobuf/proto/proto_methods.go
create mode 100644 vendor/google.golang.org/protobuf/proto/proto_reflect.go
create mode 100644 vendor/google.golang.org/protobuf/proto/reset.go
create mode 100644 vendor/google.golang.org/protobuf/proto/size.go
create mode 100644 vendor/google.golang.org/protobuf/proto/size_gen.go
create mode 100644 vendor/google.golang.org/protobuf/proto/wrappers.go
create mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc.go
create mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go
create mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go
create mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go
create mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/proto.go
create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/methods.go
create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go
create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/source.go
create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go
create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/type.go
create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value.go
create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_pure.go
create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go
create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe.go
create mode 100644 vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go
create mode 100644 vendor/google.golang.org/protobuf/runtime/protoiface/legacy.go
create mode 100644 vendor/google.golang.org/protobuf/runtime/protoiface/methods.go
create mode 100644 vendor/google.golang.org/protobuf/runtime/protoimpl/impl.go
create mode 100644 vendor/google.golang.org/protobuf/runtime/protoimpl/version.go
create mode 100644 vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go
create mode 100644 vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go
create mode 100644 vendor/google.golang.org/protobuf/types/known/durationpb/duration.pb.go
create mode 100644 vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go
create mode 100644 vendor/gopkg.in/yaml.v2/.travis.yml
create mode 100644 vendor/gopkg.in/yaml.v2/LICENSE
create mode 100644 vendor/gopkg.in/yaml.v2/LICENSE.libyaml
create mode 100644 vendor/gopkg.in/yaml.v2/NOTICE
create mode 100644 vendor/gopkg.in/yaml.v2/README.md
create mode 100644 vendor/gopkg.in/yaml.v2/apic.go
create mode 100644 vendor/gopkg.in/yaml.v2/decode.go
create mode 100644 vendor/gopkg.in/yaml.v2/emitterc.go
create mode 100644 vendor/gopkg.in/yaml.v2/encode.go
create mode 100644 vendor/gopkg.in/yaml.v2/parserc.go
create mode 100644 vendor/gopkg.in/yaml.v2/readerc.go
create mode 100644 vendor/gopkg.in/yaml.v2/resolve.go
create mode 100644 vendor/gopkg.in/yaml.v2/scannerc.go
create mode 100644 vendor/gopkg.in/yaml.v2/sorter.go
create mode 100644 vendor/gopkg.in/yaml.v2/writerc.go
create mode 100644 vendor/gopkg.in/yaml.v2/yaml.go
create mode 100644 vendor/gopkg.in/yaml.v2/yamlh.go
create mode 100644 vendor/gopkg.in/yaml.v2/yamlprivateh.go
create mode 100644 vendor/modules.txt
diff --git a/.env-example b/.env-example
index 295ec3d..51775da 100644
--- a/.env-example
+++ b/.env-example
@@ -5,14 +5,14 @@ PORT = 9080
APP_CONF_DIR = ./conf
# Caddy Specifications
-CADDY_CONF_DIR = /etc/caddy
+CADDY_CONF_DIR = /home/shubham/Lazarus_Network/TunnelNode/Caddy
CADDY_INTERFACE_NAME = Caddyfile
CADDY_DOMAIN = webtun.mydomain.com
CADDY_UPPER_RANGE = 9000
CADDY_LOWER_RANGE = 8000
# NGINX Specifications
-NGINX_CONF_DIR = /etc/nginx
+NGINX_CONF_DIR = /home/shubham/Lazarus_Network/TunnelNode/NGINX
NGINX_INTERFACE_NAME = sites-available/tunnel.mydomain.com
NGINX_DOMAIN = sshtun.mydomain.com
NGINX_UPPER_RANGE = 7000
diff --git a/Caddy/Caddyfile b/Caddy/Caddyfile
new file mode 100644
index 0000000..7e0475a
--- /dev/null
+++ b/Caddy/Caddyfile
@@ -0,0 +1,72 @@
+
+# prince2, 6081, 2022-09-25T07:09:22Z
+prince2.sshtun.mydomain.com {
+ reverse_proxy / 127.0.0.1:6081
+ log {
+ output file /var/log/caddy/prince2.sshtun.mydomain.com.access.log {
+ roll_size 3MiB
+ roll_keep 5
+ roll_keep_for 48h
+ }
+ format console
+ }
+ encode gzip zstd
+
+ tls connect@lazarus.network {
+ protocols tls1.2 tls1.3
+ }
+}
+
+# guarav, 8081, 2022-09-26T15:50:48Z
+guarav.webtun.mydomain.com {
+ reverse_proxy / 127.0.0.1:8081
+ log {
+ output file /var/log/caddy/guarav.webtun.mydomain.com.access.log {
+ roll_size 3MiB
+ roll_keep 5
+ roll_keep_for 48h
+ }
+ format console
+ }
+ encode gzip zstd
+
+ tls connect@lazarus.network {
+ protocols tls1.2 tls1.3
+ }
+}
+
+# guarava, 8887, 2022-09-26T15:55:14Z
+guarava.webtun.mydomain.com {
+ reverse_proxy / 127.0.0.1:8887
+ log {
+ output file /var/log/caddy/guarava.webtun.mydomain.com.access.log {
+ roll_size 3MiB
+ roll_keep 5
+ roll_keep_for 48h
+ }
+ format console
+ }
+ encode gzip zstd
+
+ tls connect@lazarus.network {
+ protocols tls1.2 tls1.3
+ }
+}
+
+# guaravaa, 8847, 2022-09-26T15:57:51Z
+guaravaa.webtun.mydomain.com {
+ reverse_proxy / 127.0.0.1:8847
+ log {
+ output file /var/log/caddy/guaravaa.webtun.mydomain.com.access.log {
+ roll_size 3MiB
+ roll_keep 5
+ roll_keep_for 48h
+ }
+ format console
+ }
+ encode gzip zstd
+
+ tls connect@lazarus.network {
+ protocols tls1.2 tls1.3
+ }
+}
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..7b32227
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,36 @@
+
+.PHONY: proto generate
+gen:
+ protoc --proto_path=proto proto/*.proto --go_out=api/v1/nginx --go-grpc_out=api/v1/nginx
+
+clean:
+ rm -rf server/pb/
+ rm -rf client/pb/
+
+.PHONY: run server
+server:
+ go run server/main.go redis
+
+.PHONY: run client
+client:
+ go run client/main.go
+
+install:
+ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26
+ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1
+ sudo apt install protobuf
+ sudo apt install clang-format
+ sudo apt install grpcurl
+ export GO_PATH=~/go
+ export PATH=$PATH:/$GO_PATH/bin
+ go mod vendor
+path:
+ export GO_PATH=~/go
+ export PATH=$PATH:/$GO_PATH/bin
+
+test:
+ rm -rf tmp && mkdir tmp
+ go test -cover -race serializer/*.go
+
+run:
+ go run . ./.env
\ No newline at end of file
diff --git a/NGINX/sites-available/tunnel.mydomain.com b/NGINX/sites-available/tunnel.mydomain.com
new file mode 100644
index 0000000..351d989
--- /dev/null
+++ b/NGINX/sites-available/tunnel.mydomain.com
@@ -0,0 +1,195 @@
+
+# prince2, 6081, 2022-09-25T07:09:22Z
+server {
+ listen 6000;
+ server_name prince2.sshtun.mydomain.com;
+
+ location / {
+ proxy_pass http://127.0.0.1:6081$request_uri;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_buffering off;
+ proxy_redirect off;
+ }
+}
+
+# prince3, 6887, 2022-09-25T07:13:13Z
+server {
+ listen 6000;
+ server_name prince3.sshtun.mydomain.com;
+
+ location / {
+ proxy_pass http://127.0.0.1:6887$request_uri;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_buffering off;
+ proxy_redirect off;
+ }
+}
+
+# prince4, 6847, 2022-09-25T07:16:25Z
+server {
+ listen 6000;
+ server_name prince4.sshtun.mydomain.com;
+
+ location / {
+ proxy_pass http://127.0.0.1:6847$request_uri;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_buffering off;
+ proxy_redirect off;
+ }
+}
+
+# creta, 6059, 2022-09-26T05:19:57Z
+server {
+ listen 6000;
+ server_name creta.sshtun.mydomain.com;
+
+ location / {
+ proxy_pass http://127.0.0.1:6059$request_uri;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_buffering off;
+ proxy_redirect off;
+ }
+}
+
+# creta2, 6318, 2022-09-26T05:21:00Z
+server {
+ listen 6000;
+ server_name creta2.sshtun.mydomain.com;
+
+ location / {
+ proxy_pass http://127.0.0.1:6318$request_uri;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_buffering off;
+ proxy_redirect off;
+ }
+}
+
+# creta3, 6425, 2022-09-26T07:31:10Z
+server {
+ listen 6000;
+ server_name creta3.sshtun.mydomain.com;
+
+ location / {
+ proxy_pass http://127.0.0.1:6425$request_uri;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_buffering off;
+ proxy_redirect off;
+ }
+}
+
+# magic, 6540, 2022-09-26T08:09:55Z
+server {
+ listen 6000;
+ server_name magic.sshtun.mydomain.com;
+
+ location / {
+ proxy_pass http://127.0.0.1:6540$request_uri;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_buffering off;
+ proxy_redirect off;
+ }
+}
+
+# lolop, 6300, 2022-09-26T09:55:32Z
+server {
+ listen 6000;
+ server_name lolop.sshtun.mydomain.com;
+
+ location / {
+ proxy_pass http://127.0.0.1:6300$request_uri;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_buffering off;
+ proxy_redirect off;
+ }
+}
+
+# ayuhs, 6694, 2022-09-26T10:59:21Z
+server {
+ listen 6000;
+ server_name ayuhs.sshtun.mydomain.com;
+
+ location / {
+ proxy_pass http://127.0.0.1:6694$request_uri;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_buffering off;
+ proxy_redirect off;
+ }
+}
+
+# nitish, 6511, 2022-09-26T11:13:42Z
+server {
+ listen 6000;
+ server_name nitish.sshtun.mydomain.com;
+
+ location / {
+ proxy_pass http://127.0.0.1:6511$request_uri;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_buffering off;
+ proxy_redirect off;
+ }
+}
+
+# abhinav, 6162, 2022-09-26T11:31:52Z
+server {
+ listen 6000;
+ server_name abhinav.sshtun.mydomain.com;
+
+ location / {
+ proxy_pass http://127.0.0.1:6162$request_uri;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_buffering off;
+ proxy_redirect off;
+ }
+}
+
+# granted, 6089, 2022-09-26T11:39:56Z
+server {
+ listen 6000;
+ server_name granted.sshtun.mydomain.com;
+
+ location / {
+ proxy_pass http://127.0.0.1:6089$request_uri;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_buffering off;
+ proxy_redirect off;
+ }
+}
+
+# pushpa, 6728, 2022-09-26T11:41:49Z
+server {
+ listen 6000;
+ server_name pushpa.sshtun.mydomain.com;
+
+ location / {
+ proxy_pass http://127.0.0.1:6728$request_uri;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_buffering off;
+ proxy_redirect off;
+ }
+}
diff --git a/api/v1/caddy/caddy.go b/api/v1/caddy/caddy.go
index 907c5d7..8d49044 100644
--- a/api/v1/caddy/caddy.go
+++ b/api/v1/caddy/caddy.go
@@ -1,12 +1,16 @@
package caddy
import (
+ "encoding/json"
+ "errors"
+ "fmt"
"net/http"
"os"
"strconv"
"strings"
"time"
+ "github.com/TheLazarusNetwork/LazarusTunnel/api/v1/nginx/pb/tunnel"
"github.com/TheLazarusNetwork/LazarusTunnel/core"
"github.com/TheLazarusNetwork/LazarusTunnel/middleware"
"github.com/TheLazarusNetwork/LazarusTunnel/model"
@@ -31,6 +35,7 @@ var resp map[string]interface{}
func addTunnel(c *gin.Context) {
//post form parameters
name := strings.ToLower(c.PostForm("name"))
+ fmt.Println("name :", name)
// port allocation
max, _ := strconv.Atoi(os.Getenv("CADDY_UPPER_RANGE"))
@@ -38,18 +43,31 @@ func addTunnel(c *gin.Context) {
for {
port, err := core.GetPort(max, min)
+ fmt.Println("Port caddy :", port)
+
+ // fmt.Println("Port :", port)
+ fmt.Println("err :", err)
if err != nil {
panic(err)
+
+ // fmt.Println("this is the panic err :",err)
+
}
// check validity of tunnel name and port
value, msg, err := middleware.IsValidWeb(name, port)
+ fmt.Println("caddyValue :", value)
+ fmt.Println("msg :", msg)
+ fmt.Println("err :", err)
+ // fmt.Println("value :", value)
if err != nil {
+ fmt.Println("first err != nill")
resp = util.Message(500, "Server error, Try after some time or Contact Admin...")
- c.JSON(http.StatusOK, resp)
+ c.JSON(http.StatusBadGateway, resp)
break
} else if value == -1 {
+ fmt.Println("before port is already in use")
if msg == "Port Already in use" {
continue
}
@@ -157,3 +175,150 @@ func deleteTunnel(c *gin.Context) {
}
}
+
+// caddy===========================================================================
+
+func CaddyGetTunnelByName(nameIn string) (*tunnel.Tunnel, int, error) {
+ //get parameter
+ // name := c.Param("name")
+
+ //read tunnel config
+ tunnl, err := middleware.ReadSSHTunnel(nameIn)
+ if err != nil {
+ // resp = util.Message(500, "Server error, Try after some time or Contact Admin...")
+ // c.JSON(http.StatusInternalServerError, resp)
+ return nil, 500, errors.New("Server error, Try after some time or Contact Admin...")
+
+ }
+ t := &tunnel.Tunnel{}
+ //check if tunnel exists
+ if tunnl.Name == "" {
+ resp = util.Message(404, "Tunnel Doesn't Exists")
+ // c.JSON(http.StatusNotFound, resp)
+ return nil, 404, errors.New("Tunnel Doesn't Exists")
+
+ } else {
+ port, err := strconv.Atoi(tunnl.Port)
+ if err != nil {
+ util.LogError("string conv error: ", err)
+ // resp = util.Message(500, "Server error, Try after some time or Contact Admin...")
+ // c.JSON(http.StatusInternalServerError, resp)
+
+ return nil, 500, errors.New("Server error, Try after some time or Contact Admin...")
+
+ } else {
+ status, err := core.ScanPort(port)
+ if err != nil {
+ // resp = util.Message(500, "Server error, Try after some time or Contact Admin...")
+ // c.JSON(http.StatusInternalServerError, resp)
+ return nil, 500, errors.New("Server error, Try after some time or Contact Admin...")
+
+ } else {
+ tunnl.Status = status
+ // resp = util.MessageTunnel(200, *tunnel)
+ // c.JSON(http.StatusOK, resp)
+ t = &tunnel.Tunnel{
+ Name: tunnl.Name,
+ Port: tunnl.Port,
+ CreatedAt: tunnl.CreatedAt,
+ Domain: tunnl.Domain,
+ Status: tunnl.Status,
+ }
+ }
+ }
+ }
+ return t, 200, nil
+
+}
+
+func CaddyDeleteTunnel(nameIn string) (string, int, error) {
+
+ //read tunnel config
+ msg := ""
+ tunnel, err := middleware.ReadSSHTunnel(nameIn)
+ if err != nil {
+ return "", 500, errors.New("Server error, Try after some time or Contact Admin...")
+
+ }
+
+ //check if tunnel exists
+ if tunnel.Name == "" {
+ return "", 400, errors.New("Tunnel Doesn't Exists")
+ } else {
+ //delete tunnel config
+ err = middleware.DeleteSSHTunnel(nameIn)
+ if err != nil {
+ return "", 500, errors.New("Server error, Try after some time or Contact Admin...")
+
+ } else {
+ msg = "Deleted Tunnel: " + nameIn
+ }
+ }
+ return msg, 200, nil
+}
+
+func CaddyGetTunnels() ([]*tunnel.Tunnel, int, error) {
+ //read all tunnel config
+ tunnels, err := middleware.ReadSSHTunnels()
+ if err != nil {
+ err = errors.New("Server error, Try after some time or Contact Admin...")
+ return nil, 500, err
+ }
+ tun := []*tunnel.Tunnel{}
+ btunn, _ := json.Marshal(tunnels.Tunnels)
+ json.Unmarshal(btunn, &tun)
+ return tun, 200, nil
+}
+
+func CaddySetTunnel(nameIn string) (*tunnel.Tunnel, int, error) {
+ //post form parameters
+ name := strings.ToLower(nameIn)
+ t := &tunnel.Tunnel{}
+ // port allocation
+ max, _ := strconv.Atoi(os.Getenv("NGINX_UPPER_RANGE"))
+ min, _ := strconv.Atoi(os.Getenv("NGINX_LOWER_RANGE"))
+
+ for {
+ port, err := core.GetPort(max, min)
+ if err != nil {
+ panic(err)
+ }
+
+ value, msg, err := middleware.IsValidSSH(name, port)
+ if err != nil {
+ return nil, 500, errors.New("Server error, Try after some time or Contact Admin...")
+ break
+ } else if value == -1 {
+ if msg == "Port Already in use" {
+ continue
+ }
+ return nil, 404, errors.New(msg)
+ break
+ } else if value == 1 {
+ //create a tunnel struct object
+ var data model.Tunnel
+ data.Name = name
+ data.Port = strconv.Itoa(port)
+ data.CreatedAt = time.Now().UTC().Format(time.RFC3339)
+ data.Domain = os.Getenv("NGINX_DOMAIN")
+
+ //to add tunnel config
+ err := middleware.AddSSHTunnel(data)
+ if err != nil {
+ return nil, 500, errors.New("Server error, Try after some time or Contact Admin...")
+ break
+ } else {
+ resp = util.MessageTunnel(200, data)
+ t = &tunnel.Tunnel{
+ Name: data.Name,
+ Port: data.Port,
+ CreatedAt: data.CreatedAt,
+ Domain: data.Domain,
+ Status: data.Status,
+ }
+ break
+ }
+ }
+ }
+ return t, 200, nil
+}
diff --git a/api/v1/nginx/nginx.go b/api/v1/nginx/nginx.go
index 4d7e399..3e00328 100644
--- a/api/v1/nginx/nginx.go
+++ b/api/v1/nginx/nginx.go
@@ -1,12 +1,16 @@
package nginx
import (
+ "encoding/json"
+ "errors"
+ "fmt"
"net/http"
"os"
"strconv"
"strings"
"time"
+ "github.com/TheLazarusNetwork/LazarusTunnel/api/v1/nginx/pb/tunnel"
"github.com/TheLazarusNetwork/LazarusTunnel/core"
"github.com/TheLazarusNetwork/LazarusTunnel/middleware"
"github.com/TheLazarusNetwork/LazarusTunnel/model"
@@ -31,6 +35,7 @@ var resp map[string]interface{}
func addTunnel(c *gin.Context) {
//post form parameters
name := strings.ToLower(c.PostForm("name"))
+ fmt.Println("nameNginix :", name)
// port allocation
max, _ := strconv.Atoi(os.Getenv("NGINX_UPPER_RANGE"))
@@ -38,16 +43,26 @@ func addTunnel(c *gin.Context) {
for {
port, err := core.GetPort(max, min)
+ fmt.Println("Port :", port)
+ fmt.Println("err :", err)
if err != nil {
panic(err)
+ // fmt.Println("this is the panic error", err)
}
value, msg, err := middleware.IsValidSSH(name, port)
+
+ fmt.Println("valueNginix :", value, msg)
+ // fmt.Println("caddyNginixValue :", value, msg, err)
+ fmt.Println("msg :", msg)
+ fmt.Println("err :", err)
+
if err != nil {
resp = util.Message(500, "Server error, Try after some time or Contact Admin...")
- c.JSON(http.StatusOK, resp)
+ c.JSON(http.StatusBadRequest, resp)
break
} else if value == -1 {
+
if msg == "Port Already in use" {
continue
}
@@ -91,6 +106,72 @@ func getTunnels(c *gin.Context) {
}
}
+func GetTunnels() ([]*tunnel.Tunnel, int, error) {
+ //read all tunnel config
+ tunnels, err := middleware.ReadSSHTunnels()
+ if err != nil {
+ err = errors.New("Server error, Try after some time or Contact Admin...")
+ return nil, 500, err
+ }
+ tun := []*tunnel.Tunnel{}
+ btunn, _ := json.Marshal(tunnels.Tunnels)
+ json.Unmarshal(btunn, &tun)
+ return tun, 200, nil
+}
+
+func SetTunnel(nameIn string) (*tunnel.Tunnel, int, error) {
+ //post form parameters
+ name := strings.ToLower(nameIn)
+ t := &tunnel.Tunnel{}
+ // port allocation
+ max, _ := strconv.Atoi(os.Getenv("NGINX_UPPER_RANGE"))
+ min, _ := strconv.Atoi(os.Getenv("NGINX_LOWER_RANGE"))
+
+ for {
+ port, err := core.GetPort(max, min)
+ if err != nil {
+ panic(err)
+ }
+
+ value, msg, err := middleware.IsValidSSH(name, port)
+ if err != nil {
+ return nil, 500, errors.New("Server error, Try after some time or Contact Admin...")
+ break
+ } else if value == -1 {
+ if msg == "Port Already in use" {
+ continue
+ }
+ return nil, 404, errors.New(msg)
+ break
+ } else if value == 1 {
+ //create a tunnel struct object
+ var data model.Tunnel
+ data.Name = name
+ data.Port = strconv.Itoa(port)
+ data.CreatedAt = time.Now().UTC().Format(time.RFC3339)
+ data.Domain = os.Getenv("NGINX_DOMAIN")
+
+ //to add tunnel config
+ err := middleware.AddSSHTunnel(data)
+ if err != nil {
+ return nil, 500, errors.New("Server error, Try after some time or Contact Admin...")
+ break
+ } else {
+ resp = util.MessageTunnel(200, data)
+ t = &tunnel.Tunnel{
+ Name: data.Name,
+ Port: data.Port,
+ CreatedAt: data.CreatedAt,
+ Domain: data.Domain,
+ Status: data.Status,
+ }
+ break
+ }
+ }
+ }
+ return t, 200, nil
+}
+
//getTunnel get specific tunnel config
func getTunnel(c *gin.Context) {
//get parameter
@@ -155,3 +236,84 @@ func deleteTunnel(c *gin.Context) {
}
}
+
+// nginix========================================================================functions
+
+func DeleteTunnel(nameIn string) (string, int, error) {
+
+ //read tunnel config
+ msg := ""
+ tunnel, err := middleware.ReadSSHTunnel(nameIn)
+ if err != nil {
+ return "", 500, errors.New("Server error, Try after some time or Contact Admin...")
+
+ }
+
+ //check if tunnel exists
+ if tunnel.Name == "" {
+ return "", 400, errors.New("Tunnel Doesn't Exists")
+ } else {
+ //delete tunnel config
+ err = middleware.DeleteSSHTunnel(nameIn)
+ if err != nil {
+ return "", 500, errors.New("Server error, Try after some time or Contact Admin...")
+
+ } else {
+ msg = "Deleted Tunnel: " + nameIn
+ }
+ }
+ return msg, 200, nil
+}
+
+func GetTunnelByName(nameIn string) (*tunnel.Tunnel, int, error) {
+ //get parameter
+ // name := c.Param("name")
+
+ //read tunnel config
+ tunnl, err := middleware.ReadSSHTunnel(nameIn)
+ if err != nil {
+ // resp = util.Message(500, "Server error, Try after some time or Contact Admin...")
+ // c.JSON(http.StatusInternalServerError, resp)
+ return nil, 500, errors.New("Server error, Try after some time or Contact Admin...")
+
+ }
+ t := &tunnel.Tunnel{}
+ //check if tunnel exists
+ if tunnl.Name == "" {
+ resp = util.Message(404, "Tunnel Doesn't Exists")
+ // c.JSON(http.StatusNotFound, resp)
+ return nil, 404, errors.New("Tunnel Doesn't Exists")
+
+ } else {
+ port, err := strconv.Atoi(tunnl.Port)
+ if err != nil {
+ util.LogError("string conv error: ", err)
+ // resp = util.Message(500, "Server error, Try after some time or Contact Admin...")
+ // c.JSON(http.StatusInternalServerError, resp)
+
+ return nil, 500, errors.New("Server error, Try after some time or Contact Admin...")
+
+ } else {
+ status, err := core.ScanPort(port)
+ if err != nil {
+ // resp = util.Message(500, "Server error, Try after some time or Contact Admin...")
+ // c.JSON(http.StatusInternalServerError, resp)
+ return nil, 500, errors.New("Server error, Try after some time or Contact Admin...")
+
+ } else {
+ tunnl.Status = status
+ // resp = util.MessageTunnel(200, *tunnel)
+ // c.JSON(http.StatusOK, resp)
+ t = &tunnel.Tunnel{
+ Name: tunnl.Name,
+ Port: tunnl.Port,
+ CreatedAt: tunnl.CreatedAt,
+ Domain: tunnl.Domain,
+ Status: tunnl.Status,
+ }
+ }
+ }
+ }
+ return t, 200, nil
+
+}
diff --git a/api/v1/nginx/pb/tunnel/tunnel.pb.go b/api/v1/nginx/pb/tunnel/tunnel.pb.go
new file mode 100644
index 0000000..15b182d
--- /dev/null
+++ b/api/v1/nginx/pb/tunnel/tunnel.pb.go
@@ -0,0 +1,343 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: tunnel.proto
+
+package tunnel
+
+import (
+ fmt "fmt"
+ proto "github.com/golang/protobuf/proto"
+ math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type SetTunnelRequest struct {
+ Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *SetTunnelRequest) Reset() { *m = SetTunnelRequest{} }
+func (m *SetTunnelRequest) String() string { return proto.CompactTextString(m) }
+func (*SetTunnelRequest) ProtoMessage() {}
+func (*SetTunnelRequest) Descriptor() ([]byte, []int) {
+ return fileDescriptor_6f51ddaa7891a711, []int{0}
+}
+
+func (m *SetTunnelRequest) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_SetTunnelRequest.Unmarshal(m, b)
+}
+func (m *SetTunnelRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_SetTunnelRequest.Marshal(b, m, deterministic)
+}
+func (m *SetTunnelRequest) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_SetTunnelRequest.Merge(m, src)
+}
+func (m *SetTunnelRequest) XXX_Size() int {
+ return xxx_messageInfo_SetTunnelRequest.Size(m)
+}
+func (m *SetTunnelRequest) XXX_DiscardUnknown() {
+ xxx_messageInfo_SetTunnelRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SetTunnelRequest proto.InternalMessageInfo
+
+func (m *SetTunnelRequest) GetName() string {
+ if m != nil {
+ return m.Name
+ }
+ return ""
+}
+
+type Tunnel struct {
+ Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+ Port string `protobuf:"bytes,2,opt,name=port,proto3" json:"port,omitempty"`
+ CreatedAt string `protobuf:"bytes,3,opt,name=createdAt,proto3" json:"createdAt,omitempty"`
+ Domain string `protobuf:"bytes,4,opt,name=domain,proto3" json:"domain,omitempty"`
+ Status string `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *Tunnel) Reset() { *m = Tunnel{} }
+func (m *Tunnel) String() string { return proto.CompactTextString(m) }
+func (*Tunnel) ProtoMessage() {}
+func (*Tunnel) Descriptor() ([]byte, []int) {
+ return fileDescriptor_6f51ddaa7891a711, []int{1}
+}
+
+func (m *Tunnel) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_Tunnel.Unmarshal(m, b)
+}
+func (m *Tunnel) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_Tunnel.Marshal(b, m, deterministic)
+}
+func (m *Tunnel) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_Tunnel.Merge(m, src)
+}
+func (m *Tunnel) XXX_Size() int {
+ return xxx_messageInfo_Tunnel.Size(m)
+}
+func (m *Tunnel) XXX_DiscardUnknown() {
+ xxx_messageInfo_Tunnel.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Tunnel proto.InternalMessageInfo
+
+func (m *Tunnel) GetName() string {
+ if m != nil {
+ return m.Name
+ }
+ return ""
+}
+
+func (m *Tunnel) GetPort() string {
+ if m != nil {
+ return m.Port
+ }
+ return ""
+}
+
+func (m *Tunnel) GetCreatedAt() string {
+ if m != nil {
+ return m.CreatedAt
+ }
+ return ""
+}
+
+func (m *Tunnel) GetDomain() string {
+ if m != nil {
+ return m.Domain
+ }
+ return ""
+}
+
+func (m *Tunnel) GetStatus() string {
+ if m != nil {
+ return m.Status
+ }
+ return ""
+}
+
+type GetTunnelResponse struct {
+ Message []*Tunnel `protobuf:"bytes,1,rep,name=message,proto3" json:"message,omitempty"`
+ Status int32 `protobuf:"varint,2,opt,name=status,proto3" json:"status,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *GetTunnelResponse) Reset() { *m = GetTunnelResponse{} }
+func (m *GetTunnelResponse) String() string { return proto.CompactTextString(m) }
+func (*GetTunnelResponse) ProtoMessage() {}
+func (*GetTunnelResponse) Descriptor() ([]byte, []int) {
+ return fileDescriptor_6f51ddaa7891a711, []int{2}
+}
+
+func (m *GetTunnelResponse) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_GetTunnelResponse.Unmarshal(m, b)
+}
+func (m *GetTunnelResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_GetTunnelResponse.Marshal(b, m, deterministic)
+}
+func (m *GetTunnelResponse) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_GetTunnelResponse.Merge(m, src)
+}
+func (m *GetTunnelResponse) XXX_Size() int {
+ return xxx_messageInfo_GetTunnelResponse.Size(m)
+}
+func (m *GetTunnelResponse) XXX_DiscardUnknown() {
+ xxx_messageInfo_GetTunnelResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetTunnelResponse proto.InternalMessageInfo
+
+func (m *GetTunnelResponse) GetMessage() []*Tunnel {
+ if m != nil {
+ return m.Message
+ }
+ return nil
+}
+
+func (m *GetTunnelResponse) GetStatus() int32 {
+ if m != nil {
+ return m.Status
+ }
+ return 0
+}
+
+type SetTunnelResponse struct {
+ Message *Tunnel `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
+ Status int32 `protobuf:"varint,2,opt,name=status,proto3" json:"status,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *SetTunnelResponse) Reset() { *m = SetTunnelResponse{} }
+func (m *SetTunnelResponse) String() string { return proto.CompactTextString(m) }
+func (*SetTunnelResponse) ProtoMessage() {}
+func (*SetTunnelResponse) Descriptor() ([]byte, []int) {
+ return fileDescriptor_6f51ddaa7891a711, []int{3}
+}
+
+func (m *SetTunnelResponse) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_SetTunnelResponse.Unmarshal(m, b)
+}
+func (m *SetTunnelResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_SetTunnelResponse.Marshal(b, m, deterministic)
+}
+func (m *SetTunnelResponse) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_SetTunnelResponse.Merge(m, src)
+}
+func (m *SetTunnelResponse) XXX_Size() int {
+ return xxx_messageInfo_SetTunnelResponse.Size(m)
+}
+func (m *SetTunnelResponse) XXX_DiscardUnknown() {
+ xxx_messageInfo_SetTunnelResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SetTunnelResponse proto.InternalMessageInfo
+
+func (m *SetTunnelResponse) GetMessage() *Tunnel {
+ if m != nil {
+ return m.Message
+ }
+ return nil
+}
+
+func (m *SetTunnelResponse) GetStatus() int32 {
+ if m != nil {
+ return m.Status
+ }
+ return 0
+}
+
+type DeleteTunnelResponse struct {
+ Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
+ Status int32 `protobuf:"varint,2,opt,name=status,proto3" json:"status,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *DeleteTunnelResponse) Reset() { *m = DeleteTunnelResponse{} }
+func (m *DeleteTunnelResponse) String() string { return proto.CompactTextString(m) }
+func (*DeleteTunnelResponse) ProtoMessage() {}
+func (*DeleteTunnelResponse) Descriptor() ([]byte, []int) {
+ return fileDescriptor_6f51ddaa7891a711, []int{4}
+}
+
+func (m *DeleteTunnelResponse) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_DeleteTunnelResponse.Unmarshal(m, b)
+}
+func (m *DeleteTunnelResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_DeleteTunnelResponse.Marshal(b, m, deterministic)
+}
+func (m *DeleteTunnelResponse) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_DeleteTunnelResponse.Merge(m, src)
+}
+func (m *DeleteTunnelResponse) XXX_Size() int {
+ return xxx_messageInfo_DeleteTunnelResponse.Size(m)
+}
+func (m *DeleteTunnelResponse) XXX_DiscardUnknown() {
+ xxx_messageInfo_DeleteTunnelResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DeleteTunnelResponse proto.InternalMessageInfo
+
+func (m *DeleteTunnelResponse) GetMessage() string {
+ if m != nil {
+ return m.Message
+ }
+ return ""
+}
+
+func (m *DeleteTunnelResponse) GetStatus() int32 {
+ if m != nil {
+ return m.Status
+ }
+ return 0
+}
+
+type Empty struct {
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *Empty) Reset() { *m = Empty{} }
+func (m *Empty) String() string { return proto.CompactTextString(m) }
+func (*Empty) ProtoMessage() {}
+func (*Empty) Descriptor() ([]byte, []int) {
+ return fileDescriptor_6f51ddaa7891a711, []int{5}
+}
+
+func (m *Empty) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_Empty.Unmarshal(m, b)
+}
+func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_Empty.Marshal(b, m, deterministic)
+}
+func (m *Empty) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_Empty.Merge(m, src)
+}
+func (m *Empty) XXX_Size() int {
+ return xxx_messageInfo_Empty.Size(m)
+}
+func (m *Empty) XXX_DiscardUnknown() {
+ xxx_messageInfo_Empty.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Empty proto.InternalMessageInfo
+
+func init() {
+ proto.RegisterType((*SetTunnelRequest)(nil), "tunnelservice.SetTunnelRequest")
+ proto.RegisterType((*Tunnel)(nil), "tunnelservice.Tunnel")
+ proto.RegisterType((*GetTunnelResponse)(nil), "tunnelservice.GetTunnelResponse")
+ proto.RegisterType((*SetTunnelResponse)(nil), "tunnelservice.SetTunnelResponse")
+ proto.RegisterType((*DeleteTunnelResponse)(nil), "tunnelservice.DeleteTunnelResponse")
+ proto.RegisterType((*Empty)(nil), "tunnelservice.Empty")
+}
+
+func init() {
+ proto.RegisterFile("tunnel.proto", fileDescriptor_6f51ddaa7891a711)
+}
+
+var fileDescriptor_6f51ddaa7891a711 = []byte{
+ // 360 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x94, 0x5d, 0x4b, 0x3a, 0x41,
+ 0x14, 0xc6, 0xff, 0xfe, 0x75, 0x95, 0x3d, 0x9a, 0xe5, 0x60, 0xb1, 0x44, 0x90, 0x6c, 0x10, 0x5e,
+ 0x29, 0xd8, 0x27, 0xc8, 0x5e, 0x0c, 0x02, 0x09, 0x37, 0xbb, 0xa8, 0x6e, 0x56, 0xf7, 0x20, 0x82,
+ 0xfb, 0xd2, 0xce, 0x31, 0xf2, 0xa6, 0xcf, 0xd4, 0x47, 0x8c, 0x99, 0xf1, 0x75, 0x94, 0x2c, 0xdc,
+ 0xbb, 0x99, 0xe7, 0x3c, 0xf3, 0x9b, 0x67, 0x1f, 0x86, 0x85, 0x02, 0x8d, 0x83, 0x00, 0x47, 0xb5,
+ 0x28, 0x0e, 0x29, 0x64, 0x7b, 0x6a, 0xc7, 0x31, 0x7e, 0x1f, 0xf6, 0xd1, 0x3e, 0x87, 0x03, 0x07,
+ 0xe9, 0x51, 0x6a, 0x1d, 0x7c, 0x1b, 0x23, 0x27, 0xc6, 0x20, 0x13, 0xb8, 0x3e, 0x5a, 0xa9, 0x4a,
+ 0xaa, 0x6a, 0x76, 0xe4, 0xda, 0xfe, 0x84, 0xac, 0x32, 0x6d, 0x9a, 0x0a, 0x2d, 0x0a, 0x63, 0xb2,
+ 0xfe, 0x2b, 0x4d, 0xac, 0xd9, 0x09, 0x98, 0xfd, 0x18, 0x5d, 0x42, 0xef, 0x92, 0xac, 0xb4, 0x1c,
+ 0x2c, 0x04, 0x76, 0x04, 0x59, 0x2f, 0xf4, 0xdd, 0x61, 0x60, 0x65, 0xe4, 0x68, 0xba, 0x13, 0x3a,
+ 0x27, 0x97, 0xc6, 0xdc, 0x32, 0x94, 0xae, 0x76, 0xf6, 0x2b, 0x94, 0x5a, 0x8b, 0x9c, 0x3c, 0x0a,
+ 0x03, 0x8e, 0xac, 0x0e, 0x39, 0x1f, 0x39, 0x77, 0x07, 0x22, 0x4d, 0xba, 0x9a, 0x6f, 0x1c, 0xd6,
+ 0x56, 0xbe, 0xae, 0x36, 0xf5, 0xcf, 0x5c, 0x4b, 0x74, 0x91, 0xd4, 0x58, 0xa6, 0x3b, 0x3f, 0xd3,
+ 0x53, 0x3b, 0xd0, 0xef, 0xa0, 0x7c, 0x8d, 0x23, 0x24, 0xd4, 0x2e, 0xb0, 0x56, 0x2f, 0x30, 0xb7,
+ 0x93, 0x72, 0x60, 0xdc, 0xf8, 0x11, 0x4d, 0x1a, 0x5f, 0x06, 0xb0, 0xf6, 0x60, 0x18, 0x7c, 0x28,
+ 0xa4, 0xa3, 0x12, 0xb1, 0x5b, 0x80, 0x79, 0x4b, 0x9c, 0x95, 0xb5, 0xbc, 0xf2, 0xe8, 0x71, 0x45,
+ 0x53, 0xd7, 0x6a, 0xb5, 0xff, 0xb1, 0x07, 0x30, 0xe7, 0x7d, 0xb0, 0x53, 0xed, 0x80, 0xfe, 0x5e,
+ 0xd6, 0x88, 0xce, 0x06, 0xe2, 0x13, 0x14, 0x96, 0x3b, 0xd8, 0x0e, 0x3d, 0xd3, 0x0c, 0x9b, 0x1a,
+ 0x54, 0x49, 0x5b, 0x48, 0xcd, 0x49, 0x5b, 0x3c, 0xc3, 0x44, 0x92, 0xde, 0xc3, 0x7e, 0x0b, 0xe9,
+ 0xca, 0xf5, 0xbc, 0xc9, 0xee, 0x45, 0x76, 0xa1, 0xe8, 0xac, 0xc0, 0x92, 0xc9, 0xf8, 0x02, 0x25,
+ 0xd5, 0xc7, 0x9f, 0xc8, 0xbf, 0xac, 0xb4, 0x0b, 0xc5, 0x59, 0x01, 0x09, 0xf6, 0xda, 0xcc, 0x3f,
+ 0x9b, 0x51, 0xaf, 0xae, 0x7c, 0xbd, 0xac, 0xfc, 0x19, 0x5d, 0x7c, 0x07, 0x00, 0x00, 0xff, 0xff,
+ 0xed, 0x5d, 0x5e, 0x4d, 0x9c, 0x04, 0x00, 0x00,
+}
diff --git a/api/v1/nginx/pb/tunnel/tunnel_grpc.pb.go b/api/v1/nginx/pb/tunnel/tunnel_grpc.pb.go
new file mode 100644
index 0000000..4d6dacd
--- /dev/null
+++ b/api/v1/nginx/pb/tunnel/tunnel_grpc.pb.go
@@ -0,0 +1,359 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.2.0
+// - protoc v3.12.4
+// source: tunnel.proto
+
+package tunnel
+
+import (
+ context "context"
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+// NginxTunnelServiceClient is the client API for NginxTunnelService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type NginxTunnelServiceClient interface {
+ GetTunnels(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetTunnelResponse, error)
+ SetTunnel(ctx context.Context, in *SetTunnelRequest, opts ...grpc.CallOption) (*SetTunnelResponse, error)
+ DeleteTunnel(ctx context.Context, in *SetTunnelRequest, opts ...grpc.CallOption) (*DeleteTunnelResponse, error)
+ GetByName(ctx context.Context, in *SetTunnelRequest, opts ...grpc.CallOption) (*SetTunnelResponse, error)
+ //
+ GetCaddyTunnels(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetTunnelResponse, error)
+ SetCaddyTunnel(ctx context.Context, in *SetTunnelRequest, opts ...grpc.CallOption) (*SetTunnelResponse, error)
+ DeleteCaddyTunnel(ctx context.Context, in *SetTunnelRequest, opts ...grpc.CallOption) (*DeleteTunnelResponse, error)
+ GetCaddyByName(ctx context.Context, in *SetTunnelRequest, opts ...grpc.CallOption) (*SetTunnelResponse, error)
+}
+
+type nginxTunnelServiceClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewNginxTunnelServiceClient(cc grpc.ClientConnInterface) NginxTunnelServiceClient {
+ return &nginxTunnelServiceClient{cc}
+}
+
+func (c *nginxTunnelServiceClient) GetTunnels(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetTunnelResponse, error) {
+ out := new(GetTunnelResponse)
+ err := c.cc.Invoke(ctx, "/tunnelservice.NginxTunnelService/GetTunnels", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *nginxTunnelServiceClient) SetTunnel(ctx context.Context, in *SetTunnelRequest, opts ...grpc.CallOption) (*SetTunnelResponse, error) {
+ out := new(SetTunnelResponse)
+ err := c.cc.Invoke(ctx, "/tunnelservice.NginxTunnelService/SetTunnel", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *nginxTunnelServiceClient) DeleteTunnel(ctx context.Context, in *SetTunnelRequest, opts ...grpc.CallOption) (*DeleteTunnelResponse, error) {
+ out := new(DeleteTunnelResponse)
+ err := c.cc.Invoke(ctx, "/tunnelservice.NginxTunnelService/DeleteTunnel", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *nginxTunnelServiceClient) GetByName(ctx context.Context, in *SetTunnelRequest, opts ...grpc.CallOption) (*SetTunnelResponse, error) {
+ out := new(SetTunnelResponse)
+ err := c.cc.Invoke(ctx, "/tunnelservice.NginxTunnelService/GetByName", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *nginxTunnelServiceClient) GetCaddyTunnels(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetTunnelResponse, error) {
+ out := new(GetTunnelResponse)
+ err := c.cc.Invoke(ctx, "/tunnelservice.NginxTunnelService/GetCaddyTunnels", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *nginxTunnelServiceClient) SetCaddyTunnel(ctx context.Context, in *SetTunnelRequest, opts ...grpc.CallOption) (*SetTunnelResponse, error) {
+ out := new(SetTunnelResponse)
+ err := c.cc.Invoke(ctx, "/tunnelservice.NginxTunnelService/SetCaddyTunnel", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *nginxTunnelServiceClient) DeleteCaddyTunnel(ctx context.Context, in *SetTunnelRequest, opts ...grpc.CallOption) (*DeleteTunnelResponse, error) {
+ out := new(DeleteTunnelResponse)
+ err := c.cc.Invoke(ctx, "/tunnelservice.NginxTunnelService/DeleteCaddyTunnel", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *nginxTunnelServiceClient) GetCaddyByName(ctx context.Context, in *SetTunnelRequest, opts ...grpc.CallOption) (*SetTunnelResponse, error) {
+ out := new(SetTunnelResponse)
+ err := c.cc.Invoke(ctx, "/tunnelservice.NginxTunnelService/GetCaddyByName", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// NginxTunnelServiceServer is the server API for NginxTunnelService service.
+// All implementations must embed UnimplementedNginxTunnelServiceServer
+// for forward compatibility
+type NginxTunnelServiceServer interface {
+ GetTunnels(context.Context, *Empty) (*GetTunnelResponse, error)
+ SetTunnel(context.Context, *SetTunnelRequest) (*SetTunnelResponse, error)
+ DeleteTunnel(context.Context, *SetTunnelRequest) (*DeleteTunnelResponse, error)
+ GetByName(context.Context, *SetTunnelRequest) (*SetTunnelResponse, error)
+ //
+ GetCaddyTunnels(context.Context, *Empty) (*GetTunnelResponse, error)
+ SetCaddyTunnel(context.Context, *SetTunnelRequest) (*SetTunnelResponse, error)
+ DeleteCaddyTunnel(context.Context, *SetTunnelRequest) (*DeleteTunnelResponse, error)
+ GetCaddyByName(context.Context, *SetTunnelRequest) (*SetTunnelResponse, error)
+ mustEmbedUnimplementedNginxTunnelServiceServer()
+}
+
+// UnimplementedNginxTunnelServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedNginxTunnelServiceServer struct {
+}
+
+func (UnimplementedNginxTunnelServiceServer) GetTunnels(context.Context, *Empty) (*GetTunnelResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method GetTunnels not implemented")
+}
+func (UnimplementedNginxTunnelServiceServer) SetTunnel(context.Context, *SetTunnelRequest) (*SetTunnelResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method SetTunnel not implemented")
+}
+func (UnimplementedNginxTunnelServiceServer) DeleteTunnel(context.Context, *SetTunnelRequest) (*DeleteTunnelResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method DeleteTunnel not implemented")
+}
+func (UnimplementedNginxTunnelServiceServer) GetByName(context.Context, *SetTunnelRequest) (*SetTunnelResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method GetByName not implemented")
+}
+func (UnimplementedNginxTunnelServiceServer) GetCaddyTunnels(context.Context, *Empty) (*GetTunnelResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method GetCaddyTunnels not implemented")
+}
+func (UnimplementedNginxTunnelServiceServer) SetCaddyTunnel(context.Context, *SetTunnelRequest) (*SetTunnelResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method SetCaddyTunnel not implemented")
+}
+func (UnimplementedNginxTunnelServiceServer) DeleteCaddyTunnel(context.Context, *SetTunnelRequest) (*DeleteTunnelResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method DeleteCaddyTunnel not implemented")
+}
+func (UnimplementedNginxTunnelServiceServer) GetCaddyByName(context.Context, *SetTunnelRequest) (*SetTunnelResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method GetCaddyByName not implemented")
+}
+func (UnimplementedNginxTunnelServiceServer) mustEmbedUnimplementedNginxTunnelServiceServer() {}
+
+// UnsafeNginxTunnelServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to NginxTunnelServiceServer will
+// result in compilation errors.
+type UnsafeNginxTunnelServiceServer interface {
+ mustEmbedUnimplementedNginxTunnelServiceServer()
+}
+
+func RegisterNginxTunnelServiceServer(s grpc.ServiceRegistrar, srv NginxTunnelServiceServer) {
+ s.RegisterService(&NginxTunnelService_ServiceDesc, srv)
+}
+
+func _NginxTunnelService_GetTunnels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(Empty)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(NginxTunnelServiceServer).GetTunnels(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/tunnelservice.NginxTunnelService/GetTunnels",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(NginxTunnelServiceServer).GetTunnels(ctx, req.(*Empty))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _NginxTunnelService_SetTunnel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(SetTunnelRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(NginxTunnelServiceServer).SetTunnel(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/tunnelservice.NginxTunnelService/SetTunnel",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(NginxTunnelServiceServer).SetTunnel(ctx, req.(*SetTunnelRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _NginxTunnelService_DeleteTunnel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(SetTunnelRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(NginxTunnelServiceServer).DeleteTunnel(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/tunnelservice.NginxTunnelService/DeleteTunnel",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(NginxTunnelServiceServer).DeleteTunnel(ctx, req.(*SetTunnelRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _NginxTunnelService_GetByName_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(SetTunnelRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(NginxTunnelServiceServer).GetByName(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/tunnelservice.NginxTunnelService/GetByName",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(NginxTunnelServiceServer).GetByName(ctx, req.(*SetTunnelRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _NginxTunnelService_GetCaddyTunnels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(Empty)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(NginxTunnelServiceServer).GetCaddyTunnels(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/tunnelservice.NginxTunnelService/GetCaddyTunnels",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(NginxTunnelServiceServer).GetCaddyTunnels(ctx, req.(*Empty))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _NginxTunnelService_SetCaddyTunnel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(SetTunnelRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(NginxTunnelServiceServer).SetCaddyTunnel(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/tunnelservice.NginxTunnelService/SetCaddyTunnel",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(NginxTunnelServiceServer).SetCaddyTunnel(ctx, req.(*SetTunnelRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _NginxTunnelService_DeleteCaddyTunnel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(SetTunnelRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(NginxTunnelServiceServer).DeleteCaddyTunnel(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/tunnelservice.NginxTunnelService/DeleteCaddyTunnel",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(NginxTunnelServiceServer).DeleteCaddyTunnel(ctx, req.(*SetTunnelRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _NginxTunnelService_GetCaddyByName_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(SetTunnelRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(NginxTunnelServiceServer).GetCaddyByName(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/tunnelservice.NginxTunnelService/GetCaddyByName",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(NginxTunnelServiceServer).GetCaddyByName(ctx, req.(*SetTunnelRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+// NginxTunnelService_ServiceDesc is the grpc.ServiceDesc for NginxTunnelService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var NginxTunnelService_ServiceDesc = grpc.ServiceDesc{
+ ServiceName: "tunnelservice.NginxTunnelService",
+ HandlerType: (*NginxTunnelServiceServer)(nil),
+ Methods: []grpc.MethodDesc{
+ {
+ MethodName: "GetTunnels",
+ Handler: _NginxTunnelService_GetTunnels_Handler,
+ },
+ {
+ MethodName: "SetTunnel",
+ Handler: _NginxTunnelService_SetTunnel_Handler,
+ },
+ {
+ MethodName: "DeleteTunnel",
+ Handler: _NginxTunnelService_DeleteTunnel_Handler,
+ },
+ {
+ MethodName: "GetByName",
+ Handler: _NginxTunnelService_GetByName_Handler,
+ },
+ {
+ MethodName: "GetCaddyTunnels",
+ Handler: _NginxTunnelService_GetCaddyTunnels_Handler,
+ },
+ {
+ MethodName: "SetCaddyTunnel",
+ Handler: _NginxTunnelService_SetCaddyTunnel_Handler,
+ },
+ {
+ MethodName: "DeleteCaddyTunnel",
+ Handler: _NginxTunnelService_DeleteCaddyTunnel_Handler,
+ },
+ {
+ MethodName: "GetCaddyByName",
+ Handler: _NginxTunnelService_GetCaddyByName_Handler,
+ },
+ },
+ Streams: []grpc.StreamDesc{},
+ Metadata: "tunnel.proto",
+}
diff --git a/go.mod b/go.mod
index 6193752..e356b96 100644
--- a/go.mod
+++ b/go.mod
@@ -1,13 +1,38 @@
module github.com/TheLazarusNetwork/LazarusTunnel
-go 1.16
+go 1.18
require (
github.com/danielkov/gin-helmet v0.0.0-20171108135313-1387e224435e
github.com/gin-contrib/cors v1.3.1
github.com/gin-contrib/static v0.0.1
github.com/gin-gonic/gin v1.7.2
+ github.com/golang/protobuf v1.5.2
github.com/joho/godotenv v1.3.0
github.com/patrickmn/go-cache v2.1.0+incompatible
github.com/sirupsen/logrus v1.8.1
+ google.golang.org/grpc v1.49.0
+)
+
+require (
+ github.com/gin-contrib/sse v0.1.0 // indirect
+ github.com/go-playground/locales v0.13.0 // indirect
+ github.com/go-playground/universal-translator v0.17.0 // indirect
+ github.com/go-playground/validator/v10 v10.4.1 // indirect
+ github.com/json-iterator/go v1.1.10 // indirect
+ github.com/leodido/go-urn v1.2.0 // indirect
+ github.com/mattn/go-isatty v0.0.12 // indirect
+ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+ github.com/modern-go/reflect2 v1.0.1 // indirect
+ github.com/stretchr/testify v1.7.0 // indirect
+ github.com/ugorji/go/codec v1.1.7 // indirect
+ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 // indirect
+ golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d // indirect
+ golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 // indirect
+ golang.org/x/text v0.3.6 // indirect
+ google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506 // indirect
+ google.golang.org/protobuf v1.28.1 // indirect
+ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
+ gopkg.in/yaml.v2 v2.3.0 // indirect
+ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
)
diff --git a/go.sum b/go.sum
index 674e073..de46eca 100644
--- a/go.sum
+++ b/go.sum
@@ -1,8 +1,14 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/danielkov/gin-helmet v0.0.0-20171108135313-1387e224435e h1:5jVSh2l/ho6ajWhSPNN84eHEdq3dp0T7+f6r3Tc6hsk=
github.com/danielkov/gin-helmet v0.0.0-20171108135313-1387e224435e/go.mod h1:IJgIiGUARc4aOr4bOQ85klmjsShkEEfiRc6q/yBSfo8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/gin-contrib/cors v1.3.1 h1:doAsuITavI4IOcd0Y19U4B+O0dNWihRyX//nn4sEmgA=
github.com/gin-contrib/cors v1.3.1/go.mod h1:jjEJ4268OPZUcU7k9Pm653S7lXUGcqMADzFA61xsmDk=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
@@ -24,15 +30,33 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE=
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc=
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@@ -44,43 +68,101 @@ github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgx
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
+github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI=
+golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 h1:h+EGohizhe9XlX18rfpa8k8RAc5XyaeamM+0VHRd4lc=
+golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506 h1:uLBY0yHDCj2PMQ98KWDSIDFwn9zK2zh+tgWtbvPPBjI=
+google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.49.0 h1:WTLtQzmQori5FUH25Pq4WT22oCsv8USpQ+F6rqtsmxw=
+google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
+google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
diff --git a/main.go b/main.go
index 56f8d60..ac1ce07 100644
--- a/main.go
+++ b/main.go
@@ -1,11 +1,16 @@
package main
import (
+ "context"
"fmt"
+ "net"
"os"
"time"
"github.com/TheLazarusNetwork/LazarusTunnel/api"
+ "github.com/TheLazarusNetwork/LazarusTunnel/api/v1/caddy"
+ "github.com/TheLazarusNetwork/LazarusTunnel/api/v1/nginx"
+ pb "github.com/TheLazarusNetwork/LazarusTunnel/api/v1/nginx/pb/tunnel"
"github.com/TheLazarusNetwork/LazarusTunnel/core"
"github.com/TheLazarusNetwork/LazarusTunnel/middleware"
"github.com/TheLazarusNetwork/LazarusTunnel/util"
@@ -16,6 +21,9 @@ import (
"github.com/joho/godotenv"
"github.com/patrickmn/go-cache"
log "github.com/sirupsen/logrus"
+
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/reflection"
)
func init() {
@@ -23,7 +31,7 @@ func init() {
log.SetOutput(os.Stderr)
log.SetLevel(log.DebugLevel)
- // Get Hostname for updating Log StandardFields
+ // Get Hostname for updating Log StandardFi`elds
HostName, err := os.Hostname()
if err != nil {
log.Infof("Error in getting the Hostname: %v", err)
@@ -62,7 +70,8 @@ func main() {
// log level info
log.SetLevel(log.InfoLevel)
}
-
+ // initialize grpc
+ go initGrpc()
// creates a gin router with default middleware: logger and recovery (crash-free) middleware
ginApp := gin.Default()
@@ -83,16 +92,80 @@ func main() {
// serve static files
ginApp.Use(static.Serve("/", static.LocalFile("./ui", false)))
+ // Apply API Routes
+ api.ApplyRoutes(ginApp)
// no route redirect to frontend app
ginApp.NoRoute(func(c *gin.Context) {
c.JSON(404, gin.H{"status": 404, "message": "Invalid Endpoint Request"})
})
- // Apply API Routes
- api.ApplyRoutes(ginApp)
-
err := ginApp.Run(fmt.Sprintf("%s:%s", os.Getenv("SERVER"), os.Getenv("PORT")))
if err != nil {
log.WithFields(util.StandardFields).Fatal("Failed to Start Server")
}
}
+
+// run gRPC server==========================================================================
+
+type server struct {
+ pb.UnimplementedNginxTunnelServiceServer
+}
+
+func initGrpc() {
+ listener, err := net.Listen("tcp", ":8080")
+ if err != nil {
+ panic(err)
+ }
+
+ s := grpc.NewServer()
+ reflection.Register(s)
+ ser := &server{}
+ pb.RegisterNginxTunnelServiceServer(s, ser)
+ if err := s.Serve(listener); err != nil {
+ log.Fatalf("failed to serve: %v", err)
+ }
+}
+
+// gRPC services =============================================================================
+
+func (s *server) GetTunnels(ctx context.Context, in *pb.Empty) (*pb.GetTunnelResponse, error) {
+ tunnels, status, err := nginx.GetTunnels()
+ return &pb.GetTunnelResponse{Message: tunnels, Status: int32(status)}, err
+}
+
+func (s *server) SetTunnel(ctx context.Context, in *pb.SetTunnelRequest) (*pb.SetTunnelResponse, error) {
+ tunnel, status, err := nginx.SetTunnel(in.Name)
+ return &pb.SetTunnelResponse{Message: tunnel, Status: int32(status)}, err
+}
+
+func (s *server) DeleteTunnel(ctx context.Context, in *pb.SetTunnelRequest) (*pb.DeleteTunnelResponse, error) {
+ msg, status, err := nginx.DeleteTunnel(in.Name)
+ return &pb.DeleteTunnelResponse{Message: msg, Status: int32(status)}, err
+}
+
+func (s *server) GetByName(ctx context.Context, in *pb.SetTunnelRequest) (*pb.SetTunnelResponse, error) {
+ msg, status, err := nginx.GetTunnelByName(in.Name)
+ return &pb.SetTunnelResponse{Message: msg, Status: int32(status)}, err
+}
+
+// caddy==================================================================
+
+func (s *server) GetCaddyByName(ctx context.Context, in *pb.SetTunnelRequest) (*pb.SetTunnelResponse, error) {
+ msg, status, err := caddy.CaddyGetTunnelByName(in.Name)
+ return &pb.SetTunnelResponse{Message: msg, Status: int32(status)}, err
+}
+
+func (s *server) GetCaddyTunnels(ctx context.Context, in *pb.Empty) (*pb.GetTunnelResponse, error) {
+ tunnels, status, err := caddy.CaddyGetTunnels()
+ return &pb.GetTunnelResponse{Message: tunnels, Status: int32(status)}, err
+}
+
+func (s *server) SetCaddyTunnel(ctx context.Context, in *pb.SetTunnelRequest) (*pb.SetTunnelResponse, error) {
+ tunnel, status, err := caddy.CaddySetTunnel(in.Name)
+ return &pb.SetTunnelResponse{Message: tunnel, Status: int32(status)}, err
+}
+
+func (s *server) DeleteCaddyTunnel(ctx context.Context, in *pb.SetTunnelRequest) (*pb.DeleteTunnelResponse, error) {
+ msg, status, err := caddy.CaddyDeleteTunnel(in.Name)
+ return &pb.DeleteTunnelResponse{Message: msg, Status: int32(status)}, err
+}
diff --git a/middleware/caddy.go b/middleware/caddy.go
index 8b2ee0f..962d23f 100644
--- a/middleware/caddy.go
+++ b/middleware/caddy.go
@@ -2,6 +2,7 @@ package middleware
import (
"encoding/json"
+ "fmt"
"io/ioutil"
"os"
"path/filepath"
@@ -26,8 +27,9 @@ func IsValidWeb(name string, port int) (int, string, error) {
// check if name or port is already in use
tunnels, err := ReadWebTunnels()
+ fmt.Println("isValidweb", err)
if err != nil {
- return -1, "", err
+ return -1, "Read web tunnel is responsing err MSG from /middleware/caddy.go", err
} else {
for _, tunnel := range tunnels.Tunnels {
if tunnel.Name == name {
@@ -50,12 +52,15 @@ func IsValidWeb(name string, port int) (int, string, error) {
func ReadWebTunnels() (*model.Tunnels, error) {
file, err := os.OpenFile(filepath.Join(os.Getenv("APP_CONF_DIR"), "caddy.json"), os.O_RDWR|os.O_APPEND, 0666)
if err != nil {
+ fmt.Println("ReadWebTunnels( error 1) :", err)
util.LogError("File Open error: ", err)
return nil, err
}
b, err := ioutil.ReadAll(file)
if err != nil {
+ fmt.Println("ReadWebTunnels( error 2) :", err)
+
util.LogError("File Read error: ", err)
return nil, err
}
@@ -63,6 +68,8 @@ func ReadWebTunnels() (*model.Tunnels, error) {
var tunnels model.Tunnels
err = json.Unmarshal(b, &tunnels.Tunnels)
if err != nil {
+ fmt.Println("ReadWebTunnels( error 3) :", err)
+
util.LogError("Unmarshal json error: ", err)
return nil, err
}
@@ -111,12 +118,13 @@ func AddWebTunnel(tunnel model.Tunnel) error {
err = util.WriteFile(filepath.Join(os.Getenv("APP_CONF_DIR"), "caddy.json"), inter)
if err != nil {
- util.LogError("File write error: ", err)
+ util.LogError("1 File write error: ", err)
return err
}
err = UpdateCaddyConfig()
if err != nil {
+ fmt.Println("err 3")
return err
}
@@ -152,6 +160,7 @@ func DeleteWebTunnel(tunnelName string) error {
err = UpdateCaddyConfig()
if err != nil {
+ fmt.Println("err 2")
return err
}
diff --git a/middleware/nginx.go b/middleware/nginx.go
index e7659c7..c07894f 100644
--- a/middleware/nginx.go
+++ b/middleware/nginx.go
@@ -2,6 +2,7 @@ package middleware
import (
"encoding/json"
+ "fmt"
"io/ioutil"
"os"
"path/filepath"
@@ -171,6 +172,7 @@ func UpdateNginxConfig() error {
}
for _, tunnel := range tunnels.Tunnels {
+ fmt.Println("tunnel: ", tunnel)
_, err := template.NginxConfigTempl(tunnel)
if err != nil {
util.LogError("Nginx update error: ", err)
diff --git a/proto/tunnel.proto b/proto/tunnel.proto
new file mode 100644
index 0000000..f4ff104
--- /dev/null
+++ b/proto/tunnel.proto
@@ -0,0 +1,45 @@
+syntax = "proto3";
+package tunnelservice;
+
+option go_package = "pb/tunnel";
+
+message SetTunnelRequest {
+ string name = 1;
+}
+
+message Tunnel {
+ string name = 1;
+ string port = 2;
+ string createdAt = 3;
+ string domain = 4;
+ string status = 5;
+}
+
+message GetTunnelResponse {
+ repeated Tunnel message = 1;
+ int32 status = 2;
+}
+
+message SetTunnelResponse {
+ Tunnel message = 1;
+ int32 status = 2;
+}
+message DeleteTunnelResponse {
+ string message = 1;
+ int32 status = 2;
+}
+message Empty {}
+
+ // TunnelService proto tunnel service
+ service NginxTunnelService {
+ rpc GetTunnels(Empty) returns (GetTunnelResponse) {}
+ rpc SetTunnel(SetTunnelRequest) returns (SetTunnelResponse) {}
+ rpc DeleteTunnel(SetTunnelRequest) returns(DeleteTunnelResponse){}
+ rpc GetByName(SetTunnelRequest) returns (SetTunnelResponse) {}
+ //
+ rpc GetCaddyTunnels(Empty) returns (GetTunnelResponse) {}
+ rpc SetCaddyTunnel(SetTunnelRequest) returns (SetTunnelResponse) {}
+ rpc DeleteCaddyTunnel(SetTunnelRequest) returns(DeleteTunnelResponse){}
+ rpc GetCaddyByName(SetTunnelRequest) returns (SetTunnelResponse) {}
+ }
+
diff --git a/vendor/github.com/danielkov/gin-helmet/.gitignore b/vendor/github.com/danielkov/gin-helmet/.gitignore
new file mode 100644
index 0000000..a1338d6
--- /dev/null
+++ b/vendor/github.com/danielkov/gin-helmet/.gitignore
@@ -0,0 +1,14 @@
+# Binaries for programs and plugins
+*.exe
+*.dll
+*.so
+*.dylib
+
+# Test binary, build with `go test -c`
+*.test
+
+# Output of the go coverage tool, specifically when used with LiteIDE
+*.out
+
+# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736
+.glide/
diff --git a/vendor/github.com/danielkov/gin-helmet/.travis.yml b/vendor/github.com/danielkov/gin-helmet/.travis.yml
new file mode 100644
index 0000000..f15c502
--- /dev/null
+++ b/vendor/github.com/danielkov/gin-helmet/.travis.yml
@@ -0,0 +1,12 @@
+language: go
+sudo: false
+go:
+ - 1.6
+ - tip
+
+go_import_path: github.com/danielkov/gin-helmet
+
+before_install:
+ - go get github.com/mattn/goveralls
+script:
+ - $GOPATH/bin/goveralls -service=travis-ci
\ No newline at end of file
diff --git a/vendor/github.com/danielkov/gin-helmet/LICENSE b/vendor/github.com/danielkov/gin-helmet/LICENSE
new file mode 100644
index 0000000..823cc22
--- /dev/null
+++ b/vendor/github.com/danielkov/gin-helmet/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Daniel Kovacs
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/github.com/danielkov/gin-helmet/README.md b/vendor/github.com/danielkov/gin-helmet/README.md
new file mode 100644
index 0000000..16f4de2
--- /dev/null
+++ b/vendor/github.com/danielkov/gin-helmet/README.md
@@ -0,0 +1,28 @@
+# Gin Helmet
+
+Security middlewares for Gin (`gin-gonic/gin`) inspired by the popular `helmet` middleware package for Node JS `express` and `koa`.
+___
+[![Build Status](https://travis-ci.org/danielkov/gin-helmet.svg?branch=master)](https://travis-ci.org/danielkov/gin-helmet)
+[![Coverage Status](https://coveralls.io/repos/github/danielkov/gin-helmet/badge.svg?branch=master)](https://coveralls.io/github/danielkov/gin-helmet?branch=master)
+[![Go Report Card](https://goreportcard.com/badge/github.com/danielkov/gin-helmet)](https://goreportcard.com/report/github.com/danielkov/gin-helmet)
+[![godocs](https://img.shields.io/badge/godocs-reference-blue.svg)](https://godoc.org/github.com/danielkov/gin-helmet)
+[![MIT license](http://img.shields.io/badge/license-MIT-brightgreen.svg)](http://opensource.org/licenses/MIT)
+
+## Usage
+
+Add the `Default` middleware for basic security measures.
+
+```go
+s := gin.New()
+s.Use(helmet.Default())
+```
+
+You can also add each middleware separately:
+
+```go
+s.Use(helmet.NoCache())
+```
+
+Those not included in the `Default()` middleware are considered more advanced and require consideration before using.
+
+See the [godoc](https://godoc.org/github.com/danielkov/gin-helmet) for more info and examples.
\ No newline at end of file
diff --git a/vendor/github.com/danielkov/gin-helmet/helmet.go b/vendor/github.com/danielkov/gin-helmet/helmet.go
new file mode 100644
index 0000000..996a7a4
--- /dev/null
+++ b/vendor/github.com/danielkov/gin-helmet/helmet.go
@@ -0,0 +1,176 @@
+package helmet
+
+import (
+ "fmt"
+ "strconv"
+ "strings"
+
+ "github.com/gin-gonic/gin"
+)
+
+// NoSniff applies header to protect your server from MimeType Sniffing
+func NoSniff() gin.HandlerFunc {
+ return func(c *gin.Context) {
+ c.Writer.Header().Set("X-Content-Type-Options", "nosniff")
+ }
+}
+
+// DNSPrefetchControl sets Prefetch Control header to prevent browser from prefetching DNS
+func DNSPrefetchControl() gin.HandlerFunc {
+ return func(c *gin.Context) {
+ c.Writer.Header().Set("X-DNS-Prefetch-Control", "off")
+ }
+}
+
+// FrameGuard sets Frame Options header to deny to prevent content from the website to be served in an iframe
+func FrameGuard(opt ...string) gin.HandlerFunc {
+ var o string
+ if len(opt) > 0 {
+ o = opt[0]
+ } else {
+ o = "DENY"
+ }
+ return func(c *gin.Context) {
+ c.Writer.Header().Set("X-Frame-Options", o)
+ }
+}
+
+// SetHSTS Sets Strict Transport Security header to the default of 60 days
+// an optional integer may be added as a parameter to set the amount in seconds
+func SetHSTS(sub bool, opt ...int) gin.HandlerFunc {
+ var o int
+ if len(opt) > 0 {
+ o = opt[0]
+ } else {
+ o = 5184000
+ }
+ op := "max-age=" + strconv.Itoa(o)
+ if sub {
+ op += "; includeSubDomains"
+ }
+ return func(c *gin.Context) {
+ c.Writer.Header().Set("Strict-Transport-Security", op)
+ }
+}
+
+// IENoOpen sets Download Options header for Internet Explorer to prevent it from executing downloads in the site's context
+func IENoOpen() gin.HandlerFunc {
+ return func(c *gin.Context) {
+ c.Writer.Header().Set("X-Download-Options", "noopen")
+ }
+}
+
+// XSSFilter applies very minimal XSS protection via setting the XSS Protection header on
+func XSSFilter() gin.HandlerFunc {
+ return func(c *gin.Context) {
+ c.Writer.Header().Set("X-XSS-Protection", "1; mode=block")
+ }
+}
+
+// Default returns a number of handlers that are advised to use for basic HTTP(s) protection
+func Default() (gin.HandlerFunc, gin.HandlerFunc, gin.HandlerFunc, gin.HandlerFunc, gin.HandlerFunc, gin.HandlerFunc) {
+ return NoSniff(), DNSPrefetchControl(), FrameGuard(), SetHSTS(true), IENoOpen(), XSSFilter()
+}
+
+// Referrer sets the Referrer Policy header to prevent the browser from sending data from your website to another one upon navigation
+// an optional string can be provided to set the policy to something else other than "no-referrer".
+func Referrer(opt ...string) gin.HandlerFunc {
+ var o string
+ if len(opt) > 0 {
+ o = opt[0]
+ } else {
+ o = "no-referrer"
+ }
+ return func(c *gin.Context) {
+ c.Writer.Header().Set("Referrer-Policy", o)
+ }
+}
+
+// NoCache obliterates cache options by setting a number of headers. This prevents the browser from storing your assets in cache
+func NoCache() gin.HandlerFunc {
+ return func(c *gin.Context) {
+ c.Writer.Header().Set("Surrogate-Control", "no-store")
+ c.Writer.Header().Set("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate")
+ c.Writer.Header().Set("Pragma", "no-cache")
+ c.Writer.Header().Set("Expires", "0")
+ }
+}
+
+// ContentSecurityPolicy sets a header which will restrict your browser to only allow certain sources for assets on your website
+// The function accepts a map of its parameters which are appended to the header so you can control which headers should be set
+// The second parameter of the function is a boolean, which set to true will tell the handler to also set legacy headers, like
+// those that work in older versions of Chrome and Firefox.
+/*
+Example usage:
+ opts := map[string]string{
+ "default-src": "'self'",
+ "img-src": "*",
+ "media-src": "media1.com media2.com",
+ "script-src": "userscripts.example.com"
+ }
+ s.Use(helmet.ContentSecurityPolicy(opts, true))
+
+See [Content Security Policy on MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) for more info.
+*/
+func ContentSecurityPolicy(opt map[string]string, legacy bool) gin.HandlerFunc {
+ policy := ""
+ for k, v := range opt {
+ policy += fmt.Sprintf("%s %s; ", k, v)
+ }
+ policy = strings.TrimSuffix(policy, "; ")
+ return func(c *gin.Context) {
+ if legacy {
+ c.Writer.Header().Set("X-Webkit-CSP", policy)
+ c.Writer.Header().Set("X-Content-Security-Policy", policy)
+ }
+ c.Writer.Header().Set("Content-Security-Policy", policy)
+ }
+}
+
+// ExpectCT sets Certificate Transparency header which can enforce that you're using a Certificate which is ready for the
+// upcoming Chrome requirements policy. The function accepts a maxAge int which is the TTL for the policy in delta seconds,
+// an enforce boolean, which simply adds an enforce directive to the policy (otherwise it's report-only mode) and a
+// optional reportUri, which is the URI to which report information is sent when the policy is violated.
+func ExpectCT(maxAge int, enforce bool, reportURI ...string) gin.HandlerFunc {
+ policy := ""
+ if enforce {
+ policy += "enforce, "
+ }
+ if len(reportURI) > 0 {
+ policy += fmt.Sprintf("report-uri=%s, ", reportURI[0])
+ }
+ policy += fmt.Sprintf("max-age=%d", maxAge)
+ return func(c *gin.Context) {
+ c.Writer.Header().Set("Expect-CT", policy)
+ }
+}
+
+// SetHPKP sets HTTP Public Key Pinning for your server. It is not necessarily a great thing to set this without proper
+// knowledge of what this does. [Read here](https://developer.mozilla.org/en-US/docs/Web/HTTP/Public_Key_Pinning) otherwise you
+// may likely end up DoS-ing your own server and domain. The function accepts a map of directives and their values according
+// to specifications.
+/*
+Example usage:
+
+ keys := []string{"cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=", "M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE="}
+ r := gin.New()
+ r.Use(SetHPKP(keys, 5184000, true, "domain.com"))
+
+*/
+func SetHPKP(keys []string, maxAge int, sub bool, reportURI ...string) gin.HandlerFunc {
+ policy := ""
+ for _, v := range keys {
+ policy += fmt.Sprintf("pin-sha256=\"%s\"; ", v)
+ }
+ policy += fmt.Sprintf("max-age=%d; ", maxAge)
+ if sub {
+ policy += "includeSubDomains; "
+ }
+ if len(reportURI) > 0 {
+ policy += fmt.Sprintf("report-uri=\"%s\"", reportURI[0])
+ }
+ policy = strings.TrimSuffix(policy, "; ")
+ return func(c *gin.Context) {
+ c.Writer.Header().Set("Public-Key-Pins", policy)
+ }
+}
diff --git a/vendor/github.com/gin-contrib/cors/.gitignore b/vendor/github.com/gin-contrib/cors/.gitignore
new file mode 100644
index 0000000..b4ecae3
--- /dev/null
+++ b/vendor/github.com/gin-contrib/cors/.gitignore
@@ -0,0 +1,23 @@
+*.o
+*.a
+*.so
+
+_obj
+_test
+
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
+*.test
+*.prof
+
+coverage.out
diff --git a/vendor/github.com/gin-contrib/cors/.travis.yml b/vendor/github.com/gin-contrib/cors/.travis.yml
new file mode 100644
index 0000000..e5308a1
--- /dev/null
+++ b/vendor/github.com/gin-contrib/cors/.travis.yml
@@ -0,0 +1,31 @@
+language: go
+sudo: false
+
+go:
+ - 1.11.x
+ - 1.12.x
+ - 1.13.x
+ - 1.14.x
+ - master
+
+matrix:
+ fast_finish: true
+ include:
+ - go: 1.11.x
+ env: GO111MODULE=on
+ - go: 1.12.x
+ env: GO111MODULE=on
+
+script:
+ - go test -v -covermode=atomic -coverprofile=coverage.out
+
+after_success:
+ - bash <(curl -s https://codecov.io/bash)
+
+notifications:
+ webhooks:
+ urls:
+ - https://webhooks.gitter.im/e/acc2c57482e94b44f557
+ on_success: change
+ on_failure: always
+ on_start: false
diff --git a/vendor/github.com/gin-contrib/cors/LICENSE b/vendor/github.com/gin-contrib/cors/LICENSE
new file mode 100644
index 0000000..4e2cfb0
--- /dev/null
+++ b/vendor/github.com/gin-contrib/cors/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2016 Gin-Gonic
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/github.com/gin-contrib/cors/README.md b/vendor/github.com/gin-contrib/cors/README.md
new file mode 100644
index 0000000..bd567b1
--- /dev/null
+++ b/vendor/github.com/gin-contrib/cors/README.md
@@ -0,0 +1,91 @@
+# CORS gin's middleware
+
+[![Build Status](https://travis-ci.org/gin-contrib/cors.svg)](https://travis-ci.org/gin-contrib/cors)
+[![codecov](https://codecov.io/gh/gin-contrib/cors/branch/master/graph/badge.svg)](https://codecov.io/gh/gin-contrib/cors)
+[![Go Report Card](https://goreportcard.com/badge/github.com/gin-contrib/cors)](https://goreportcard.com/report/github.com/gin-contrib/cors)
+[![GoDoc](https://godoc.org/github.com/gin-contrib/cors?status.svg)](https://godoc.org/github.com/gin-contrib/cors)
+[![Join the chat at https://gitter.im/gin-gonic/gin](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/gin-gonic/gin)
+
+Gin middleware/handler to enable CORS support.
+
+## Usage
+
+### Start using it
+
+Download and install it:
+
+```sh
+$ go get github.com/gin-contrib/cors
+```
+
+Import it in your code:
+
+```go
+import "github.com/gin-contrib/cors"
+```
+
+### Canonical example:
+
+```go
+package main
+
+import (
+ "time"
+
+ "github.com/gin-contrib/cors"
+ "github.com/gin-gonic/gin"
+)
+
+func main() {
+ router := gin.Default()
+ // CORS for https://foo.com and https://github.com origins, allowing:
+ // - PUT and PATCH methods
+ // - Origin header
+ // - Credentials share
+ // - Preflight requests cached for 12 hours
+ router.Use(cors.New(cors.Config{
+ AllowOrigins: []string{"https://foo.com"},
+ AllowMethods: []string{"PUT", "PATCH"},
+ AllowHeaders: []string{"Origin"},
+ ExposeHeaders: []string{"Content-Length"},
+ AllowCredentials: true,
+ AllowOriginFunc: func(origin string) bool {
+ return origin == "https://github.com"
+ },
+ MaxAge: 12 * time.Hour,
+ }))
+ router.Run()
+}
+```
+
+### Using DefaultConfig as start point
+
+```go
+func main() {
+ router := gin.Default()
+ // - No origin allowed by default
+ // - GET,POST, PUT, HEAD methods
+ // - Credentials share disabled
+ // - Preflight requests cached for 12 hours
+ config := cors.DefaultConfig()
+ config.AllowOrigins = []string{"http://google.com"}
+ // config.AllowOrigins == []string{"http://google.com", "http://facebook.com"}
+
+ router.Use(cors.New(config))
+ router.Run()
+}
+```
+
+### Default() allows all origins
+
+```go
+func main() {
+ router := gin.Default()
+ // same as
+ // config := cors.DefaultConfig()
+ // config.AllowAllOrigins = true
+ // router.Use(cors.New(config))
+ router.Use(cors.Default())
+ router.Run()
+}
+```
diff --git a/vendor/github.com/gin-contrib/cors/config.go b/vendor/github.com/gin-contrib/cors/config.go
new file mode 100644
index 0000000..d4fc118
--- /dev/null
+++ b/vendor/github.com/gin-contrib/cors/config.go
@@ -0,0 +1,134 @@
+package cors
+
+import (
+ "net/http"
+ "strings"
+
+ "github.com/gin-gonic/gin"
+)
+
+type cors struct {
+ allowAllOrigins bool
+ allowCredentials bool
+ allowOriginFunc func(string) bool
+ allowOrigins []string
+ exposeHeaders []string
+ normalHeaders http.Header
+ preflightHeaders http.Header
+ wildcardOrigins [][]string
+}
+
+var (
+ DefaultSchemas = []string{
+ "http://",
+ "https://",
+ }
+ ExtensionSchemas = []string{
+ "chrome-extension://",
+ "safari-extension://",
+ "moz-extension://",
+ "ms-browser-extension://",
+ }
+ FileSchemas = []string{
+ "file://",
+ }
+ WebSocketSchemas = []string{
+ "ws://",
+ "wss://",
+ }
+)
+
+func newCors(config Config) *cors {
+ if err := config.Validate(); err != nil {
+ panic(err.Error())
+ }
+
+ return &cors{
+ allowOriginFunc: config.AllowOriginFunc,
+ allowAllOrigins: config.AllowAllOrigins,
+ allowCredentials: config.AllowCredentials,
+ allowOrigins: normalize(config.AllowOrigins),
+ normalHeaders: generateNormalHeaders(config),
+ preflightHeaders: generatePreflightHeaders(config),
+ wildcardOrigins: config.parseWildcardRules(),
+ }
+}
+
+func (cors *cors) applyCors(c *gin.Context) {
+ origin := c.Request.Header.Get("Origin")
+ if len(origin) == 0 {
+ // request is not a CORS request
+ return
+ }
+ host := c.Request.Host
+
+ if origin == "http://"+host || origin == "https://"+host {
+ // request is not a CORS request but have origin header.
+ // for example, use fetch api
+ return
+ }
+
+ if !cors.validateOrigin(origin) {
+ c.AbortWithStatus(http.StatusForbidden)
+ return
+ }
+
+ if c.Request.Method == "OPTIONS" {
+ cors.handlePreflight(c)
+ defer c.AbortWithStatus(http.StatusNoContent) // Using 204 is better than 200 when the request status is OPTIONS
+ } else {
+ cors.handleNormal(c)
+ }
+
+ if !cors.allowAllOrigins {
+ c.Header("Access-Control-Allow-Origin", origin)
+ }
+}
+
+func (cors *cors) validateWildcardOrigin(origin string) bool {
+ for _, w := range cors.wildcardOrigins {
+ if w[0] == "*" && strings.HasSuffix(origin, w[1]) {
+ return true
+ }
+ if w[1] == "*" && strings.HasPrefix(origin, w[0]) {
+ return true
+ }
+ if strings.HasPrefix(origin, w[0]) && strings.HasSuffix(origin, w[1]) {
+ return true
+ }
+ }
+
+ return false
+}
+
+func (cors *cors) validateOrigin(origin string) bool {
+ if cors.allowAllOrigins {
+ return true
+ }
+ for _, value := range cors.allowOrigins {
+ if value == origin {
+ return true
+ }
+ }
+ if len(cors.wildcardOrigins) > 0 && cors.validateWildcardOrigin(origin) {
+ return true
+ }
+ if cors.allowOriginFunc != nil {
+ return cors.allowOriginFunc(origin)
+ }
+ return false
+}
+
+func (cors *cors) handlePreflight(c *gin.Context) {
+ header := c.Writer.Header()
+ for key, value := range cors.preflightHeaders {
+ header[key] = value
+ }
+}
+
+func (cors *cors) handleNormal(c *gin.Context) {
+ header := c.Writer.Header()
+ for key, value := range cors.normalHeaders {
+ header[key] = value
+ }
+}
diff --git a/vendor/github.com/gin-contrib/cors/cors.go b/vendor/github.com/gin-contrib/cors/cors.go
new file mode 100644
index 0000000..d6d06de
--- /dev/null
+++ b/vendor/github.com/gin-contrib/cors/cors.go
@@ -0,0 +1,171 @@
+package cors
+
+import (
+ "errors"
+ "strings"
+ "time"
+
+ "github.com/gin-gonic/gin"
+)
+
+// Config represents all available options for the middleware.
+type Config struct {
+ AllowAllOrigins bool
+
+ // AllowOrigins is a list of origins a cross-domain request can be executed from.
+ // If the special "*" value is present in the list, all origins will be allowed.
+ // Default value is []
+ AllowOrigins []string
+
+ // AllowOriginFunc is a custom function to validate the origin. It take the origin
+ // as argument and returns true if allowed or false otherwise. If this option is
+ // set, the content of AllowOrigins is ignored.
+ AllowOriginFunc func(origin string) bool
+
+ // AllowMethods is a list of methods the client is allowed to use with
+ // cross-domain requests. Default value is simple methods (GET and POST)
+ AllowMethods []string
+
+ // AllowHeaders is list of non simple headers the client is allowed to use with
+ // cross-domain requests.
+ AllowHeaders []string
+
+ // AllowCredentials indicates whether the request can include user credentials like
+ // cookies, HTTP authentication or client side SSL certificates.
+ AllowCredentials bool
+
+ // ExposedHeaders indicates which headers are safe to expose to the API of a CORS
+ // API specification
+ ExposeHeaders []string
+
+ // MaxAge indicates how long (in seconds) the results of a preflight request
+ // can be cached
+ MaxAge time.Duration
+
+ // Allows to add origins like http://some-domain/*, https://api.* or http://some.*.subdomain.com
+ AllowWildcard bool
+
+ // Allows usage of popular browser extensions schemas
+ AllowBrowserExtensions bool
+
+ // Allows usage of WebSocket protocol
+ AllowWebSockets bool
+
+ // Allows usage of file:// schema (dangerous!) use it only when you 100% sure it's needed
+ AllowFiles bool
+}
+
+// AddAllowMethods is allowed to add custom methods
+func (c *Config) AddAllowMethods(methods ...string) {
+ c.AllowMethods = append(c.AllowMethods, methods...)
+}
+
+// AddAllowHeaders is allowed to add custom headers
+func (c *Config) AddAllowHeaders(headers ...string) {
+ c.AllowHeaders = append(c.AllowHeaders, headers...)
+}
+
+// AddExposeHeaders is allowed to add custom expose headers
+func (c *Config) AddExposeHeaders(headers ...string) {
+ c.ExposeHeaders = append(c.ExposeHeaders, headers...)
+}
+
+func (c Config) getAllowedSchemas() []string {
+ allowedSchemas := DefaultSchemas
+ if c.AllowBrowserExtensions {
+ allowedSchemas = append(allowedSchemas, ExtensionSchemas...)
+ }
+ if c.AllowWebSockets {
+ allowedSchemas = append(allowedSchemas, WebSocketSchemas...)
+ }
+ if c.AllowFiles {
+ allowedSchemas = append(allowedSchemas, FileSchemas...)
+ }
+ return allowedSchemas
+}
+
+func (c Config) validateAllowedSchemas(origin string) bool {
+ allowedSchemas := c.getAllowedSchemas()
+ for _, schema := range allowedSchemas {
+ if strings.HasPrefix(origin, schema) {
+ return true
+ }
+ }
+ return false
+}
+
+// Validate is check configuration of user defined.
+func (c *Config) Validate() error {
+ if c.AllowAllOrigins && (c.AllowOriginFunc != nil || len(c.AllowOrigins) > 0) {
+ return errors.New("conflict settings: all origins are allowed. AllowOriginFunc or AllowOrigins is not needed")
+ }
+ if !c.AllowAllOrigins && c.AllowOriginFunc == nil && len(c.AllowOrigins) == 0 {
+ return errors.New("conflict settings: all origins disabled")
+ }
+ for _, origin := range c.AllowOrigins {
+ if origin == "*" {
+ c.AllowAllOrigins = true
+ return nil
+ } else if !strings.Contains(origin, "*") && !c.validateAllowedSchemas(origin) {
+ return errors.New("bad origin: origins must contain '*' or include " + strings.Join(c.getAllowedSchemas(), ","))
+ }
+ }
+ return nil
+}
+
+func (c Config) parseWildcardRules() [][]string {
+ var wRules [][]string
+
+ if !c.AllowWildcard {
+ return wRules
+ }
+
+ for _, o := range c.AllowOrigins {
+ if !strings.Contains(o, "*") {
+ continue
+ }
+
+ if c := strings.Count(o, "*"); c > 1 {
+ panic(errors.New("only one * is allowed").Error())
+ }
+
+ i := strings.Index(o, "*")
+ if i == 0 {
+ wRules = append(wRules, []string{"*", o[1:]})
+ continue
+ }
+ if i == (len(o) - 1) {
+ wRules = append(wRules, []string{o[:i-1], "*"})
+ continue
+ }
+
+ wRules = append(wRules, []string{o[:i], o[i+1:]})
+ }
+
+ return wRules
+}
+
+// DefaultConfig returns a generic default configuration mapped to localhost.
+func DefaultConfig() Config {
+ return Config{
+ AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"},
+ AllowHeaders: []string{"Origin", "Content-Length", "Content-Type"},
+ AllowCredentials: false,
+ MaxAge: 12 * time.Hour,
+ }
+}
+
+// Default returns the location middleware with default configuration.
+func Default() gin.HandlerFunc {
+ config := DefaultConfig()
+ config.AllowAllOrigins = true
+ return New(config)
+}
+
+// New returns the location middleware with user-defined custom configuration.
+func New(config Config) gin.HandlerFunc {
+ cors := newCors(config)
+ return func(c *gin.Context) {
+ cors.applyCors(c)
+ }
+}
diff --git a/vendor/github.com/gin-contrib/cors/utils.go b/vendor/github.com/gin-contrib/cors/utils.go
new file mode 100644
index 0000000..460ef17
--- /dev/null
+++ b/vendor/github.com/gin-contrib/cors/utils.go
@@ -0,0 +1,85 @@
+package cors
+
+import (
+ "net/http"
+ "strconv"
+ "strings"
+ "time"
+)
+
+type converter func(string) string
+
+func generateNormalHeaders(c Config) http.Header {
+ headers := make(http.Header)
+ if c.AllowCredentials {
+ headers.Set("Access-Control-Allow-Credentials", "true")
+ }
+ if len(c.ExposeHeaders) > 0 {
+ exposeHeaders := convert(normalize(c.ExposeHeaders), http.CanonicalHeaderKey)
+ headers.Set("Access-Control-Expose-Headers", strings.Join(exposeHeaders, ","))
+ }
+ if c.AllowAllOrigins {
+ headers.Set("Access-Control-Allow-Origin", "*")
+ } else {
+ headers.Set("Vary", "Origin")
+ }
+ return headers
+}
+
+func generatePreflightHeaders(c Config) http.Header {
+ headers := make(http.Header)
+ if c.AllowCredentials {
+ headers.Set("Access-Control-Allow-Credentials", "true")
+ }
+ if len(c.AllowMethods) > 0 {
+ allowMethods := convert(normalize(c.AllowMethods), strings.ToUpper)
+ value := strings.Join(allowMethods, ",")
+ headers.Set("Access-Control-Allow-Methods", value)
+ }
+ if len(c.AllowHeaders) > 0 {
+ allowHeaders := convert(normalize(c.AllowHeaders), http.CanonicalHeaderKey)
+ value := strings.Join(allowHeaders, ",")
+ headers.Set("Access-Control-Allow-Headers", value)
+ }
+ if c.MaxAge > time.Duration(0) {
+ value := strconv.FormatInt(int64(c.MaxAge/time.Second), 10)
+ headers.Set("Access-Control-Max-Age", value)
+ }
+ if c.AllowAllOrigins {
+ headers.Set("Access-Control-Allow-Origin", "*")
+ } else {
+ // Always set Vary headers
+ // see https://github.com/rs/cors/issues/10,
+ // https://github.com/rs/cors/commit/dbdca4d95feaa7511a46e6f1efb3b3aa505bc43f#commitcomment-12352001
+
+ headers.Add("Vary", "Origin")
+ headers.Add("Vary", "Access-Control-Request-Method")
+ headers.Add("Vary", "Access-Control-Request-Headers")
+ }
+ return headers
+}
+
+func normalize(values []string) []string {
+ if values == nil {
+ return nil
+ }
+ distinctMap := make(map[string]bool, len(values))
+ normalized := make([]string, 0, len(values))
+ for _, value := range values {
+ value = strings.TrimSpace(value)
+ value = strings.ToLower(value)
+ if _, seen := distinctMap[value]; !seen {
+ normalized = append(normalized, value)
+ distinctMap[value] = true
+ }
+ }
+ return normalized
+}
+
+func convert(s []string, c converter) []string {
+ var out []string
+ for _, i := range s {
+ out = append(out, c(i))
+ }
+ return out
+}
diff --git a/vendor/github.com/gin-contrib/sse/.travis.yml b/vendor/github.com/gin-contrib/sse/.travis.yml
new file mode 100644
index 0000000..d0e8fcf
--- /dev/null
+++ b/vendor/github.com/gin-contrib/sse/.travis.yml
@@ -0,0 +1,26 @@
+language: go
+sudo: false
+go:
+ - 1.8.x
+ - 1.9.x
+ - 1.10.x
+ - 1.11.x
+ - 1.12.x
+ - master
+
+git:
+ depth: 10
+
+matrix:
+ fast_finish: true
+ include:
+ - go: 1.11.x
+ env: GO111MODULE=on
+ - go: 1.12.x
+ env: GO111MODULE=on
+
+script:
+ - go test -v -covermode=count -coverprofile=coverage.out
+
+after_success:
+ - bash <(curl -s https://codecov.io/bash)
diff --git a/vendor/github.com/gin-contrib/sse/LICENSE b/vendor/github.com/gin-contrib/sse/LICENSE
new file mode 100644
index 0000000..1ff7f37
--- /dev/null
+++ b/vendor/github.com/gin-contrib/sse/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Manuel Martínez-Almeida
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/github.com/gin-contrib/sse/README.md b/vendor/github.com/gin-contrib/sse/README.md
new file mode 100644
index 0000000..c9c49cf
--- /dev/null
+++ b/vendor/github.com/gin-contrib/sse/README.md
@@ -0,0 +1,58 @@
+# Server-Sent Events
+
+[![GoDoc](https://godoc.org/github.com/gin-contrib/sse?status.svg)](https://godoc.org/github.com/gin-contrib/sse)
+[![Build Status](https://travis-ci.org/gin-contrib/sse.svg)](https://travis-ci.org/gin-contrib/sse)
+[![codecov](https://codecov.io/gh/gin-contrib/sse/branch/master/graph/badge.svg)](https://codecov.io/gh/gin-contrib/sse)
+[![Go Report Card](https://goreportcard.com/badge/github.com/gin-contrib/sse)](https://goreportcard.com/report/github.com/gin-contrib/sse)
+
+Server-sent events (SSE) is a technology where a browser receives automatic updates from a server via HTTP connection. The Server-Sent Events EventSource API is [standardized as part of HTML5[1] by the W3C](http://www.w3.org/TR/2009/WD-eventsource-20091029/).
+
+- [Read this great SSE introduction by the HTML5Rocks guys](http://www.html5rocks.com/en/tutorials/eventsource/basics/)
+- [Browser support](http://caniuse.com/#feat=eventsource)
+
+## Sample code
+
+```go
+import "github.com/gin-contrib/sse"
+
+func httpHandler(w http.ResponseWriter, req *http.Request) {
+ // data can be a primitive like a string, an integer or a float
+ sse.Encode(w, sse.Event{
+ Event: "message",
+ Data: "some data\nmore data",
+ })
+
+ // also a complex type, like a map, a struct or a slice
+ sse.Encode(w, sse.Event{
+ Id: "124",
+ Event: "message",
+ Data: map[string]interface{}{
+ "user": "manu",
+ "date": time.Now().Unix(),
+ "content": "hi!",
+ },
+ })
+}
+```
+```
+event: message
+data: some data\\nmore data
+
+id: 124
+event: message
+data: {"content":"hi!","date":1431540810,"user":"manu"}
+
+```
+
+## Content-Type
+
+```go
+fmt.Println(sse.ContentType)
+```
+```
+text/event-stream
+```
+
+## Decoding support
+
+There is a client-side implementation of SSE coming soon.
diff --git a/vendor/github.com/gin-contrib/sse/sse-decoder.go b/vendor/github.com/gin-contrib/sse/sse-decoder.go
new file mode 100644
index 0000000..fd49b9c
--- /dev/null
+++ b/vendor/github.com/gin-contrib/sse/sse-decoder.go
@@ -0,0 +1,116 @@
+// Copyright 2014 Manu Martinez-Almeida. All rights reserved.
+// Use of this source code is governed by a MIT style
+// license that can be found in the LICENSE file.
+
+package sse
+
+import (
+ "bytes"
+ "io"
+ "io/ioutil"
+)
+
+type decoder struct {
+ events []Event
+}
+
+func Decode(r io.Reader) ([]Event, error) {
+ var dec decoder
+ return dec.decode(r)
+}
+
+func (d *decoder) dispatchEvent(event Event, data string) {
+ dataLength := len(data)
+ if dataLength > 0 {
+ //If the data buffer's last character is a U+000A LINE FEED (LF) character, then remove the last character from the data buffer.
+ data = data[:dataLength-1]
+ dataLength--
+ }
+ if dataLength == 0 && event.Event == "" {
+ return
+ }
+ if event.Event == "" {
+ event.Event = "message"
+ }
+ event.Data = data
+ d.events = append(d.events, event)
+}
+
+func (d *decoder) decode(r io.Reader) ([]Event, error) {
+ buf, err := ioutil.ReadAll(r)
+ if err != nil {
+ return nil, err
+ }
+
+ var currentEvent Event
+ var dataBuffer *bytes.Buffer = new(bytes.Buffer)
+ // TODO (and unit tests)
+ // Lines must be separated by either a U+000D CARRIAGE RETURN U+000A LINE FEED (CRLF) character pair,
+ // a single U+000A LINE FEED (LF) character,
+ // or a single U+000D CARRIAGE RETURN (CR) character.
+ lines := bytes.Split(buf, []byte{'\n'})
+ for _, line := range lines {
+ if len(line) == 0 {
+ // If the line is empty (a blank line). Dispatch the event.
+ d.dispatchEvent(currentEvent, dataBuffer.String())
+
+ // reset current event and data buffer
+ currentEvent = Event{}
+ dataBuffer.Reset()
+ continue
+ }
+ if line[0] == byte(':') {
+ // If the line starts with a U+003A COLON character (:), ignore the line.
+ continue
+ }
+
+ var field, value []byte
+ colonIndex := bytes.IndexRune(line, ':')
+ if colonIndex != -1 {
+ // If the line contains a U+003A COLON character character (:)
+ // Collect the characters on the line before the first U+003A COLON character (:),
+ // and let field be that string.
+ field = line[:colonIndex]
+ // Collect the characters on the line after the first U+003A COLON character (:),
+ // and let value be that string.
+ value = line[colonIndex+1:]
+ // If value starts with a single U+0020 SPACE character, remove it from value.
+ if len(value) > 0 && value[0] == ' ' {
+ value = value[1:]
+ }
+ } else {
+ // Otherwise, the string is not empty but does not contain a U+003A COLON character character (:)
+ // Use the whole line as the field name, and the empty string as the field value.
+ field = line
+ value = []byte{}
+ }
+ // The steps to process the field given a field name and a field value depend on the field name,
+ // as given in the following list. Field names must be compared literally,
+ // with no case folding performed.
+ switch string(field) {
+ case "event":
+ // Set the event name buffer to field value.
+ currentEvent.Event = string(value)
+ case "id":
+ // Set the event stream's last event ID to the field value.
+ currentEvent.Id = string(value)
+ case "retry":
+ // If the field value consists of only characters in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9),
+ // then interpret the field value as an integer in base ten, and set the event stream's reconnection time to that integer.
+ // Otherwise, ignore the field.
+ currentEvent.Id = string(value)
+ case "data":
+ // Append the field value to the data buffer,
+ dataBuffer.Write(value)
+ // then append a single U+000A LINE FEED (LF) character to the data buffer.
+ dataBuffer.WriteString("\n")
+ default:
+ //Otherwise. The field is ignored.
+ continue
+ }
+ }
+ // Once the end of the file is reached, the user agent must dispatch the event one final time.
+ d.dispatchEvent(currentEvent, dataBuffer.String())
+
+ return d.events, nil
+}
diff --git a/vendor/github.com/gin-contrib/sse/sse-encoder.go b/vendor/github.com/gin-contrib/sse/sse-encoder.go
new file mode 100644
index 0000000..f9c8087
--- /dev/null
+++ b/vendor/github.com/gin-contrib/sse/sse-encoder.go
@@ -0,0 +1,110 @@
+// Copyright 2014 Manu Martinez-Almeida. All rights reserved.
+// Use of this source code is governed by a MIT style
+// license that can be found in the LICENSE file.
+
+package sse
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "net/http"
+ "reflect"
+ "strconv"
+ "strings"
+)
+
+// Server-Sent Events
+// W3C Working Draft 29 October 2009
+// http://www.w3.org/TR/2009/WD-eventsource-20091029/
+
+const ContentType = "text/event-stream"
+
+var contentType = []string{ContentType}
+var noCache = []string{"no-cache"}
+
+var fieldReplacer = strings.NewReplacer(
+ "\n", "\\n",
+ "\r", "\\r")
+
+var dataReplacer = strings.NewReplacer(
+ "\n", "\ndata:",
+ "\r", "\\r")
+
+type Event struct {
+ Event string
+ Id string
+ Retry uint
+ Data interface{}
+}
+
+func Encode(writer io.Writer, event Event) error {
+ w := checkWriter(writer)
+ writeId(w, event.Id)
+ writeEvent(w, event.Event)
+ writeRetry(w, event.Retry)
+ return writeData(w, event.Data)
+}
+
+func writeId(w stringWriter, id string) {
+ if len(id) > 0 {
+ w.WriteString("id:")
+ fieldReplacer.WriteString(w, id)
+ w.WriteString("\n")
+ }
+}
+
+func writeEvent(w stringWriter, event string) {
+ if len(event) > 0 {
+ w.WriteString("event:")
+ fieldReplacer.WriteString(w, event)
+ w.WriteString("\n")
+ }
+}
+
+func writeRetry(w stringWriter, retry uint) {
+ if retry > 0 {
+ w.WriteString("retry:")
+ w.WriteString(strconv.FormatUint(uint64(retry), 10))
+ w.WriteString("\n")
+ }
+}
+
+func writeData(w stringWriter, data interface{}) error {
+ w.WriteString("data:")
+ switch kindOfData(data) {
+ case reflect.Struct, reflect.Slice, reflect.Map:
+ err := json.NewEncoder(w).Encode(data)
+ if err != nil {
+ return err
+ }
+ w.WriteString("\n")
+ default:
+ dataReplacer.WriteString(w, fmt.Sprint(data))
+ w.WriteString("\n\n")
+ }
+ return nil
+}
+
+func (r Event) Render(w http.ResponseWriter) error {
+ r.WriteContentType(w)
+ return Encode(w, r)
+}
+
+func (r Event) WriteContentType(w http.ResponseWriter) {
+ header := w.Header()
+ header["Content-Type"] = contentType
+
+ if _, exist := header["Cache-Control"]; !exist {
+ header["Cache-Control"] = noCache
+ }
+}
+
+func kindOfData(data interface{}) reflect.Kind {
+ value := reflect.ValueOf(data)
+ valueType := value.Kind()
+ if valueType == reflect.Ptr {
+ valueType = value.Elem().Kind()
+ }
+ return valueType
+}
diff --git a/vendor/github.com/gin-contrib/sse/writer.go b/vendor/github.com/gin-contrib/sse/writer.go
new file mode 100644
index 0000000..6f9806c
--- /dev/null
+++ b/vendor/github.com/gin-contrib/sse/writer.go
@@ -0,0 +1,24 @@
+package sse
+
+import "io"
+
+type stringWriter interface {
+ io.Writer
+ WriteString(string) (int, error)
+}
+
+type stringWrapper struct {
+ io.Writer
+}
+
+func (w stringWrapper) WriteString(str string) (int, error) {
+ return w.Writer.Write([]byte(str))
+}
+
+func checkWriter(writer io.Writer) stringWriter {
+ if w, ok := writer.(stringWriter); ok {
+ return w
+ } else {
+ return stringWrapper{writer}
+ }
+}
diff --git a/vendor/github.com/gin-contrib/static/.gitignore b/vendor/github.com/gin-contrib/static/.gitignore
new file mode 100644
index 0000000..ea9fb80
--- /dev/null
+++ b/vendor/github.com/gin-contrib/static/.gitignore
@@ -0,0 +1,4 @@
+coverage.out
+dump.rdb
+*/vendor/*
+!*/vendor/vendor.json
diff --git a/vendor/github.com/gin-contrib/static/.travis.yml b/vendor/github.com/gin-contrib/static/.travis.yml
new file mode 100644
index 0000000..dd4af48
--- /dev/null
+++ b/vendor/github.com/gin-contrib/static/.travis.yml
@@ -0,0 +1,33 @@
+language: go
+
+jobs:
+ fast_finish: true
+ include:
+ - go: 1.11.x
+ env: GO111MODULE=on
+ - go: 1.12.x
+ env: GO111MODULE=on
+ - go: 1.13.x
+ - go: 1.14.x
+ - go: 1.15.x
+ - go: 1.16.x
+ - go: master
+
+install:
+ - go get -t -v -d
+ - go get github.com/campoy/embedmd
+
+script:
+ - embedmd -d *.md
+ - go test -v -covermode=atomic -coverprofile=coverage.out
+
+after_success:
+ - bash <(curl -s https://codecov.io/bash)
+
+notifications:
+ webhooks:
+ urls:
+ - https://webhooks.gitter.im/e/acc2c57482e94b44f557
+ on_success: change
+ on_failure: always
+ on_start: never
diff --git a/vendor/github.com/gin-contrib/static/LICENSE b/vendor/github.com/gin-contrib/static/LICENSE
new file mode 100644
index 0000000..069726a
--- /dev/null
+++ b/vendor/github.com/gin-contrib/static/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2016 gin-contrib
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/github.com/gin-contrib/static/README.md b/vendor/github.com/gin-contrib/static/README.md
new file mode 100644
index 0000000..428d1e2
--- /dev/null
+++ b/vendor/github.com/gin-contrib/static/README.md
@@ -0,0 +1,54 @@
+# static middleware
+
+[![Build Status](https://travis-ci.org/gin-contrib/static.svg)](https://travis-ci.org/gin-contrib/static)
+[![codecov](https://codecov.io/gh/gin-contrib/static/branch/master/graph/badge.svg)](https://codecov.io/gh/gin-contrib/static)
+[![Go Report Card](https://goreportcard.com/badge/github.com/gin-contrib/static)](https://goreportcard.com/report/github.com/gin-contrib/static)
+[![GoDoc](https://godoc.org/github.com/gin-contrib/static?status.svg)](https://godoc.org/github.com/gin-contrib/static)
+
+Static middleware
+
+## Usage
+
+### Start using it
+
+Download and install it:
+
+```sh
+go get github.com/gin-contrib/static
+```
+
+Import it in your code:
+
+```go
+import "github.com/gin-contrib/static"
+```
+
+### Canonical example
+
+See the [example](example)
+
+[embedmd]:# (_example/simple/example.go go)
+```go
+package main
+
+import (
+ "github.com/gin-contrib/static"
+ "github.com/gin-gonic/gin"
+)
+
+func main() {
+ r := gin.Default()
+
+ // if Allow DirectoryIndex
+ //r.Use(static.Serve("/", static.LocalFile("/tmp", true)))
+ // set prefix
+ //r.Use(static.Serve("/static", static.LocalFile("/tmp", true)))
+
+ r.Use(static.Serve("/", static.LocalFile("/tmp", false)))
+ r.GET("/ping", func(c *gin.Context) {
+ c.String(200, "test")
+ })
+ // Listen and Server in 0.0.0.0:8080
+ r.Run(":8080")
+}
+```
diff --git a/vendor/github.com/gin-contrib/static/static.go b/vendor/github.com/gin-contrib/static/static.go
new file mode 100644
index 0000000..ffa00ee
--- /dev/null
+++ b/vendor/github.com/gin-contrib/static/static.go
@@ -0,0 +1,70 @@
+package static
+
+import (
+ "net/http"
+ "os"
+ "path"
+ "strings"
+
+ "github.com/gin-gonic/gin"
+)
+
+const INDEX = "index.html"
+
+type ServeFileSystem interface {
+ http.FileSystem
+ Exists(prefix string, path string) bool
+}
+
+type localFileSystem struct {
+ http.FileSystem
+ root string
+ indexes bool
+}
+
+func LocalFile(root string, indexes bool) *localFileSystem {
+ return &localFileSystem{
+ FileSystem: gin.Dir(root, indexes),
+ root: root,
+ indexes: indexes,
+ }
+}
+
+func (l *localFileSystem) Exists(prefix string, filepath string) bool {
+ if p := strings.TrimPrefix(filepath, prefix); len(p) < len(filepath) {
+ name := path.Join(l.root, p)
+ stats, err := os.Stat(name)
+ if err != nil {
+ return false
+ }
+ if stats.IsDir() {
+ if !l.indexes {
+ index := path.Join(name, INDEX)
+ _, err := os.Stat(index)
+ if err != nil {
+ return false
+ }
+ }
+ }
+ return true
+ }
+ return false
+}
+
+func ServeRoot(urlPrefix, root string) gin.HandlerFunc {
+ return Serve(urlPrefix, LocalFile(root, false))
+}
+
+// Static returns a middleware handler that serves static files in the given directory.
+func Serve(urlPrefix string, fs ServeFileSystem) gin.HandlerFunc {
+ fileserver := http.FileServer(fs)
+ if urlPrefix != "" {
+ fileserver = http.StripPrefix(urlPrefix, fileserver)
+ }
+ return func(c *gin.Context) {
+ if fs.Exists(urlPrefix, c.Request.URL.Path) {
+ fileserver.ServeHTTP(c.Writer, c.Request)
+ c.Abort()
+ }
+ }
+}
diff --git a/vendor/github.com/gin-gonic/gin/.gitignore b/vendor/github.com/gin-gonic/gin/.gitignore
new file mode 100644
index 0000000..bdd50c9
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/.gitignore
@@ -0,0 +1,7 @@
+vendor/*
+!vendor/vendor.json
+coverage.out
+count.out
+test
+profile.out
+tmp.out
diff --git a/vendor/github.com/gin-gonic/gin/.travis.yml b/vendor/github.com/gin-gonic/gin/.travis.yml
new file mode 100644
index 0000000..8ebae71
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/.travis.yml
@@ -0,0 +1,50 @@
+language: go
+
+matrix:
+ fast_finish: true
+ include:
+ - go: 1.12.x
+ env: GO111MODULE=on
+ - go: 1.13.x
+ - go: 1.13.x
+ env:
+ - TESTTAGS=nomsgpack
+ - go: 1.14.x
+ - go: 1.14.x
+ env:
+ - TESTTAGS=nomsgpack
+ - go: 1.15.x
+ - go: 1.15.x
+ env:
+ - TESTTAGS=nomsgpack
+ - go: master
+
+git:
+ depth: 10
+
+before_install:
+ - if [[ "${GO111MODULE}" = "on" ]]; then mkdir "${HOME}/go"; export GOPATH="${HOME}/go"; fi
+
+install:
+ - if [[ "${GO111MODULE}" = "on" ]]; then go mod download; fi
+ - if [[ "${GO111MODULE}" = "on" ]]; then export PATH="${GOPATH}/bin:${GOROOT}/bin:${PATH}"; fi
+ - if [[ "${GO111MODULE}" = "on" ]]; then make tools; fi
+
+go_import_path: github.com/gin-gonic/gin
+
+script:
+ - make vet
+ - make fmt-check
+ - make misspell-check
+ - make test
+
+after_success:
+ - bash <(curl -s https://codecov.io/bash)
+
+notifications:
+ webhooks:
+ urls:
+ - https://webhooks.gitter.im/e/7f95bf605c4d356372f4
+ on_success: change # options: [always|never|change] default: always
+ on_failure: always # options: [always|never|change] default: always
+ on_start: false # default: false
diff --git a/vendor/github.com/gin-gonic/gin/AUTHORS.md b/vendor/github.com/gin-gonic/gin/AUTHORS.md
new file mode 100644
index 0000000..c634e6b
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/AUTHORS.md
@@ -0,0 +1,233 @@
+List of all the awesome people working to make Gin the best Web Framework in Go.
+
+## gin 1.x series authors
+
+**Gin Core Team:** Bo-Yi Wu (@appleboy), 田欧 (@thinkerou), Javier Provecho (@javierprovecho)
+
+## gin 0.x series authors
+
+**Maintainers:** Manu Martinez-Almeida (@manucorporat), Javier Provecho (@javierprovecho)
+
+People and companies, who have contributed, in alphabetical order.
+
+**@858806258 (杰哥)**
+- Fix typo in example
+
+
+**@achedeuzot (Klemen Sever)**
+- Fix newline debug printing
+
+
+**@adammck (Adam Mckaig)**
+- Add MIT license
+
+
+**@AlexanderChen1989 (Alexander)**
+- Typos in README
+
+
+**@alexanderdidenko (Aleksandr Didenko)**
+- Add support multipart/form-data
+
+
+**@alexandernyquist (Alexander Nyquist)**
+- Using template.Must to fix multiple return issue
+- ★ Added support for OPTIONS verb
+- ★ Setting response headers before calling WriteHeader
+- Improved documentation for model binding
+- ★ Added Content.Redirect()
+- ★ Added tons of Unit tests
+
+
+**@austinheap (Austin Heap)**
+- Added travis CI integration
+
+
+**@andredublin (Andre Dublin)**
+- Fix typo in comment
+
+
+**@bredov (Ludwig Valda Vasquez)**
+- Fix html templating in debug mode
+
+
+**@bluele (Jun Kimura)**
+- Fixes code examples in README
+
+
+**@chad-russell**
+- ★ Support for serializing gin.H into XML
+
+
+**@dickeyxxx (Jeff Dickey)**
+- Typos in README
+- Add example about serving static files
+
+
+**@donileo (Adonis)**
+- Add NoMethod handler
+
+
+**@dutchcoders (DutchCoders)**
+- ★ Fix security bug that allows client to spoof ip
+- Fix typo. r.HTMLTemplates -> SetHTMLTemplate
+
+
+**@el3ctro- (Joshua Loper)**
+- Fix typo in example
+
+
+**@ethankan (Ethan Kan)**
+- Unsigned integers in binding
+
+
+**(Evgeny Persienko)**
+- Validate sub structures
+
+
+**@frankbille (Frank Bille)**
+- Add support for HTTP Realm Auth
+
+
+**@fmd (Fareed Dudhia)**
+- Fix typo. SetHTTPTemplate -> SetHTMLTemplate
+
+
+**@ironiridis (Christopher Harrington)**
+- Remove old reference
+
+
+**@jammie-stackhouse (Jamie Stackhouse)**
+- Add more shortcuts for router methods
+
+
+**@jasonrhansen**
+- Fix spelling and grammar errors in documentation
+
+
+**@JasonSoft (Jason Lee)**
+- Fix typo in comment
+
+
+**@joiggama (Ignacio Galindo)**
+- Add utf-8 charset header on renders
+
+
+**@julienschmidt (Julien Schmidt)**
+- gofmt the code examples
+
+
+**@kelcecil (Kel Cecil)**
+- Fix readme typo
+
+
+**@kyledinh (Kyle Dinh)**
+- Adds RunTLS()
+
+
+**@LinusU (Linus Unnebäck)**
+- Small fixes in README
+
+
+**@loongmxbt (Saint Asky)**
+- Fix typo in example
+
+
+**@lucas-clemente (Lucas Clemente)**
+- ★ work around path.Join removing trailing slashes from routes
+
+
+**@mattn (Yasuhiro Matsumoto)**
+- Improve color logger
+
+
+**@mdigger (Dmitry Sedykh)**
+- Fixes Form binding when content-type is x-www-form-urlencoded
+- No repeat call c.Writer.Status() in gin.Logger
+- Fixes Content-Type for json render
+
+
+**@mirzac (Mirza Ceric)**
+- Fix debug printing
+
+
+**@mopemope (Yutaka Matsubara)**
+- ★ Adds Godep support (Dependencies Manager)
+- Fix variadic parameter in the flexible render API
+- Fix Corrupted plain render
+- Add Pluggable View Renderer Example
+
+
+**@msemenistyi (Mykyta Semenistyi)**
+- update Readme.md. Add code to String method
+
+
+**@msoedov (Sasha Myasoedov)**
+- ★ Adds tons of unit tests.
+
+
+**@ngerakines (Nick Gerakines)**
+- ★ Improves API, c.GET() doesn't panic
+- Adds MustGet() method
+
+
+**@r8k (Rajiv Kilaparti)**
+- Fix Port usage in README.
+
+
+**@rayrod2030 (Ray Rodriguez)**
+- Fix typo in example
+
+
+**@rns**
+- Fix typo in example
+
+
+**@RobAWilkinson (Robert Wilkinson)**
+- Add example of forms and params
+
+
+**@rogierlommers (Rogier Lommers)**
+- Add updated static serve example
+
+**@rw-access (Ross Wolf)**
+- Added support to mix exact and param routes
+
+**@se77en (Damon Zhao)**
+- Improve color logging
+
+
+**@silasb (Silas Baronda)**
+- Fixing quotes in README
+
+
+**@SkuliOskarsson (Skuli Oskarsson)**
+- Fixes some texts in README II
+
+
+**@slimmy (Jimmy Pettersson)**
+- Added messages for required bindings
+
+
+**@smira (Andrey Smirnov)**
+- Add support for ignored/unexported fields in binding
+
+
+**@superalsrk (SRK.Lyu)**
+- Update httprouter godeps
+
+
+**@tebeka (Miki Tebeka)**
+- Use net/http constants instead of numeric values
+
+
+**@techjanitor**
+- Update context.go reserved IPs
+
+
+**@yosssi (Keiji Yoshida)**
+- Fix link in README
+
+
+**@yuyabee**
+- Fixed README
diff --git a/vendor/github.com/gin-gonic/gin/BENCHMARKS.md b/vendor/github.com/gin-gonic/gin/BENCHMARKS.md
new file mode 100644
index 0000000..c11ee99
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/BENCHMARKS.md
@@ -0,0 +1,666 @@
+
+# Benchmark System
+
+**VM HOST:** Travis
+**Machine:** Ubuntu 16.04.6 LTS x64
+**Date:** May 04th, 2020
+**Version:** Gin v1.6.3
+**Go Version:** 1.14.2 linux/amd64
+**Source:** [Go HTTP Router Benchmark](https://github.com/gin-gonic/go-http-routing-benchmark)
+**Result:** [See the gist](https://gist.github.com/appleboy/b5f2ecfaf50824ae9c64dcfb9165ae5e) or [Travis result](https://travis-ci.org/github/gin-gonic/go-http-routing-benchmark/jobs/682947061)
+
+## Static Routes: 157
+
+```sh
+Gin: 34936 Bytes
+
+HttpServeMux: 14512 Bytes
+Ace: 30680 Bytes
+Aero: 34536 Bytes
+Bear: 30456 Bytes
+Beego: 98456 Bytes
+Bone: 40224 Bytes
+Chi: 83608 Bytes
+Denco: 10216 Bytes
+Echo: 80328 Bytes
+GocraftWeb: 55288 Bytes
+Goji: 29744 Bytes
+Gojiv2: 105840 Bytes
+GoJsonRest: 137496 Bytes
+GoRestful: 816936 Bytes
+GorillaMux: 585632 Bytes
+GowwwRouter: 24968 Bytes
+HttpRouter: 21712 Bytes
+HttpTreeMux: 73448 Bytes
+Kocha: 115472 Bytes
+LARS: 30640 Bytes
+Macaron: 38592 Bytes
+Martini: 310864 Bytes
+Pat: 19696 Bytes
+Possum: 89920 Bytes
+R2router: 23712 Bytes
+Rivet: 24608 Bytes
+Tango: 28264 Bytes
+TigerTonic: 78768 Bytes
+Traffic: 538976 Bytes
+Vulcan: 369960 Bytes
+```
+
+## GithubAPI Routes: 203
+
+```sh
+Gin: 58512 Bytes
+
+Ace: 48688 Bytes
+Aero: 318568 Bytes
+Bear: 84248 Bytes
+Beego: 150936 Bytes
+Bone: 100976 Bytes
+Chi: 95112 Bytes
+Denco: 36736 Bytes
+Echo: 100296 Bytes
+GocraftWeb: 95432 Bytes
+Goji: 49680 Bytes
+Gojiv2: 104704 Bytes
+GoJsonRest: 141976 Bytes
+GoRestful: 1241656 Bytes
+GorillaMux: 1322784 Bytes
+GowwwRouter: 80008 Bytes
+HttpRouter: 37144 Bytes
+HttpTreeMux: 78800 Bytes
+Kocha: 785120 Bytes
+LARS: 48600 Bytes
+Macaron: 92784 Bytes
+Martini: 485264 Bytes
+Pat: 21200 Bytes
+Possum: 85312 Bytes
+R2router: 47104 Bytes
+Rivet: 42840 Bytes
+Tango: 54840 Bytes
+TigerTonic: 95264 Bytes
+Traffic: 921744 Bytes
+Vulcan: 425992 Bytes
+```
+
+## GPlusAPI Routes: 13
+
+```sh
+Gin: 4384 Bytes
+
+Ace: 3712 Bytes
+Aero: 26056 Bytes
+Bear: 7112 Bytes
+Beego: 10272 Bytes
+Bone: 6688 Bytes
+Chi: 8024 Bytes
+Denco: 3264 Bytes
+Echo: 9688 Bytes
+GocraftWeb: 7496 Bytes
+Goji: 3152 Bytes
+Gojiv2: 7376 Bytes
+GoJsonRest: 11400 Bytes
+GoRestful: 74328 Bytes
+GorillaMux: 66208 Bytes
+GowwwRouter: 5744 Bytes
+HttpRouter: 2808 Bytes
+HttpTreeMux: 7440 Bytes
+Kocha: 128880 Bytes
+LARS: 3656 Bytes
+Macaron: 8656 Bytes
+Martini: 23920 Bytes
+Pat: 1856 Bytes
+Possum: 7248 Bytes
+R2router: 3928 Bytes
+Rivet: 3064 Bytes
+Tango: 5168 Bytes
+TigerTonic: 9408 Bytes
+Traffic: 46400 Bytes
+Vulcan: 25544 Bytes
+```
+
+## ParseAPI Routes: 26
+
+```sh
+Gin: 7776 Bytes
+
+Ace: 6704 Bytes
+Aero: 28488 Bytes
+Bear: 12320 Bytes
+Beego: 19280 Bytes
+Bone: 11440 Bytes
+Chi: 9744 Bytes
+Denco: 4192 Bytes
+Echo: 11664 Bytes
+GocraftWeb: 12800 Bytes
+Goji: 5680 Bytes
+Gojiv2: 14464 Bytes
+GoJsonRest: 14072 Bytes
+GoRestful: 116264 Bytes
+GorillaMux: 105880 Bytes
+GowwwRouter: 9344 Bytes
+HttpRouter: 5072 Bytes
+HttpTreeMux: 7848 Bytes
+Kocha: 181712 Bytes
+LARS: 6632 Bytes
+Macaron: 13648 Bytes
+Martini: 45888 Bytes
+Pat: 2560 Bytes
+Possum: 9200 Bytes
+R2router: 7056 Bytes
+Rivet: 5680 Bytes
+Tango: 8920 Bytes
+TigerTonic: 9840 Bytes
+Traffic: 79096 Bytes
+Vulcan: 44504 Bytes
+```
+
+## Static Routes
+
+```sh
+BenchmarkGin_StaticAll 62169 19319 ns/op 0 B/op 0 allocs/op
+
+BenchmarkAce_StaticAll 65428 18313 ns/op 0 B/op 0 allocs/op
+BenchmarkAero_StaticAll 121132 9632 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpServeMux_StaticAll 52626 22758 ns/op 0 B/op 0 allocs/op
+BenchmarkBeego_StaticAll 9962 179058 ns/op 55264 B/op 471 allocs/op
+BenchmarkBear_StaticAll 14894 80966 ns/op 20272 B/op 469 allocs/op
+BenchmarkBone_StaticAll 18718 64065 ns/op 0 B/op 0 allocs/op
+BenchmarkChi_StaticAll 10000 149827 ns/op 67824 B/op 471 allocs/op
+BenchmarkDenco_StaticAll 211393 5680 ns/op 0 B/op 0 allocs/op
+BenchmarkEcho_StaticAll 49341 24343 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_StaticAll 10000 126209 ns/op 46312 B/op 785 allocs/op
+BenchmarkGoji_StaticAll 27956 43174 ns/op 0 B/op 0 allocs/op
+BenchmarkGojiv2_StaticAll 3430 370718 ns/op 205984 B/op 1570 allocs/op
+BenchmarkGoJsonRest_StaticAll 9134 188888 ns/op 51653 B/op 1727 allocs/op
+BenchmarkGoRestful_StaticAll 706 1703330 ns/op 613280 B/op 2053 allocs/op
+BenchmarkGorillaMux_StaticAll 1268 924083 ns/op 153233 B/op 1413 allocs/op
+BenchmarkGowwwRouter_StaticAll 63374 18935 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpRouter_StaticAll 109938 10902 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpTreeMux_StaticAll 109166 10861 ns/op 0 B/op 0 allocs/op
+BenchmarkKocha_StaticAll 92258 12992 ns/op 0 B/op 0 allocs/op
+BenchmarkLARS_StaticAll 65200 18387 ns/op 0 B/op 0 allocs/op
+BenchmarkMacaron_StaticAll 5671 291501 ns/op 115553 B/op 1256 allocs/op
+BenchmarkMartini_StaticAll 807 1460498 ns/op 125444 B/op 1717 allocs/op
+BenchmarkPat_StaticAll 513 2342396 ns/op 602832 B/op 12559 allocs/op
+BenchmarkPossum_StaticAll 10000 128270 ns/op 65312 B/op 471 allocs/op
+BenchmarkR2router_StaticAll 16726 71760 ns/op 22608 B/op 628 allocs/op
+BenchmarkRivet_StaticAll 41722 28723 ns/op 0 B/op 0 allocs/op
+BenchmarkTango_StaticAll 7606 205082 ns/op 39209 B/op 1256 allocs/op
+BenchmarkTigerTonic_StaticAll 26247 45806 ns/op 7376 B/op 157 allocs/op
+BenchmarkTraffic_StaticAll 550 2284518 ns/op 754864 B/op 14601 allocs/op
+BenchmarkVulcan_StaticAll 10000 131343 ns/op 15386 B/op 471 allocs/op
+```
+
+## Micro Benchmarks
+
+```sh
+BenchmarkGin_Param 18785022 63.9 ns/op 0 B/op 0 allocs/op
+
+BenchmarkAce_Param 14689765 81.5 ns/op 0 B/op 0 allocs/op
+BenchmarkAero_Param 23094770 51.2 ns/op 0 B/op 0 allocs/op
+BenchmarkBear_Param 1417045 845 ns/op 456 B/op 5 allocs/op
+BenchmarkBeego_Param 1000000 1080 ns/op 352 B/op 3 allocs/op
+BenchmarkBone_Param 1000000 1463 ns/op 816 B/op 6 allocs/op
+BenchmarkChi_Param 1378756 885 ns/op 432 B/op 3 allocs/op
+BenchmarkDenco_Param 8557899 143 ns/op 32 B/op 1 allocs/op
+BenchmarkEcho_Param 16433347 75.5 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_Param 1000000 1218 ns/op 648 B/op 8 allocs/op
+BenchmarkGoji_Param 1921248 617 ns/op 336 B/op 2 allocs/op
+BenchmarkGojiv2_Param 561848 2156 ns/op 1328 B/op 11 allocs/op
+BenchmarkGoJsonRest_Param 1000000 1358 ns/op 649 B/op 13 allocs/op
+BenchmarkGoRestful_Param 224857 5307 ns/op 4192 B/op 14 allocs/op
+BenchmarkGorillaMux_Param 498313 2459 ns/op 1280 B/op 10 allocs/op
+BenchmarkGowwwRouter_Param 1864354 654 ns/op 432 B/op 3 allocs/op
+BenchmarkHttpRouter_Param 26269074 47.7 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpTreeMux_Param 2109829 557 ns/op 352 B/op 3 allocs/op
+BenchmarkKocha_Param 5050216 243 ns/op 56 B/op 3 allocs/op
+BenchmarkLARS_Param 19811712 59.9 ns/op 0 B/op 0 allocs/op
+BenchmarkMacaron_Param 662746 2329 ns/op 1072 B/op 10 allocs/op
+BenchmarkMartini_Param 279902 4260 ns/op 1072 B/op 10 allocs/op
+BenchmarkPat_Param 1000000 1382 ns/op 536 B/op 11 allocs/op
+BenchmarkPossum_Param 1000000 1014 ns/op 496 B/op 5 allocs/op
+BenchmarkR2router_Param 1712559 707 ns/op 432 B/op 5 allocs/op
+BenchmarkRivet_Param 6648086 182 ns/op 48 B/op 1 allocs/op
+BenchmarkTango_Param 1221504 994 ns/op 248 B/op 8 allocs/op
+BenchmarkTigerTonic_Param 891661 2261 ns/op 776 B/op 16 allocs/op
+BenchmarkTraffic_Param 350059 3598 ns/op 1856 B/op 21 allocs/op
+BenchmarkVulcan_Param 2517823 472 ns/op 98 B/op 3 allocs/op
+BenchmarkAce_Param5 9214365 130 ns/op 0 B/op 0 allocs/op
+BenchmarkAero_Param5 15369013 77.9 ns/op 0 B/op 0 allocs/op
+BenchmarkBear_Param5 1000000 1113 ns/op 501 B/op 5 allocs/op
+BenchmarkBeego_Param5 1000000 1269 ns/op 352 B/op 3 allocs/op
+BenchmarkBone_Param5 986820 1873 ns/op 864 B/op 6 allocs/op
+BenchmarkChi_Param5 1000000 1156 ns/op 432 B/op 3 allocs/op
+BenchmarkDenco_Param5 3036331 400 ns/op 160 B/op 1 allocs/op
+BenchmarkEcho_Param5 6447133 186 ns/op 0 B/op 0 allocs/op
+BenchmarkGin_Param5 10786068 110 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_Param5 844820 1944 ns/op 920 B/op 11 allocs/op
+BenchmarkGoji_Param5 1474965 827 ns/op 336 B/op 2 allocs/op
+BenchmarkGojiv2_Param5 442820 2516 ns/op 1392 B/op 11 allocs/op
+BenchmarkGoJsonRest_Param5 507555 2711 ns/op 1097 B/op 16 allocs/op
+BenchmarkGoRestful_Param5 216481 6093 ns/op 4288 B/op 14 allocs/op
+BenchmarkGorillaMux_Param5 314402 3628 ns/op 1344 B/op 10 allocs/op
+BenchmarkGowwwRouter_Param5 1624660 733 ns/op 432 B/op 3 allocs/op
+BenchmarkHttpRouter_Param5 13167324 92.0 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpTreeMux_Param5 1000000 1295 ns/op 576 B/op 6 allocs/op
+BenchmarkKocha_Param5 1000000 1138 ns/op 440 B/op 10 allocs/op
+BenchmarkLARS_Param5 11580613 105 ns/op 0 B/op 0 allocs/op
+BenchmarkMacaron_Param5 473596 2755 ns/op 1072 B/op 10 allocs/op
+BenchmarkMartini_Param5 230756 5111 ns/op 1232 B/op 11 allocs/op
+BenchmarkPat_Param5 469190 3370 ns/op 888 B/op 29 allocs/op
+BenchmarkPossum_Param5 1000000 1002 ns/op 496 B/op 5 allocs/op
+BenchmarkR2router_Param5 1422129 844 ns/op 432 B/op 5 allocs/op
+BenchmarkRivet_Param5 2263789 539 ns/op 240 B/op 1 allocs/op
+BenchmarkTango_Param5 1000000 1256 ns/op 360 B/op 8 allocs/op
+BenchmarkTigerTonic_Param5 175500 7492 ns/op 2279 B/op 39 allocs/op
+BenchmarkTraffic_Param5 233631 5816 ns/op 2208 B/op 27 allocs/op
+BenchmarkVulcan_Param5 1923416 629 ns/op 98 B/op 3 allocs/op
+BenchmarkAce_Param20 4321266 281 ns/op 0 B/op 0 allocs/op
+BenchmarkAero_Param20 31501641 35.2 ns/op 0 B/op 0 allocs/op
+BenchmarkBear_Param20 335204 3489 ns/op 1665 B/op 5 allocs/op
+BenchmarkBeego_Param20 503674 2860 ns/op 352 B/op 3 allocs/op
+BenchmarkBone_Param20 298922 4741 ns/op 2031 B/op 6 allocs/op
+BenchmarkChi_Param20 878181 1957 ns/op 432 B/op 3 allocs/op
+BenchmarkDenco_Param20 1000000 1360 ns/op 640 B/op 1 allocs/op
+BenchmarkEcho_Param20 2104946 580 ns/op 0 B/op 0 allocs/op
+BenchmarkGin_Param20 4167204 290 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_Param20 173064 7514 ns/op 3796 B/op 15 allocs/op
+BenchmarkGoji_Param20 458778 2651 ns/op 1247 B/op 2 allocs/op
+BenchmarkGojiv2_Param20 364862 3178 ns/op 1632 B/op 11 allocs/op
+BenchmarkGoJsonRest_Param20 125514 9760 ns/op 4485 B/op 20 allocs/op
+BenchmarkGoRestful_Param20 101217 11964 ns/op 6715 B/op 18 allocs/op
+BenchmarkGorillaMux_Param20 147654 8132 ns/op 3452 B/op 12 allocs/op
+BenchmarkGowwwRouter_Param20 1000000 1225 ns/op 432 B/op 3 allocs/op
+BenchmarkHttpRouter_Param20 4920895 247 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpTreeMux_Param20 173202 6605 ns/op 3196 B/op 10 allocs/op
+BenchmarkKocha_Param20 345988 3620 ns/op 1808 B/op 27 allocs/op
+BenchmarkLARS_Param20 4592326 262 ns/op 0 B/op 0 allocs/op
+BenchmarkMacaron_Param20 166492 7286 ns/op 2924 B/op 12 allocs/op
+BenchmarkMartini_Param20 122162 10653 ns/op 3595 B/op 13 allocs/op
+BenchmarkPat_Param20 78630 15239 ns/op 4424 B/op 93 allocs/op
+BenchmarkPossum_Param20 1000000 1008 ns/op 496 B/op 5 allocs/op
+BenchmarkR2router_Param20 294981 4587 ns/op 2284 B/op 7 allocs/op
+BenchmarkRivet_Param20 691798 2090 ns/op 1024 B/op 1 allocs/op
+BenchmarkTango_Param20 842440 2505 ns/op 856 B/op 8 allocs/op
+BenchmarkTigerTonic_Param20 38614 31509 ns/op 9870 B/op 119 allocs/op
+BenchmarkTraffic_Param20 57633 21107 ns/op 7853 B/op 47 allocs/op
+BenchmarkVulcan_Param20 1000000 1178 ns/op 98 B/op 3 allocs/op
+BenchmarkAce_ParamWrite 7330743 180 ns/op 8 B/op 1 allocs/op
+BenchmarkAero_ParamWrite 13833598 86.7 ns/op 0 B/op 0 allocs/op
+BenchmarkBear_ParamWrite 1363321 867 ns/op 456 B/op 5 allocs/op
+BenchmarkBeego_ParamWrite 1000000 1104 ns/op 360 B/op 4 allocs/op
+BenchmarkBone_ParamWrite 1000000 1475 ns/op 816 B/op 6 allocs/op
+BenchmarkChi_ParamWrite 1320590 892 ns/op 432 B/op 3 allocs/op
+BenchmarkDenco_ParamWrite 7093605 172 ns/op 32 B/op 1 allocs/op
+BenchmarkEcho_ParamWrite 8434424 161 ns/op 8 B/op 1 allocs/op
+BenchmarkGin_ParamWrite 10377034 118 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_ParamWrite 1000000 1266 ns/op 656 B/op 9 allocs/op
+BenchmarkGoji_ParamWrite 1874168 654 ns/op 336 B/op 2 allocs/op
+BenchmarkGojiv2_ParamWrite 459032 2352 ns/op 1360 B/op 13 allocs/op
+BenchmarkGoJsonRest_ParamWrite 499434 2145 ns/op 1128 B/op 18 allocs/op
+BenchmarkGoRestful_ParamWrite 241087 5470 ns/op 4200 B/op 15 allocs/op
+BenchmarkGorillaMux_ParamWrite 425686 2522 ns/op 1280 B/op 10 allocs/op
+BenchmarkGowwwRouter_ParamWrite 922172 1778 ns/op 976 B/op 8 allocs/op
+BenchmarkHttpRouter_ParamWrite 15392049 77.7 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpTreeMux_ParamWrite 1973385 597 ns/op 352 B/op 3 allocs/op
+BenchmarkKocha_ParamWrite 4262500 281 ns/op 56 B/op 3 allocs/op
+BenchmarkLARS_ParamWrite 10764410 113 ns/op 0 B/op 0 allocs/op
+BenchmarkMacaron_ParamWrite 486769 2726 ns/op 1176 B/op 14 allocs/op
+BenchmarkMartini_ParamWrite 264804 4842 ns/op 1176 B/op 14 allocs/op
+BenchmarkPat_ParamWrite 735116 2047 ns/op 960 B/op 15 allocs/op
+BenchmarkPossum_ParamWrite 1000000 1004 ns/op 496 B/op 5 allocs/op
+BenchmarkR2router_ParamWrite 1592136 768 ns/op 432 B/op 5 allocs/op
+BenchmarkRivet_ParamWrite 3582051 339 ns/op 112 B/op 2 allocs/op
+BenchmarkTango_ParamWrite 2237337 534 ns/op 136 B/op 4 allocs/op
+BenchmarkTigerTonic_ParamWrite 439608 3136 ns/op 1216 B/op 21 allocs/op
+BenchmarkTraffic_ParamWrite 306979 4328 ns/op 2280 B/op 25 allocs/op
+BenchmarkVulcan_ParamWrite 2529973 472 ns/op 98 B/op 3 allocs/op
+```
+
+## GitHub
+
+```sh
+BenchmarkGin_GithubStatic 15629472 76.7 ns/op 0 B/op 0 allocs/op
+
+BenchmarkAce_GithubStatic 15542612 75.9 ns/op 0 B/op 0 allocs/op
+BenchmarkAero_GithubStatic 24777151 48.5 ns/op 0 B/op 0 allocs/op
+BenchmarkBear_GithubStatic 2788894 435 ns/op 120 B/op 3 allocs/op
+BenchmarkBeego_GithubStatic 1000000 1064 ns/op 352 B/op 3 allocs/op
+BenchmarkBone_GithubStatic 93507 12838 ns/op 2880 B/op 60 allocs/op
+BenchmarkChi_GithubStatic 1387743 860 ns/op 432 B/op 3 allocs/op
+BenchmarkDenco_GithubStatic 39384996 30.4 ns/op 0 B/op 0 allocs/op
+BenchmarkEcho_GithubStatic 12076382 99.1 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_GithubStatic 1596495 756 ns/op 296 B/op 5 allocs/op
+BenchmarkGoji_GithubStatic 6364876 189 ns/op 0 B/op 0 allocs/op
+BenchmarkGojiv2_GithubStatic 550202 2098 ns/op 1312 B/op 10 allocs/op
+BenchmarkGoRestful_GithubStatic 102183 12552 ns/op 4256 B/op 13 allocs/op
+BenchmarkGoJsonRest_GithubStatic 1000000 1029 ns/op 329 B/op 11 allocs/op
+BenchmarkGorillaMux_GithubStatic 255552 5190 ns/op 976 B/op 9 allocs/op
+BenchmarkGowwwRouter_GithubStatic 15531916 77.1 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpRouter_GithubStatic 27920724 43.1 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpTreeMux_GithubStatic 21448953 55.8 ns/op 0 B/op 0 allocs/op
+BenchmarkKocha_GithubStatic 21405310 56.0 ns/op 0 B/op 0 allocs/op
+BenchmarkLARS_GithubStatic 13625156 89.0 ns/op 0 B/op 0 allocs/op
+BenchmarkMacaron_GithubStatic 1000000 1747 ns/op 736 B/op 8 allocs/op
+BenchmarkMartini_GithubStatic 187186 7326 ns/op 768 B/op 9 allocs/op
+BenchmarkPat_GithubStatic 109143 11563 ns/op 3648 B/op 76 allocs/op
+BenchmarkPossum_GithubStatic 1575898 770 ns/op 416 B/op 3 allocs/op
+BenchmarkR2router_GithubStatic 3046231 404 ns/op 144 B/op 4 allocs/op
+BenchmarkRivet_GithubStatic 11484826 105 ns/op 0 B/op 0 allocs/op
+BenchmarkTango_GithubStatic 1000000 1153 ns/op 248 B/op 8 allocs/op
+BenchmarkTigerTonic_GithubStatic 4929780 249 ns/op 48 B/op 1 allocs/op
+BenchmarkTraffic_GithubStatic 106351 11819 ns/op 4664 B/op 90 allocs/op
+BenchmarkVulcan_GithubStatic 1613271 722 ns/op 98 B/op 3 allocs/op
+BenchmarkAce_GithubParam 8386032 143 ns/op 0 B/op 0 allocs/op
+BenchmarkAero_GithubParam 11816200 102 ns/op 0 B/op 0 allocs/op
+BenchmarkBear_GithubParam 1000000 1012 ns/op 496 B/op 5 allocs/op
+BenchmarkBeego_GithubParam 1000000 1157 ns/op 352 B/op 3 allocs/op
+BenchmarkBone_GithubParam 184653 6912 ns/op 1888 B/op 19 allocs/op
+BenchmarkChi_GithubParam 1000000 1102 ns/op 432 B/op 3 allocs/op
+BenchmarkDenco_GithubParam 3484798 352 ns/op 128 B/op 1 allocs/op
+BenchmarkEcho_GithubParam 6337380 189 ns/op 0 B/op 0 allocs/op
+BenchmarkGin_GithubParam 9132032 131 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_GithubParam 1000000 1446 ns/op 712 B/op 9 allocs/op
+BenchmarkGoji_GithubParam 1248640 977 ns/op 336 B/op 2 allocs/op
+BenchmarkGojiv2_GithubParam 383233 2784 ns/op 1408 B/op 13 allocs/op
+BenchmarkGoJsonRest_GithubParam 1000000 1991 ns/op 713 B/op 14 allocs/op
+BenchmarkGoRestful_GithubParam 76414 16015 ns/op 4352 B/op 16 allocs/op
+BenchmarkGorillaMux_GithubParam 150026 7663 ns/op 1296 B/op 10 allocs/op
+BenchmarkGowwwRouter_GithubParam 1592044 751 ns/op 432 B/op 3 allocs/op
+BenchmarkHttpRouter_GithubParam 10420628 115 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpTreeMux_GithubParam 1403755 835 ns/op 384 B/op 4 allocs/op
+BenchmarkKocha_GithubParam 2286170 533 ns/op 128 B/op 5 allocs/op
+BenchmarkLARS_GithubParam 9540374 129 ns/op 0 B/op 0 allocs/op
+BenchmarkMacaron_GithubParam 533154 2742 ns/op 1072 B/op 10 allocs/op
+BenchmarkMartini_GithubParam 119397 9638 ns/op 1152 B/op 11 allocs/op
+BenchmarkPat_GithubParam 150675 8858 ns/op 2408 B/op 48 allocs/op
+BenchmarkPossum_GithubParam 1000000 1001 ns/op 496 B/op 5 allocs/op
+BenchmarkR2router_GithubParam 1602886 761 ns/op 432 B/op 5 allocs/op
+BenchmarkRivet_GithubParam 2986579 409 ns/op 96 B/op 1 allocs/op
+BenchmarkTango_GithubParam 1000000 1356 ns/op 344 B/op 8 allocs/op
+BenchmarkTigerTonic_GithubParam 388899 3429 ns/op 1176 B/op 22 allocs/op
+BenchmarkTraffic_GithubParam 123160 9734 ns/op 2816 B/op 40 allocs/op
+BenchmarkVulcan_GithubParam 1000000 1138 ns/op 98 B/op 3 allocs/op
+BenchmarkAce_GithubAll 40543 29670 ns/op 0 B/op 0 allocs/op
+BenchmarkAero_GithubAll 57632 20648 ns/op 0 B/op 0 allocs/op
+BenchmarkBear_GithubAll 9234 216179 ns/op 86448 B/op 943 allocs/op
+BenchmarkBeego_GithubAll 7407 243496 ns/op 71456 B/op 609 allocs/op
+BenchmarkBone_GithubAll 420 2922835 ns/op 720160 B/op 8620 allocs/op
+BenchmarkChi_GithubAll 7620 238331 ns/op 87696 B/op 609 allocs/op
+BenchmarkDenco_GithubAll 18355 64494 ns/op 20224 B/op 167 allocs/op
+BenchmarkEcho_GithubAll 31251 38479 ns/op 0 B/op 0 allocs/op
+BenchmarkGin_GithubAll 43550 27364 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_GithubAll 4117 300062 ns/op 131656 B/op 1686 allocs/op
+BenchmarkGoji_GithubAll 3274 416158 ns/op 56112 B/op 334 allocs/op
+BenchmarkGojiv2_GithubAll 1402 870518 ns/op 352720 B/op 4321 allocs/op
+BenchmarkGoJsonRest_GithubAll 2976 401507 ns/op 134371 B/op 2737 allocs/op
+BenchmarkGoRestful_GithubAll 410 2913158 ns/op 910144 B/op 2938 allocs/op
+BenchmarkGorillaMux_GithubAll 346 3384987 ns/op 251650 B/op 1994 allocs/op
+BenchmarkGowwwRouter_GithubAll 10000 143025 ns/op 72144 B/op 501 allocs/op
+BenchmarkHttpRouter_GithubAll 55938 21360 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpTreeMux_GithubAll 10000 153944 ns/op 65856 B/op 671 allocs/op
+BenchmarkKocha_GithubAll 10000 106315 ns/op 23304 B/op 843 allocs/op
+BenchmarkLARS_GithubAll 47779 25084 ns/op 0 B/op 0 allocs/op
+BenchmarkMacaron_GithubAll 3266 371907 ns/op 149409 B/op 1624 allocs/op
+BenchmarkMartini_GithubAll 331 3444706 ns/op 226551 B/op 2325 allocs/op
+BenchmarkPat_GithubAll 273 4381818 ns/op 1483152 B/op 26963 allocs/op
+BenchmarkPossum_GithubAll 10000 164367 ns/op 84448 B/op 609 allocs/op
+BenchmarkR2router_GithubAll 10000 160220 ns/op 77328 B/op 979 allocs/op
+BenchmarkRivet_GithubAll 14625 82453 ns/op 16272 B/op 167 allocs/op
+BenchmarkTango_GithubAll 6255 279611 ns/op 63826 B/op 1618 allocs/op
+BenchmarkTigerTonic_GithubAll 2008 687874 ns/op 193856 B/op 4474 allocs/op
+BenchmarkTraffic_GithubAll 355 3478508 ns/op 820744 B/op 14114 allocs/op
+BenchmarkVulcan_GithubAll 6885 193333 ns/op 19894 B/op 609 allocs/op
+```
+
+## Google+
+
+```sh
+BenchmarkGin_GPlusStatic 19247326 62.2 ns/op 0 B/op 0 allocs/op
+
+BenchmarkAce_GPlusStatic 20235060 59.2 ns/op 0 B/op 0 allocs/op
+BenchmarkAero_GPlusStatic 31978935 37.6 ns/op 0 B/op 0 allocs/op
+BenchmarkBear_GPlusStatic 3516523 341 ns/op 104 B/op 3 allocs/op
+BenchmarkBeego_GPlusStatic 1212036 991 ns/op 352 B/op 3 allocs/op
+BenchmarkBone_GPlusStatic 6736242 183 ns/op 32 B/op 1 allocs/op
+BenchmarkChi_GPlusStatic 1490640 814 ns/op 432 B/op 3 allocs/op
+BenchmarkDenco_GPlusStatic 55006856 21.8 ns/op 0 B/op 0 allocs/op
+BenchmarkEcho_GPlusStatic 17688258 67.9 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_GPlusStatic 1829181 666 ns/op 280 B/op 5 allocs/op
+BenchmarkGoji_GPlusStatic 9147451 130 ns/op 0 B/op 0 allocs/op
+BenchmarkGojiv2_GPlusStatic 594015 2063 ns/op 1312 B/op 10 allocs/op
+BenchmarkGoJsonRest_GPlusStatic 1264906 950 ns/op 329 B/op 11 allocs/op
+BenchmarkGoRestful_GPlusStatic 231558 5341 ns/op 3872 B/op 13 allocs/op
+BenchmarkGorillaMux_GPlusStatic 908418 1809 ns/op 976 B/op 9 allocs/op
+BenchmarkGowwwRouter_GPlusStatic 40684604 29.5 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpRouter_GPlusStatic 46742804 25.7 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpTreeMux_GPlusStatic 32567161 36.9 ns/op 0 B/op 0 allocs/op
+BenchmarkKocha_GPlusStatic 33800060 35.3 ns/op 0 B/op 0 allocs/op
+BenchmarkLARS_GPlusStatic 20431858 60.0 ns/op 0 B/op 0 allocs/op
+BenchmarkMacaron_GPlusStatic 1000000 1745 ns/op 736 B/op 8 allocs/op
+BenchmarkMartini_GPlusStatic 442248 3619 ns/op 768 B/op 9 allocs/op
+BenchmarkPat_GPlusStatic 4328004 292 ns/op 96 B/op 2 allocs/op
+BenchmarkPossum_GPlusStatic 1570753 763 ns/op 416 B/op 3 allocs/op
+BenchmarkR2router_GPlusStatic 3339474 355 ns/op 144 B/op 4 allocs/op
+BenchmarkRivet_GPlusStatic 18570961 64.7 ns/op 0 B/op 0 allocs/op
+BenchmarkTango_GPlusStatic 1388702 860 ns/op 200 B/op 8 allocs/op
+BenchmarkTigerTonic_GPlusStatic 7803543 159 ns/op 32 B/op 1 allocs/op
+BenchmarkTraffic_GPlusStatic 878605 2171 ns/op 1112 B/op 16 allocs/op
+BenchmarkVulcan_GPlusStatic 2742446 437 ns/op 98 B/op 3 allocs/op
+BenchmarkAce_GPlusParam 11626975 105 ns/op 0 B/op 0 allocs/op
+BenchmarkAero_GPlusParam 16914322 71.6 ns/op 0 B/op 0 allocs/op
+BenchmarkBear_GPlusParam 1405173 832 ns/op 480 B/op 5 allocs/op
+BenchmarkBeego_GPlusParam 1000000 1075 ns/op 352 B/op 3 allocs/op
+BenchmarkBone_GPlusParam 1000000 1557 ns/op 816 B/op 6 allocs/op
+BenchmarkChi_GPlusParam 1347926 894 ns/op 432 B/op 3 allocs/op
+BenchmarkDenco_GPlusParam 5513000 212 ns/op 64 B/op 1 allocs/op
+BenchmarkEcho_GPlusParam 11884383 101 ns/op 0 B/op 0 allocs/op
+BenchmarkGin_GPlusParam 12898952 93.1 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_GPlusParam 1000000 1194 ns/op 648 B/op 8 allocs/op
+BenchmarkGoji_GPlusParam 1857229 645 ns/op 336 B/op 2 allocs/op
+BenchmarkGojiv2_GPlusParam 520939 2322 ns/op 1328 B/op 11 allocs/op
+BenchmarkGoJsonRest_GPlusParam 1000000 1536 ns/op 649 B/op 13 allocs/op
+BenchmarkGoRestful_GPlusParam 205449 5800 ns/op 4192 B/op 14 allocs/op
+BenchmarkGorillaMux_GPlusParam 395310 3188 ns/op 1280 B/op 10 allocs/op
+BenchmarkGowwwRouter_GPlusParam 1851798 667 ns/op 432 B/op 3 allocs/op
+BenchmarkHttpRouter_GPlusParam 18420789 65.2 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpTreeMux_GPlusParam 1878463 629 ns/op 352 B/op 3 allocs/op
+BenchmarkKocha_GPlusParam 4495610 273 ns/op 56 B/op 3 allocs/op
+BenchmarkLARS_GPlusParam 14615976 83.2 ns/op 0 B/op 0 allocs/op
+BenchmarkMacaron_GPlusParam 584145 2549 ns/op 1072 B/op 10 allocs/op
+BenchmarkMartini_GPlusParam 250501 4583 ns/op 1072 B/op 10 allocs/op
+BenchmarkPat_GPlusParam 1000000 1645 ns/op 576 B/op 11 allocs/op
+BenchmarkPossum_GPlusParam 1000000 1008 ns/op 496 B/op 5 allocs/op
+BenchmarkR2router_GPlusParam 1708191 688 ns/op 432 B/op 5 allocs/op
+BenchmarkRivet_GPlusParam 5795014 211 ns/op 48 B/op 1 allocs/op
+BenchmarkTango_GPlusParam 1000000 1091 ns/op 264 B/op 8 allocs/op
+BenchmarkTigerTonic_GPlusParam 760221 2489 ns/op 856 B/op 16 allocs/op
+BenchmarkTraffic_GPlusParam 309774 4039 ns/op 1872 B/op 21 allocs/op
+BenchmarkVulcan_GPlusParam 1935730 623 ns/op 98 B/op 3 allocs/op
+BenchmarkAce_GPlus2Params 9158314 134 ns/op 0 B/op 0 allocs/op
+BenchmarkAero_GPlus2Params 11300517 107 ns/op 0 B/op 0 allocs/op
+BenchmarkBear_GPlus2Params 1239238 961 ns/op 496 B/op 5 allocs/op
+BenchmarkBeego_GPlus2Params 1000000 1202 ns/op 352 B/op 3 allocs/op
+BenchmarkBone_GPlus2Params 335576 3725 ns/op 1168 B/op 10 allocs/op
+BenchmarkChi_GPlus2Params 1000000 1014 ns/op 432 B/op 3 allocs/op
+BenchmarkDenco_GPlus2Params 4394598 280 ns/op 64 B/op 1 allocs/op
+BenchmarkEcho_GPlus2Params 7851861 154 ns/op 0 B/op 0 allocs/op
+BenchmarkGin_GPlus2Params 9958588 120 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_GPlus2Params 1000000 1433 ns/op 712 B/op 9 allocs/op
+BenchmarkGoji_GPlus2Params 1325134 909 ns/op 336 B/op 2 allocs/op
+BenchmarkGojiv2_GPlus2Params 405955 2870 ns/op 1408 B/op 14 allocs/op
+BenchmarkGoJsonRest_GPlus2Params 977038 1987 ns/op 713 B/op 14 allocs/op
+BenchmarkGoRestful_GPlus2Params 205018 6142 ns/op 4384 B/op 16 allocs/op
+BenchmarkGorillaMux_GPlus2Params 205641 6015 ns/op 1296 B/op 10 allocs/op
+BenchmarkGowwwRouter_GPlus2Params 1748542 684 ns/op 432 B/op 3 allocs/op
+BenchmarkHttpRouter_GPlus2Params 14047102 87.7 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpTreeMux_GPlus2Params 1418673 828 ns/op 384 B/op 4 allocs/op
+BenchmarkKocha_GPlus2Params 2334562 520 ns/op 128 B/op 5 allocs/op
+BenchmarkLARS_GPlus2Params 11954094 101 ns/op 0 B/op 0 allocs/op
+BenchmarkMacaron_GPlus2Params 491552 2890 ns/op 1072 B/op 10 allocs/op
+BenchmarkMartini_GPlus2Params 120532 9545 ns/op 1200 B/op 13 allocs/op
+BenchmarkPat_GPlus2Params 194739 6766 ns/op 2168 B/op 33 allocs/op
+BenchmarkPossum_GPlus2Params 1201224 1009 ns/op 496 B/op 5 allocs/op
+BenchmarkR2router_GPlus2Params 1575535 756 ns/op 432 B/op 5 allocs/op
+BenchmarkRivet_GPlus2Params 3698930 325 ns/op 96 B/op 1 allocs/op
+BenchmarkTango_GPlus2Params 1000000 1212 ns/op 344 B/op 8 allocs/op
+BenchmarkTigerTonic_GPlus2Params 349350 3660 ns/op 1200 B/op 22 allocs/op
+BenchmarkTraffic_GPlus2Params 169714 7862 ns/op 2248 B/op 28 allocs/op
+BenchmarkVulcan_GPlus2Params 1222288 974 ns/op 98 B/op 3 allocs/op
+BenchmarkAce_GPlusAll 845606 1398 ns/op 0 B/op 0 allocs/op
+BenchmarkAero_GPlusAll 1000000 1009 ns/op 0 B/op 0 allocs/op
+BenchmarkBear_GPlusAll 103830 11386 ns/op 5488 B/op 61 allocs/op
+BenchmarkBeego_GPlusAll 82653 14784 ns/op 4576 B/op 39 allocs/op
+BenchmarkBone_GPlusAll 36601 33123 ns/op 11744 B/op 109 allocs/op
+BenchmarkChi_GPlusAll 95264 12831 ns/op 5616 B/op 39 allocs/op
+BenchmarkDenco_GPlusAll 567681 2950 ns/op 672 B/op 11 allocs/op
+BenchmarkEcho_GPlusAll 720366 1665 ns/op 0 B/op 0 allocs/op
+BenchmarkGin_GPlusAll 1000000 1185 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_GPlusAll 71575 16365 ns/op 8040 B/op 103 allocs/op
+BenchmarkGoji_GPlusAll 136352 9191 ns/op 3696 B/op 22 allocs/op
+BenchmarkGojiv2_GPlusAll 38006 31802 ns/op 17616 B/op 154 allocs/op
+BenchmarkGoJsonRest_GPlusAll 57238 21561 ns/op 8117 B/op 170 allocs/op
+BenchmarkGoRestful_GPlusAll 15147 79276 ns/op 55520 B/op 192 allocs/op
+BenchmarkGorillaMux_GPlusAll 24446 48410 ns/op 16112 B/op 128 allocs/op
+BenchmarkGowwwRouter_GPlusAll 150112 7770 ns/op 4752 B/op 33 allocs/op
+BenchmarkHttpRouter_GPlusAll 1367820 878 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpTreeMux_GPlusAll 166628 8004 ns/op 4032 B/op 38 allocs/op
+BenchmarkKocha_GPlusAll 265694 4570 ns/op 976 B/op 43 allocs/op
+BenchmarkLARS_GPlusAll 1000000 1068 ns/op 0 B/op 0 allocs/op
+BenchmarkMacaron_GPlusAll 54564 23305 ns/op 9568 B/op 104 allocs/op
+BenchmarkMartini_GPlusAll 16274 73845 ns/op 14016 B/op 145 allocs/op
+BenchmarkPat_GPlusAll 27181 44478 ns/op 15264 B/op 271 allocs/op
+BenchmarkPossum_GPlusAll 122587 10277 ns/op 5408 B/op 39 allocs/op
+BenchmarkR2router_GPlusAll 130137 9297 ns/op 5040 B/op 63 allocs/op
+BenchmarkRivet_GPlusAll 532438 3323 ns/op 768 B/op 11 allocs/op
+BenchmarkTango_GPlusAll 86054 14531 ns/op 3656 B/op 104 allocs/op
+BenchmarkTigerTonic_GPlusAll 33936 35356 ns/op 11600 B/op 242 allocs/op
+BenchmarkTraffic_GPlusAll 17833 68181 ns/op 26248 B/op 341 allocs/op
+BenchmarkVulcan_GPlusAll 120109 9861 ns/op 1274 B/op 39 allocs/op
+```
+
+## Parse.com
+
+```sh
+BenchmarkGin_ParseStatic 18877833 63.5 ns/op 0 B/op 0 allocs/op
+
+BenchmarkAce_ParseStatic 19663731 60.8 ns/op 0 B/op 0 allocs/op
+BenchmarkAero_ParseStatic 28967341 41.5 ns/op 0 B/op 0 allocs/op
+BenchmarkBear_ParseStatic 3006984 402 ns/op 120 B/op 3 allocs/op
+BenchmarkBeego_ParseStatic 1000000 1031 ns/op 352 B/op 3 allocs/op
+BenchmarkBone_ParseStatic 1782482 675 ns/op 144 B/op 3 allocs/op
+BenchmarkChi_ParseStatic 1453261 819 ns/op 432 B/op 3 allocs/op
+BenchmarkDenco_ParseStatic 45023595 26.5 ns/op 0 B/op 0 allocs/op
+BenchmarkEcho_ParseStatic 17330470 69.3 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_ParseStatic 1644006 731 ns/op 296 B/op 5 allocs/op
+BenchmarkGoji_ParseStatic 7026930 170 ns/op 0 B/op 0 allocs/op
+BenchmarkGojiv2_ParseStatic 517618 2037 ns/op 1312 B/op 10 allocs/op
+BenchmarkGoJsonRest_ParseStatic 1227080 975 ns/op 329 B/op 11 allocs/op
+BenchmarkGoRestful_ParseStatic 192458 6659 ns/op 4256 B/op 13 allocs/op
+BenchmarkGorillaMux_ParseStatic 744062 2109 ns/op 976 B/op 9 allocs/op
+BenchmarkGowwwRouter_ParseStatic 37781062 31.8 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpRouter_ParseStatic 45311223 26.5 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpTreeMux_ParseStatic 21383475 56.1 ns/op 0 B/op 0 allocs/op
+BenchmarkKocha_ParseStatic 29953290 40.1 ns/op 0 B/op 0 allocs/op
+BenchmarkLARS_ParseStatic 20036196 62.7 ns/op 0 B/op 0 allocs/op
+BenchmarkMacaron_ParseStatic 1000000 1740 ns/op 736 B/op 8 allocs/op
+BenchmarkMartini_ParseStatic 404156 3801 ns/op 768 B/op 9 allocs/op
+BenchmarkPat_ParseStatic 1547180 772 ns/op 240 B/op 5 allocs/op
+BenchmarkPossum_ParseStatic 1608991 757 ns/op 416 B/op 3 allocs/op
+BenchmarkR2router_ParseStatic 3177936 385 ns/op 144 B/op 4 allocs/op
+BenchmarkRivet_ParseStatic 17783205 67.4 ns/op 0 B/op 0 allocs/op
+BenchmarkTango_ParseStatic 1210777 990 ns/op 248 B/op 8 allocs/op
+BenchmarkTigerTonic_ParseStatic 5316440 231 ns/op 48 B/op 1 allocs/op
+BenchmarkTraffic_ParseStatic 496050 2539 ns/op 1256 B/op 19 allocs/op
+BenchmarkVulcan_ParseStatic 2462798 488 ns/op 98 B/op 3 allocs/op
+BenchmarkAce_ParseParam 13393669 89.6 ns/op 0 B/op 0 allocs/op
+BenchmarkAero_ParseParam 19836619 60.4 ns/op 0 B/op 0 allocs/op
+BenchmarkBear_ParseParam 1405954 864 ns/op 467 B/op 5 allocs/op
+BenchmarkBeego_ParseParam 1000000 1065 ns/op 352 B/op 3 allocs/op
+BenchmarkBone_ParseParam 1000000 1698 ns/op 896 B/op 7 allocs/op
+BenchmarkChi_ParseParam 1356037 873 ns/op 432 B/op 3 allocs/op
+BenchmarkDenco_ParseParam 6241392 204 ns/op 64 B/op 1 allocs/op
+BenchmarkEcho_ParseParam 14088100 85.1 ns/op 0 B/op 0 allocs/op
+BenchmarkGin_ParseParam 17426064 68.9 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_ParseParam 1000000 1254 ns/op 664 B/op 8 allocs/op
+BenchmarkGoji_ParseParam 1682574 713 ns/op 336 B/op 2 allocs/op
+BenchmarkGojiv2_ParseParam 502224 2333 ns/op 1360 B/op 12 allocs/op
+BenchmarkGoJsonRest_ParseParam 1000000 1401 ns/op 649 B/op 13 allocs/op
+BenchmarkGoRestful_ParseParam 182623 7097 ns/op 4576 B/op 14 allocs/op
+BenchmarkGorillaMux_ParseParam 482332 2477 ns/op 1280 B/op 10 allocs/op
+BenchmarkGowwwRouter_ParseParam 1834873 657 ns/op 432 B/op 3 allocs/op
+BenchmarkHttpRouter_ParseParam 23593393 51.0 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpTreeMux_ParseParam 2100160 574 ns/op 352 B/op 3 allocs/op
+BenchmarkKocha_ParseParam 4837220 252 ns/op 56 B/op 3 allocs/op
+BenchmarkLARS_ParseParam 18411192 66.2 ns/op 0 B/op 0 allocs/op
+BenchmarkMacaron_ParseParam 571870 2398 ns/op 1072 B/op 10 allocs/op
+BenchmarkMartini_ParseParam 286262 4268 ns/op 1072 B/op 10 allocs/op
+BenchmarkPat_ParseParam 692906 2157 ns/op 992 B/op 15 allocs/op
+BenchmarkPossum_ParseParam 1000000 1011 ns/op 496 B/op 5 allocs/op
+BenchmarkR2router_ParseParam 1722735 697 ns/op 432 B/op 5 allocs/op
+BenchmarkRivet_ParseParam 6058054 203 ns/op 48 B/op 1 allocs/op
+BenchmarkTango_ParseParam 1000000 1061 ns/op 280 B/op 8 allocs/op
+BenchmarkTigerTonic_ParseParam 890275 2277 ns/op 784 B/op 15 allocs/op
+BenchmarkTraffic_ParseParam 351322 3543 ns/op 1896 B/op 21 allocs/op
+BenchmarkVulcan_ParseParam 2076544 572 ns/op 98 B/op 3 allocs/op
+BenchmarkAce_Parse2Params 11718074 101 ns/op 0 B/op 0 allocs/op
+BenchmarkAero_Parse2Params 16264988 73.4 ns/op 0 B/op 0 allocs/op
+BenchmarkBear_Parse2Params 1238322 973 ns/op 496 B/op 5 allocs/op
+BenchmarkBeego_Parse2Params 1000000 1120 ns/op 352 B/op 3 allocs/op
+BenchmarkBone_Parse2Params 1000000 1632 ns/op 848 B/op 6 allocs/op
+BenchmarkChi_Parse2Params 1239477 955 ns/op 432 B/op 3 allocs/op
+BenchmarkDenco_Parse2Params 4944133 245 ns/op 64 B/op 1 allocs/op
+BenchmarkEcho_Parse2Params 10518286 114 ns/op 0 B/op 0 allocs/op
+BenchmarkGin_Parse2Params 14505195 82.7 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_Parse2Params 1000000 1437 ns/op 712 B/op 9 allocs/op
+BenchmarkGoji_Parse2Params 1689883 707 ns/op 336 B/op 2 allocs/op
+BenchmarkGojiv2_Parse2Params 502334 2308 ns/op 1344 B/op 11 allocs/op
+BenchmarkGoJsonRest_Parse2Params 1000000 1771 ns/op 713 B/op 14 allocs/op
+BenchmarkGoRestful_Parse2Params 159092 7583 ns/op 4928 B/op 14 allocs/op
+BenchmarkGorillaMux_Parse2Params 417548 2980 ns/op 1296 B/op 10 allocs/op
+BenchmarkGowwwRouter_Parse2Params 1751737 686 ns/op 432 B/op 3 allocs/op
+BenchmarkHttpRouter_Parse2Params 18089204 66.3 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpTreeMux_Parse2Params 1556986 777 ns/op 384 B/op 4 allocs/op
+BenchmarkKocha_Parse2Params 2493082 485 ns/op 128 B/op 5 allocs/op
+BenchmarkLARS_Parse2Params 15350108 78.5 ns/op 0 B/op 0 allocs/op
+BenchmarkMacaron_Parse2Params 530974 2605 ns/op 1072 B/op 10 allocs/op
+BenchmarkMartini_Parse2Params 247069 4673 ns/op 1152 B/op 11 allocs/op
+BenchmarkPat_Parse2Params 816295 2126 ns/op 752 B/op 16 allocs/op
+BenchmarkPossum_Parse2Params 1000000 1002 ns/op 496 B/op 5 allocs/op
+BenchmarkR2router_Parse2Params 1569771 733 ns/op 432 B/op 5 allocs/op
+BenchmarkRivet_Parse2Params 4080546 295 ns/op 96 B/op 1 allocs/op
+BenchmarkTango_Parse2Params 1000000 1121 ns/op 312 B/op 8 allocs/op
+BenchmarkTigerTonic_Parse2Params 399556 3470 ns/op 1168 B/op 22 allocs/op
+BenchmarkTraffic_Parse2Params 314194 4159 ns/op 1944 B/op 22 allocs/op
+BenchmarkVulcan_Parse2Params 1827559 664 ns/op 98 B/op 3 allocs/op
+BenchmarkAce_ParseAll 478395 2503 ns/op 0 B/op 0 allocs/op
+BenchmarkAero_ParseAll 715392 1658 ns/op 0 B/op 0 allocs/op
+BenchmarkBear_ParseAll 59191 20124 ns/op 8928 B/op 110 allocs/op
+BenchmarkBeego_ParseAll 45507 27266 ns/op 9152 B/op 78 allocs/op
+BenchmarkBone_ParseAll 29328 41459 ns/op 16208 B/op 147 allocs/op
+BenchmarkChi_ParseAll 48531 25053 ns/op 11232 B/op 78 allocs/op
+BenchmarkDenco_ParseAll 325532 4284 ns/op 928 B/op 16 allocs/op
+BenchmarkEcho_ParseAll 433771 2759 ns/op 0 B/op 0 allocs/op
+BenchmarkGin_ParseAll 576316 2082 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_ParseAll 41500 29692 ns/op 13728 B/op 181 allocs/op
+BenchmarkGoji_ParseAll 80833 15563 ns/op 5376 B/op 32 allocs/op
+BenchmarkGojiv2_ParseAll 19836 60335 ns/op 34448 B/op 277 allocs/op
+BenchmarkGoJsonRest_ParseAll 32210 38027 ns/op 13866 B/op 321 allocs/op
+BenchmarkGoRestful_ParseAll 6644 190842 ns/op 117600 B/op 354 allocs/op
+BenchmarkGorillaMux_ParseAll 12634 95894 ns/op 30288 B/op 250 allocs/op
+BenchmarkGowwwRouter_ParseAll 98152 12159 ns/op 6912 B/op 48 allocs/op
+BenchmarkHttpRouter_ParseAll 933208 1273 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpTreeMux_ParseAll 107191 11554 ns/op 5728 B/op 51 allocs/op
+BenchmarkKocha_ParseAll 184862 6225 ns/op 1112 B/op 54 allocs/op
+BenchmarkLARS_ParseAll 644546 1858 ns/op 0 B/op 0 allocs/op
+BenchmarkMacaron_ParseAll 26145 46484 ns/op 19136 B/op 208 allocs/op
+BenchmarkMartini_ParseAll 10000 121838 ns/op 25072 B/op 253 allocs/op
+BenchmarkPat_ParseAll 25417 47196 ns/op 15216 B/op 308 allocs/op
+BenchmarkPossum_ParseAll 58550 20735 ns/op 10816 B/op 78 allocs/op
+BenchmarkR2router_ParseAll 72732 16584 ns/op 8352 B/op 120 allocs/op
+BenchmarkRivet_ParseAll 281365 4968 ns/op 912 B/op 16 allocs/op
+BenchmarkTango_ParseAll 42831 28668 ns/op 7168 B/op 208 allocs/op
+BenchmarkTigerTonic_ParseAll 23774 49972 ns/op 16048 B/op 332 allocs/op
+BenchmarkTraffic_ParseAll 10000 104679 ns/op 45520 B/op 605 allocs/op
+BenchmarkVulcan_ParseAll 64810 18108 ns/op 2548 B/op 78 allocs/op
+```
diff --git a/vendor/github.com/gin-gonic/gin/CHANGELOG.md b/vendor/github.com/gin-gonic/gin/CHANGELOG.md
new file mode 100644
index 0000000..a28edc8
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/CHANGELOG.md
@@ -0,0 +1,418 @@
+# Gin ChangeLog
+
+## Gin v1.7.2
+
+### BUGFIXES
+
+* Fix conflict between param and exact path [#2706](https://github.com/gin-gonic/gin/issues/2706). Close issue [#2682](https://github.com/gin-gonic/gin/issues/2682) [#2696](https://github.com/gin-gonic/gin/issues/2696).
+
+## Gin v1.7.1
+
+### BUGFIXES
+
+* fix: data race with trustedCIDRs from [#2674](https://github.com/gin-gonic/gin/issues/2674)([#2675](https://github.com/gin-gonic/gin/pull/2675))
+
+## Gin v1.7.0
+
+### BUGFIXES
+
+* fix compile error from [#2572](https://github.com/gin-gonic/gin/pull/2572) ([#2600](https://github.com/gin-gonic/gin/pull/2600))
+* fix: print headers without Authorization header on broken pipe ([#2528](https://github.com/gin-gonic/gin/pull/2528))
+* fix(tree): reassign fullpath when register new node ([#2366](https://github.com/gin-gonic/gin/pull/2366))
+
+### ENHANCEMENTS
+
+* Support params and exact routes without creating conflicts ([#2663](https://github.com/gin-gonic/gin/pull/2663))
+* chore: improve render string performance ([#2365](https://github.com/gin-gonic/gin/pull/2365))
+* Sync route tree to httprouter latest code ([#2368](https://github.com/gin-gonic/gin/pull/2368))
+* chore: rename getQueryCache/getFormCache to initQueryCache/initFormCa ([#2375](https://github.com/gin-gonic/gin/pull/2375))
+* chore(performance): improve countParams ([#2378](https://github.com/gin-gonic/gin/pull/2378))
+* Remove some functions that have the same effect as the bytes package ([#2387](https://github.com/gin-gonic/gin/pull/2387))
+* update:SetMode function ([#2321](https://github.com/gin-gonic/gin/pull/2321))
+* remove a unused type SecureJSONPrefix ([#2391](https://github.com/gin-gonic/gin/pull/2391))
+* Add a redirect sample for POST method ([#2389](https://github.com/gin-gonic/gin/pull/2389))
+* Add CustomRecovery builtin middleware ([#2322](https://github.com/gin-gonic/gin/pull/2322))
+* binding: avoid 2038 problem on 32-bit architectures ([#2450](https://github.com/gin-gonic/gin/pull/2450))
+* Prevent panic in Context.GetQuery() when there is no Request ([#2412](https://github.com/gin-gonic/gin/pull/2412))
+* Add GetUint and GetUint64 method on gin.context ([#2487](https://github.com/gin-gonic/gin/pull/2487))
+* update content-disposition header to MIME-style ([#2512](https://github.com/gin-gonic/gin/pull/2512))
+* reduce allocs and improve the render `WriteString` ([#2508](https://github.com/gin-gonic/gin/pull/2508))
+* implement ".Unwrap() error" on Error type ([#2525](https://github.com/gin-gonic/gin/pull/2525)) ([#2526](https://github.com/gin-gonic/gin/pull/2526))
+* Allow bind with a map[string]string ([#2484](https://github.com/gin-gonic/gin/pull/2484))
+* chore: update tree ([#2371](https://github.com/gin-gonic/gin/pull/2371))
+* Support binding for slice/array obj [Rewrite] ([#2302](https://github.com/gin-gonic/gin/pull/2302))
+* basic auth: fix timing oracle ([#2609](https://github.com/gin-gonic/gin/pull/2609))
+* Add mixed param and non-param paths (port of httprouter[#329](https://github.com/gin-gonic/gin/pull/329)) ([#2663](https://github.com/gin-gonic/gin/pull/2663))
+* feat(engine): add trustedproxies and remoteIP ([#2632](https://github.com/gin-gonic/gin/pull/2632))
+
+## Gin v1.6.3
+
+### ENHANCEMENTS
+
+ * Improve performance: Change `*sync.RWMutex` to `sync.RWMutex` in context. [#2351](https://github.com/gin-gonic/gin/pull/2351)
+
+## Gin v1.6.2
+
+### BUGFIXES
+ * fix missing initial sync.RWMutex [#2305](https://github.com/gin-gonic/gin/pull/2305)
+### ENHANCEMENTS
+ * Add set samesite in cookie. [#2306](https://github.com/gin-gonic/gin/pull/2306)
+
+## Gin v1.6.1
+
+### BUGFIXES
+ * Revert "fix accept incoming network connections" [#2294](https://github.com/gin-gonic/gin/pull/2294)
+
+## Gin v1.6.0
+
+### BREAKING
+ * chore(performance): Improve performance for adding RemoveExtraSlash flag [#2159](https://github.com/gin-gonic/gin/pull/2159)
+ * drop support govendor [#2148](https://github.com/gin-gonic/gin/pull/2148)
+ * Added support for SameSite cookie flag [#1615](https://github.com/gin-gonic/gin/pull/1615)
+### FEATURES
+ * add yaml negotiation [#2220](https://github.com/gin-gonic/gin/pull/2220)
+ * FileFromFS [#2112](https://github.com/gin-gonic/gin/pull/2112)
+### BUGFIXES
+ * Unix Socket Handling [#2280](https://github.com/gin-gonic/gin/pull/2280)
+ * Use json marshall in context json to fix breaking new line issue. Fixes #2209 [#2228](https://github.com/gin-gonic/gin/pull/2228)
+ * fix accept incoming network connections [#2216](https://github.com/gin-gonic/gin/pull/2216)
+ * Fixed a bug in the calculation of the maximum number of parameters [#2166](https://github.com/gin-gonic/gin/pull/2166)
+ * [FIX] allow empty headers on DataFromReader [#2121](https://github.com/gin-gonic/gin/pull/2121)
+ * Add mutex for protect Context.Keys map [#1391](https://github.com/gin-gonic/gin/pull/1391)
+### ENHANCEMENTS
+ * Add mitigation for log injection [#2277](https://github.com/gin-gonic/gin/pull/2277)
+ * tree: range over nodes values [#2229](https://github.com/gin-gonic/gin/pull/2229)
+ * tree: remove duplicate assignment [#2222](https://github.com/gin-gonic/gin/pull/2222)
+ * chore: upgrade go-isatty and json-iterator/go [#2215](https://github.com/gin-gonic/gin/pull/2215)
+ * path: sync code with httprouter [#2212](https://github.com/gin-gonic/gin/pull/2212)
+ * Use zero-copy approach to convert types between string and byte slice [#2206](https://github.com/gin-gonic/gin/pull/2206)
+ * Reuse bytes when cleaning the URL paths [#2179](https://github.com/gin-gonic/gin/pull/2179)
+ * tree: remove one else statement [#2177](https://github.com/gin-gonic/gin/pull/2177)
+ * tree: sync httprouter update (#2173) (#2172) [#2171](https://github.com/gin-gonic/gin/pull/2171)
+ * tree: sync part httprouter codes and reduce if/else [#2163](https://github.com/gin-gonic/gin/pull/2163)
+ * use http method constant [#2155](https://github.com/gin-gonic/gin/pull/2155)
+ * upgrade go-validator to v10 [#2149](https://github.com/gin-gonic/gin/pull/2149)
+ * Refactor redirect request in gin.go [#1970](https://github.com/gin-gonic/gin/pull/1970)
+ * Add build tag nomsgpack [#1852](https://github.com/gin-gonic/gin/pull/1852)
+### DOCS
+ * docs(path): improve comments [#2223](https://github.com/gin-gonic/gin/pull/2223)
+ * Renew README to fit the modification of SetCookie method [#2217](https://github.com/gin-gonic/gin/pull/2217)
+ * Fix spelling [#2202](https://github.com/gin-gonic/gin/pull/2202)
+ * Remove broken link from README. [#2198](https://github.com/gin-gonic/gin/pull/2198)
+ * Update docs on Context.Done(), Context.Deadline() and Context.Err() [#2196](https://github.com/gin-gonic/gin/pull/2196)
+ * Update validator to v10 [#2190](https://github.com/gin-gonic/gin/pull/2190)
+ * upgrade go-validator to v10 for README [#2189](https://github.com/gin-gonic/gin/pull/2189)
+ * Update to currently output [#2188](https://github.com/gin-gonic/gin/pull/2188)
+ * Fix "Custom Validators" example [#2186](https://github.com/gin-gonic/gin/pull/2186)
+ * Add project to README [#2165](https://github.com/gin-gonic/gin/pull/2165)
+ * docs(benchmarks): for gin v1.5 [#2153](https://github.com/gin-gonic/gin/pull/2153)
+ * Changed wording for clarity in README.md [#2122](https://github.com/gin-gonic/gin/pull/2122)
+### MISC
+ * ci support go1.14 [#2262](https://github.com/gin-gonic/gin/pull/2262)
+ * chore: upgrade depend version [#2231](https://github.com/gin-gonic/gin/pull/2231)
+ * Drop support go1.10 [#2147](https://github.com/gin-gonic/gin/pull/2147)
+ * fix comment in `mode.go` [#2129](https://github.com/gin-gonic/gin/pull/2129)
+
+## Gin v1.5.0
+
+- [FIX] Use DefaultWriter and DefaultErrorWriter for debug messages [#1891](https://github.com/gin-gonic/gin/pull/1891)
+- [NEW] Now you can parse the inline lowercase start structure [#1893](https://github.com/gin-gonic/gin/pull/1893)
+- [FIX] Some code improvements [#1909](https://github.com/gin-gonic/gin/pull/1909)
+- [FIX] Use encode replace json marshal increase json encoder speed [#1546](https://github.com/gin-gonic/gin/pull/1546)
+- [NEW] Hold matched route full path in the Context [#1826](https://github.com/gin-gonic/gin/pull/1826)
+- [FIX] Fix context.Params race condition on Copy() [#1841](https://github.com/gin-gonic/gin/pull/1841)
+- [NEW] Add context param query cache [#1450](https://github.com/gin-gonic/gin/pull/1450)
+- [FIX] Improve GetQueryMap performance [#1918](https://github.com/gin-gonic/gin/pull/1918)
+- [FIX] Improve get post data [#1920](https://github.com/gin-gonic/gin/pull/1920)
+- [FIX] Use context instead of x/net/context [#1922](https://github.com/gin-gonic/gin/pull/1922)
+- [FIX] Attempt to fix PostForm cache bug [#1931](https://github.com/gin-gonic/gin/pull/1931)
+- [NEW] Add support of multipart multi files [#1949](https://github.com/gin-gonic/gin/pull/1949)
+- [NEW] Support bind http header param [#1957](https://github.com/gin-gonic/gin/pull/1957)
+- [FIX] Drop support for go1.8 and go1.9 [#1933](https://github.com/gin-gonic/gin/pull/1933)
+- [FIX] Bugfix for the FullPath feature [#1919](https://github.com/gin-gonic/gin/pull/1919)
+- [FIX] Gin1.5 bytes.Buffer to strings.Builder [#1939](https://github.com/gin-gonic/gin/pull/1939)
+- [FIX] Upgrade github.com/ugorji/go/codec [#1969](https://github.com/gin-gonic/gin/pull/1969)
+- [NEW] Support bind unix time [#1980](https://github.com/gin-gonic/gin/pull/1980)
+- [FIX] Simplify code [#2004](https://github.com/gin-gonic/gin/pull/2004)
+- [NEW] Support negative Content-Length in DataFromReader [#1981](https://github.com/gin-gonic/gin/pull/1981)
+- [FIX] Identify terminal on a RISC-V architecture for auto-colored logs [#2019](https://github.com/gin-gonic/gin/pull/2019)
+- [BREAKING] `Context.JSONP()` now expects a semicolon (`;`) at the end [#2007](https://github.com/gin-gonic/gin/pull/2007)
+- [BREAKING] Upgrade default `binding.Validator` to v9 (see [its changelog](https://github.com/go-playground/validator/releases/tag/v9.0.0)) [#1015](https://github.com/gin-gonic/gin/pull/1015)
+- [NEW] Add `DisallowUnknownFields()` in `Context.BindJSON()` [#2028](https://github.com/gin-gonic/gin/pull/2028)
+- [NEW] Use specific `net.Listener` with `Engine.RunListener()` [#2023](https://github.com/gin-gonic/gin/pull/2023)
+- [FIX] Fix some typo [#2079](https://github.com/gin-gonic/gin/pull/2079) [#2080](https://github.com/gin-gonic/gin/pull/2080)
+- [FIX] Relocate binding body tests [#2086](https://github.com/gin-gonic/gin/pull/2086)
+- [FIX] Use Writer in Context.Status [#1606](https://github.com/gin-gonic/gin/pull/1606)
+- [FIX] `Engine.RunUnix()` now returns the error if it can't change the file mode [#2093](https://github.com/gin-gonic/gin/pull/2093)
+- [FIX] `RouterGroup.StaticFS()` leaked files. Now it closes them. [#2118](https://github.com/gin-gonic/gin/pull/2118)
+- [FIX] `Context.Request.FormFile` leaked file. Now it closes it. [#2114](https://github.com/gin-gonic/gin/pull/2114)
+- [FIX] Ignore walking on `form:"-"` mapping [#1943](https://github.com/gin-gonic/gin/pull/1943)
+
+### Gin v1.4.0
+
+- [NEW] Support for [Go Modules](https://github.com/golang/go/wiki/Modules) [#1569](https://github.com/gin-gonic/gin/pull/1569)
+- [NEW] Refactor of form mapping multipart request [#1829](https://github.com/gin-gonic/gin/pull/1829)
+- [FIX] Truncate Latency precision in long running request [#1830](https://github.com/gin-gonic/gin/pull/1830)
+- [FIX] IsTerm flag should not be affected by DisableConsoleColor method. [#1802](https://github.com/gin-gonic/gin/pull/1802)
+- [NEW] Supporting file binding [#1264](https://github.com/gin-gonic/gin/pull/1264)
+- [NEW] Add support for mapping arrays [#1797](https://github.com/gin-gonic/gin/pull/1797)
+- [FIX] Readme updates [#1793](https://github.com/gin-gonic/gin/pull/1793) [#1788](https://github.com/gin-gonic/gin/pull/1788) [1789](https://github.com/gin-gonic/gin/pull/1789)
+- [FIX] StaticFS: Fixed Logging two log lines on 404. [#1805](https://github.com/gin-gonic/gin/pull/1805), [#1804](https://github.com/gin-gonic/gin/pull/1804)
+- [NEW] Make context.Keys available as LogFormatterParams [#1779](https://github.com/gin-gonic/gin/pull/1779)
+- [NEW] Use internal/json for Marshal/Unmarshal [#1791](https://github.com/gin-gonic/gin/pull/1791)
+- [NEW] Support mapping time.Duration [#1794](https://github.com/gin-gonic/gin/pull/1794)
+- [NEW] Refactor form mappings [#1749](https://github.com/gin-gonic/gin/pull/1749)
+- [NEW] Added flag to context.Stream indicates if client disconnected in middle of stream [#1252](https://github.com/gin-gonic/gin/pull/1252)
+- [FIX] Moved [examples](https://github.com/gin-gonic/examples) to stand alone Repo [#1775](https://github.com/gin-gonic/gin/pull/1775)
+- [NEW] Extend context.File to allow for the content-disposition attachments via a new method context.Attachment [#1260](https://github.com/gin-gonic/gin/pull/1260)
+- [FIX] Support HTTP content negotiation wildcards [#1112](https://github.com/gin-gonic/gin/pull/1112)
+- [NEW] Add prefix from X-Forwarded-Prefix in redirectTrailingSlash [#1238](https://github.com/gin-gonic/gin/pull/1238)
+- [FIX] context.Copy() race condition [#1020](https://github.com/gin-gonic/gin/pull/1020)
+- [NEW] Add context.HandlerNames() [#1729](https://github.com/gin-gonic/gin/pull/1729)
+- [FIX] Change color methods to public in the defaultLogger. [#1771](https://github.com/gin-gonic/gin/pull/1771)
+- [FIX] Update writeHeaders method to use http.Header.Set [#1722](https://github.com/gin-gonic/gin/pull/1722)
+- [NEW] Add response size to LogFormatterParams [#1752](https://github.com/gin-gonic/gin/pull/1752)
+- [NEW] Allow ignoring field on form mapping [#1733](https://github.com/gin-gonic/gin/pull/1733)
+- [NEW] Add a function to force color in console output. [#1724](https://github.com/gin-gonic/gin/pull/1724)
+- [FIX] Context.Next() - recheck len of handlers on every iteration. [#1745](https://github.com/gin-gonic/gin/pull/1745)
+- [FIX] Fix all errcheck warnings [#1739](https://github.com/gin-gonic/gin/pull/1739) [#1653](https://github.com/gin-gonic/gin/pull/1653)
+- [NEW] context: inherits context cancellation and deadline from http.Request context for Go>=1.7 [#1690](https://github.com/gin-gonic/gin/pull/1690)
+- [NEW] Binding for URL Params [#1694](https://github.com/gin-gonic/gin/pull/1694)
+- [NEW] Add LoggerWithFormatter method [#1677](https://github.com/gin-gonic/gin/pull/1677)
+- [FIX] CI testing updates [#1671](https://github.com/gin-gonic/gin/pull/1671) [#1670](https://github.com/gin-gonic/gin/pull/1670) [#1682](https://github.com/gin-gonic/gin/pull/1682) [#1669](https://github.com/gin-gonic/gin/pull/1669)
+- [FIX] StaticFS(): Send 404 when path does not exist [#1663](https://github.com/gin-gonic/gin/pull/1663)
+- [FIX] Handle nil body for JSON binding [#1638](https://github.com/gin-gonic/gin/pull/1638)
+- [FIX] Support bind uri param [#1612](https://github.com/gin-gonic/gin/pull/1612)
+- [FIX] recovery: fix issue with syscall import on google app engine [#1640](https://github.com/gin-gonic/gin/pull/1640)
+- [FIX] Make sure the debug log contains line breaks [#1650](https://github.com/gin-gonic/gin/pull/1650)
+- [FIX] Panic stack trace being printed during recovery of broken pipe [#1089](https://github.com/gin-gonic/gin/pull/1089) [#1259](https://github.com/gin-gonic/gin/pull/1259)
+- [NEW] RunFd method to run http.Server through a file descriptor [#1609](https://github.com/gin-gonic/gin/pull/1609)
+- [NEW] Yaml binding support [#1618](https://github.com/gin-gonic/gin/pull/1618)
+- [FIX] Pass MaxMultipartMemory when FormFile is called [#1600](https://github.com/gin-gonic/gin/pull/1600)
+- [FIX] LoadHTML* tests [#1559](https://github.com/gin-gonic/gin/pull/1559)
+- [FIX] Removed use of sync.pool from HandleContext [#1565](https://github.com/gin-gonic/gin/pull/1565)
+- [FIX] Format output log to os.Stderr [#1571](https://github.com/gin-gonic/gin/pull/1571)
+- [FIX] Make logger use a yellow background and a darkgray text for legibility [#1570](https://github.com/gin-gonic/gin/pull/1570)
+- [FIX] Remove sensitive request information from panic log. [#1370](https://github.com/gin-gonic/gin/pull/1370)
+- [FIX] log.Println() does not print timestamp [#829](https://github.com/gin-gonic/gin/pull/829) [#1560](https://github.com/gin-gonic/gin/pull/1560)
+- [NEW] Add PureJSON renderer [#694](https://github.com/gin-gonic/gin/pull/694)
+- [FIX] Add missing copyright and update if/else [#1497](https://github.com/gin-gonic/gin/pull/1497)
+- [FIX] Update msgpack usage [#1498](https://github.com/gin-gonic/gin/pull/1498)
+- [FIX] Use protobuf on render [#1496](https://github.com/gin-gonic/gin/pull/1496)
+- [FIX] Add support for Protobuf format response [#1479](https://github.com/gin-gonic/gin/pull/1479)
+- [NEW] Set default time format in form binding [#1487](https://github.com/gin-gonic/gin/pull/1487)
+- [FIX] Add BindXML and ShouldBindXML [#1485](https://github.com/gin-gonic/gin/pull/1485)
+- [NEW] Upgrade dependency libraries [#1491](https://github.com/gin-gonic/gin/pull/1491)
+
+
+## Gin v1.3.0
+
+- [NEW] Add [`func (*Context) QueryMap`](https://godoc.org/github.com/gin-gonic/gin#Context.QueryMap), [`func (*Context) GetQueryMap`](https://godoc.org/github.com/gin-gonic/gin#Context.GetQueryMap), [`func (*Context) PostFormMap`](https://godoc.org/github.com/gin-gonic/gin#Context.PostFormMap) and [`func (*Context) GetPostFormMap`](https://godoc.org/github.com/gin-gonic/gin#Context.GetPostFormMap) to support `type map[string]string` as query string or form parameters, see [#1383](https://github.com/gin-gonic/gin/pull/1383)
+- [NEW] Add [`func (*Context) AsciiJSON`](https://godoc.org/github.com/gin-gonic/gin#Context.AsciiJSON), see [#1358](https://github.com/gin-gonic/gin/pull/1358)
+- [NEW] Add `Pusher()` in [`type ResponseWriter`](https://godoc.org/github.com/gin-gonic/gin#ResponseWriter) for supporting http2 push, see [#1273](https://github.com/gin-gonic/gin/pull/1273)
+- [NEW] Add [`func (*Context) DataFromReader`](https://godoc.org/github.com/gin-gonic/gin#Context.DataFromReader) for serving dynamic data, see [#1304](https://github.com/gin-gonic/gin/pull/1304)
+- [NEW] Add [`func (*Context) ShouldBindBodyWith`](https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBindBodyWith) allowing to call binding multiple times, see [#1341](https://github.com/gin-gonic/gin/pull/1341)
+- [NEW] Support pointers in form binding, see [#1336](https://github.com/gin-gonic/gin/pull/1336)
+- [NEW] Add [`func (*Context) JSONP`](https://godoc.org/github.com/gin-gonic/gin#Context.JSONP), see [#1333](https://github.com/gin-gonic/gin/pull/1333)
+- [NEW] Support default value in form binding, see [#1138](https://github.com/gin-gonic/gin/pull/1138)
+- [NEW] Expose validator engine in [`type StructValidator`](https://godoc.org/github.com/gin-gonic/gin/binding#StructValidator), see [#1277](https://github.com/gin-gonic/gin/pull/1277)
+- [NEW] Add [`func (*Context) ShouldBind`](https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBind), [`func (*Context) ShouldBindQuery`](https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBindQuery) and [`func (*Context) ShouldBindJSON`](https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBindJSON), see [#1047](https://github.com/gin-gonic/gin/pull/1047)
+- [NEW] Add support for `time.Time` location in form binding, see [#1117](https://github.com/gin-gonic/gin/pull/1117)
+- [NEW] Add [`func (*Context) BindQuery`](https://godoc.org/github.com/gin-gonic/gin#Context.BindQuery), see [#1029](https://github.com/gin-gonic/gin/pull/1029)
+- [NEW] Make [jsonite](https://github.com/json-iterator/go) optional with build tags, see [#1026](https://github.com/gin-gonic/gin/pull/1026)
+- [NEW] Show query string in logger, see [#999](https://github.com/gin-gonic/gin/pull/999)
+- [NEW] Add [`func (*Context) SecureJSON`](https://godoc.org/github.com/gin-gonic/gin#Context.SecureJSON), see [#987](https://github.com/gin-gonic/gin/pull/987) and [#993](https://github.com/gin-gonic/gin/pull/993)
+- [DEPRECATE] `func (*Context) GetCookie` for [`func (*Context) Cookie`](https://godoc.org/github.com/gin-gonic/gin#Context.Cookie)
+- [FIX] Don't display color tags if [`func DisableConsoleColor`](https://godoc.org/github.com/gin-gonic/gin#DisableConsoleColor) called, see [#1072](https://github.com/gin-gonic/gin/pull/1072)
+- [FIX] Gin Mode `""` when calling [`func Mode`](https://godoc.org/github.com/gin-gonic/gin#Mode) now returns `const DebugMode`, see [#1250](https://github.com/gin-gonic/gin/pull/1250)
+- [FIX] `Flush()` now doesn't overwrite `responseWriter` status code, see [#1460](https://github.com/gin-gonic/gin/pull/1460)
+
+## Gin 1.2.0
+
+- [NEW] Switch from godeps to govendor
+- [NEW] Add support for Let's Encrypt via gin-gonic/autotls
+- [NEW] Improve README examples and add extra at examples folder
+- [NEW] Improved support with App Engine
+- [NEW] Add custom template delimiters, see #860
+- [NEW] Add Template Func Maps, see #962
+- [NEW] Add \*context.Handler(), see #928
+- [NEW] Add \*context.GetRawData()
+- [NEW] Add \*context.GetHeader() (request)
+- [NEW] Add \*context.AbortWithStatusJSON() (JSON content type)
+- [NEW] Add \*context.Keys type cast helpers
+- [NEW] Add \*context.ShouldBindWith()
+- [NEW] Add \*context.MustBindWith()
+- [NEW] Add \*engine.SetFuncMap()
+- [DEPRECATE] On next release: \*context.BindWith(), see #855
+- [FIX] Refactor render
+- [FIX] Reworked tests
+- [FIX] logger now supports cygwin
+- [FIX] Use X-Forwarded-For before X-Real-Ip
+- [FIX] time.Time binding (#904)
+
+## Gin 1.1.4
+
+- [NEW] Support google appengine for IsTerminal func
+
+## Gin 1.1.3
+
+- [FIX] Reverted Logger: skip ANSI color commands
+
+## Gin 1.1
+
+- [NEW] Implement QueryArray and PostArray methods
+- [NEW] Refactor GetQuery and GetPostForm
+- [NEW] Add contribution guide
+- [FIX] Corrected typos in README
+- [FIX] Removed additional Iota
+- [FIX] Changed imports to gopkg instead of github in README (#733)
+- [FIX] Logger: skip ANSI color commands if output is not a tty
+
+## Gin 1.0rc2 (...)
+
+- [PERFORMANCE] Fast path for writing Content-Type.
+- [PERFORMANCE] Much faster 404 routing
+- [PERFORMANCE] Allocation optimizations
+- [PERFORMANCE] Faster root tree lookup
+- [PERFORMANCE] Zero overhead, String() and JSON() rendering.
+- [PERFORMANCE] Faster ClientIP parsing
+- [PERFORMANCE] Much faster SSE implementation
+- [NEW] Benchmarks suite
+- [NEW] Bind validation can be disabled and replaced with custom validators.
+- [NEW] More flexible HTML render
+- [NEW] Multipart and PostForm bindings
+- [NEW] Adds method to return all the registered routes
+- [NEW] Context.HandlerName() returns the main handler's name
+- [NEW] Adds Error.IsType() helper
+- [FIX] Binding multipart form
+- [FIX] Integration tests
+- [FIX] Crash when binding non struct object in Context.
+- [FIX] RunTLS() implementation
+- [FIX] Logger() unit tests
+- [FIX] Adds SetHTMLTemplate() warning
+- [FIX] Context.IsAborted()
+- [FIX] More unit tests
+- [FIX] JSON, XML, HTML renders accept custom content-types
+- [FIX] gin.AbortIndex is unexported
+- [FIX] Better approach to avoid directory listing in StaticFS()
+- [FIX] Context.ClientIP() always returns the IP with trimmed spaces.
+- [FIX] Better warning when running in debug mode.
+- [FIX] Google App Engine integration. debugPrint does not use os.Stdout
+- [FIX] Fixes integer overflow in error type
+- [FIX] Error implements the json.Marshaller interface
+- [FIX] MIT license in every file
+
+
+## Gin 1.0rc1 (May 22, 2015)
+
+- [PERFORMANCE] Zero allocation router
+- [PERFORMANCE] Faster JSON, XML and text rendering
+- [PERFORMANCE] Custom hand optimized HttpRouter for Gin
+- [PERFORMANCE] Misc code optimizations. Inlining, tail call optimizations
+- [NEW] Built-in support for golang.org/x/net/context
+- [NEW] Any(path, handler). Create a route that matches any path
+- [NEW] Refactored rendering pipeline (faster and static typed)
+- [NEW] Refactored errors API
+- [NEW] IndentedJSON() prints pretty JSON
+- [NEW] Added gin.DefaultWriter
+- [NEW] UNIX socket support
+- [NEW] RouterGroup.BasePath is exposed
+- [NEW] JSON validation using go-validate-yourself (very powerful options)
+- [NEW] Completed suite of unit tests
+- [NEW] HTTP streaming with c.Stream()
+- [NEW] StaticFile() creates a router for serving just one file.
+- [NEW] StaticFS() has an option to disable directory listing.
+- [NEW] StaticFS() for serving static files through virtual filesystems
+- [NEW] Server-Sent Events native support
+- [NEW] WrapF() and WrapH() helpers for wrapping http.HandlerFunc and http.Handler
+- [NEW] Added LoggerWithWriter() middleware
+- [NEW] Added RecoveryWithWriter() middleware
+- [NEW] Added DefaultPostFormValue()
+- [NEW] Added DefaultFormValue()
+- [NEW] Added DefaultParamValue()
+- [FIX] BasicAuth() when using custom realm
+- [FIX] Bug when serving static files in nested routing group
+- [FIX] Redirect using built-in http.Redirect()
+- [FIX] Logger when printing the requested path
+- [FIX] Documentation typos
+- [FIX] Context.Engine renamed to Context.engine
+- [FIX] Better debugging messages
+- [FIX] ErrorLogger
+- [FIX] Debug HTTP render
+- [FIX] Refactored binding and render modules
+- [FIX] Refactored Context initialization
+- [FIX] Refactored BasicAuth()
+- [FIX] NoMethod/NoRoute handlers
+- [FIX] Hijacking http
+- [FIX] Better support for Google App Engine (using log instead of fmt)
+
+
+## Gin 0.6 (Mar 9, 2015)
+
+- [NEW] Support multipart/form-data
+- [NEW] NoMethod handler
+- [NEW] Validate sub structures
+- [NEW] Support for HTTP Realm Auth
+- [FIX] Unsigned integers in binding
+- [FIX] Improve color logger
+
+
+## Gin 0.5 (Feb 7, 2015)
+
+- [NEW] Content Negotiation
+- [FIX] Solved security bug that allow a client to spoof ip
+- [FIX] Fix unexported/ignored fields in binding
+
+
+## Gin 0.4 (Aug 21, 2014)
+
+- [NEW] Development mode
+- [NEW] Unit tests
+- [NEW] Add Content.Redirect()
+- [FIX] Deferring WriteHeader()
+- [FIX] Improved documentation for model binding
+
+
+## Gin 0.3 (Jul 18, 2014)
+
+- [PERFORMANCE] Normal log and error log are printed in the same call.
+- [PERFORMANCE] Improve performance of NoRouter()
+- [PERFORMANCE] Improve context's memory locality, reduce CPU cache faults.
+- [NEW] Flexible rendering API
+- [NEW] Add Context.File()
+- [NEW] Add shortcut RunTLS() for http.ListenAndServeTLS
+- [FIX] Rename NotFound404() to NoRoute()
+- [FIX] Errors in context are purged
+- [FIX] Adds HEAD method in Static file serving
+- [FIX] Refactors Static() file serving
+- [FIX] Using keyed initialization to fix app-engine integration
+- [FIX] Can't unmarshal JSON array, #63
+- [FIX] Renaming Context.Req to Context.Request
+- [FIX] Check application/x-www-form-urlencoded when parsing form
+
+
+## Gin 0.2b (Jul 08, 2014)
+- [PERFORMANCE] Using sync.Pool to allocatio/gc overhead
+- [NEW] Travis CI integration
+- [NEW] Completely new logger
+- [NEW] New API for serving static files. gin.Static()
+- [NEW] gin.H() can be serialized into XML
+- [NEW] Typed errors. Errors can be typed. Internet/external/custom.
+- [NEW] Support for Godeps
+- [NEW] Travis/Godocs badges in README
+- [NEW] New Bind() and BindWith() methods for parsing request body.
+- [NEW] Add Content.Copy()
+- [NEW] Add context.LastError()
+- [NEW] Add shortcut for OPTIONS HTTP method
+- [FIX] Tons of README fixes
+- [FIX] Header is written before body
+- [FIX] BasicAuth() and changes API a little bit
+- [FIX] Recovery() middleware only prints panics
+- [FIX] Context.Get() does not panic anymore. Use MustGet() instead.
+- [FIX] Multiple http.WriteHeader() in NotFound handlers
+- [FIX] Engine.Run() panics if http server can't be set up
+- [FIX] Crash when route path doesn't start with '/'
+- [FIX] Do not update header when status code is negative
+- [FIX] Setting response headers before calling WriteHeader in context.String()
+- [FIX] Add MIT license
+- [FIX] Changes behaviour of ErrorLogger() and Logger()
diff --git a/vendor/github.com/gin-gonic/gin/CODE_OF_CONDUCT.md b/vendor/github.com/gin-gonic/gin/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..4ea14f3
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/CODE_OF_CONDUCT.md
@@ -0,0 +1,46 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at teamgingonic@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/
diff --git a/vendor/github.com/gin-gonic/gin/CONTRIBUTING.md b/vendor/github.com/gin-gonic/gin/CONTRIBUTING.md
new file mode 100644
index 0000000..97daa80
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/CONTRIBUTING.md
@@ -0,0 +1,13 @@
+## Contributing
+
+- With issues:
+ - Use the search tool before opening a new issue.
+ - Please provide source code and commit sha if you found a bug.
+ - Review existing issues and provide feedback or react to them.
+
+- With pull requests:
+ - Open your pull request against `master`
+ - Your pull request should have no more than two commits, if not you should squash them.
+ - It should pass all tests in the available continuous integration systems such as TravisCI.
+ - You should add/modify tests to cover your proposed code changes.
+ - If your pull request contains a new feature, please document it on the README.
diff --git a/vendor/github.com/gin-gonic/gin/LICENSE b/vendor/github.com/gin-gonic/gin/LICENSE
new file mode 100644
index 0000000..1ff7f37
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Manuel Martínez-Almeida
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/github.com/gin-gonic/gin/Makefile b/vendor/github.com/gin-gonic/gin/Makefile
new file mode 100644
index 0000000..1a99193
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/Makefile
@@ -0,0 +1,71 @@
+GO ?= go
+GOFMT ?= gofmt "-s"
+PACKAGES ?= $(shell $(GO) list ./...)
+VETPACKAGES ?= $(shell $(GO) list ./... | grep -v /examples/)
+GOFILES := $(shell find . -name "*.go")
+TESTFOLDER := $(shell $(GO) list ./... | grep -E 'gin$$|binding$$|render$$' | grep -v examples)
+TESTTAGS ?= ""
+
+.PHONY: test
+test:
+ echo "mode: count" > coverage.out
+ for d in $(TESTFOLDER); do \
+ $(GO) test -tags $(TESTTAGS) -v -covermode=count -coverprofile=profile.out $$d > tmp.out; \
+ cat tmp.out; \
+ if grep -q "^--- FAIL" tmp.out; then \
+ rm tmp.out; \
+ exit 1; \
+ elif grep -q "build failed" tmp.out; then \
+ rm tmp.out; \
+ exit 1; \
+ elif grep -q "setup failed" tmp.out; then \
+ rm tmp.out; \
+ exit 1; \
+ fi; \
+ if [ -f profile.out ]; then \
+ cat profile.out | grep -v "mode:" >> coverage.out; \
+ rm profile.out; \
+ fi; \
+ done
+
+.PHONY: fmt
+fmt:
+ $(GOFMT) -w $(GOFILES)
+
+.PHONY: fmt-check
+fmt-check:
+ @diff=$$($(GOFMT) -d $(GOFILES)); \
+ if [ -n "$$diff" ]; then \
+ echo "Please run 'make fmt' and commit the result:"; \
+ echo "$${diff}"; \
+ exit 1; \
+ fi;
+
+vet:
+ $(GO) vet $(VETPACKAGES)
+
+.PHONY: lint
+lint:
+ @hash golint > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
+ $(GO) get -u golang.org/x/lint/golint; \
+ fi
+ for PKG in $(PACKAGES); do golint -set_exit_status $$PKG || exit 1; done;
+
+.PHONY: misspell-check
+misspell-check:
+ @hash misspell > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
+ $(GO) get -u github.com/client9/misspell/cmd/misspell; \
+ fi
+ misspell -error $(GOFILES)
+
+.PHONY: misspell
+misspell:
+ @hash misspell > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
+ $(GO) get -u github.com/client9/misspell/cmd/misspell; \
+ fi
+ misspell -w $(GOFILES)
+
+.PHONY: tools
+tools:
+ go install golang.org/x/lint/golint; \
+ go install github.com/client9/misspell/cmd/misspell;
diff --git a/vendor/github.com/gin-gonic/gin/README.md b/vendor/github.com/gin-gonic/gin/README.md
new file mode 100644
index 0000000..d4772d7
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/README.md
@@ -0,0 +1,2217 @@
+# Gin Web Framework
+
+
+
+[![Build Status](https://travis-ci.org/gin-gonic/gin.svg)](https://travis-ci.org/gin-gonic/gin)
+[![codecov](https://codecov.io/gh/gin-gonic/gin/branch/master/graph/badge.svg)](https://codecov.io/gh/gin-gonic/gin)
+[![Go Report Card](https://goreportcard.com/badge/github.com/gin-gonic/gin)](https://goreportcard.com/report/github.com/gin-gonic/gin)
+[![GoDoc](https://pkg.go.dev/badge/github.com/gin-gonic/gin?status.svg)](https://pkg.go.dev/github.com/gin-gonic/gin?tab=doc)
+[![Join the chat at https://gitter.im/gin-gonic/gin](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/gin-gonic/gin?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+[![Sourcegraph](https://sourcegraph.com/github.com/gin-gonic/gin/-/badge.svg)](https://sourcegraph.com/github.com/gin-gonic/gin?badge)
+[![Open Source Helpers](https://www.codetriage.com/gin-gonic/gin/badges/users.svg)](https://www.codetriage.com/gin-gonic/gin)
+[![Release](https://img.shields.io/github/release/gin-gonic/gin.svg?style=flat-square)](https://github.com/gin-gonic/gin/releases)
+[![TODOs](https://badgen.net/https/api.tickgit.com/badgen/github.com/gin-gonic/gin)](https://www.tickgit.com/browse?repo=github.com/gin-gonic/gin)
+
+Gin is a web framework written in Go (Golang). It features a martini-like API with performance that is up to 40 times faster thanks to [httprouter](https://github.com/julienschmidt/httprouter). If you need performance and good productivity, you will love Gin.
+
+
+## Contents
+
+- [Gin Web Framework](#gin-web-framework)
+ - [Contents](#contents)
+ - [Installation](#installation)
+ - [Quick start](#quick-start)
+ - [Benchmarks](#benchmarks)
+ - [Gin v1. stable](#gin-v1-stable)
+ - [Build with jsoniter](#build-with-jsoniter)
+ - [API Examples](#api-examples)
+ - [Using GET, POST, PUT, PATCH, DELETE and OPTIONS](#using-get-post-put-patch-delete-and-options)
+ - [Parameters in path](#parameters-in-path)
+ - [Querystring parameters](#querystring-parameters)
+ - [Multipart/Urlencoded Form](#multiparturlencoded-form)
+ - [Another example: query + post form](#another-example-query--post-form)
+ - [Map as querystring or postform parameters](#map-as-querystring-or-postform-parameters)
+ - [Upload files](#upload-files)
+ - [Single file](#single-file)
+ - [Multiple files](#multiple-files)
+ - [Grouping routes](#grouping-routes)
+ - [Blank Gin without middleware by default](#blank-gin-without-middleware-by-default)
+ - [Using middleware](#using-middleware)
+ - [How to write log file](#how-to-write-log-file)
+ - [Custom Log Format](#custom-log-format)
+ - [Controlling Log output coloring](#controlling-log-output-coloring)
+ - [Model binding and validation](#model-binding-and-validation)
+ - [Custom Validators](#custom-validators)
+ - [Only Bind Query String](#only-bind-query-string)
+ - [Bind Query String or Post Data](#bind-query-string-or-post-data)
+ - [Bind Uri](#bind-uri)
+ - [Bind Header](#bind-header)
+ - [Bind HTML checkboxes](#bind-html-checkboxes)
+ - [Multipart/Urlencoded binding](#multiparturlencoded-binding)
+ - [XML, JSON, YAML and ProtoBuf rendering](#xml-json-yaml-and-protobuf-rendering)
+ - [SecureJSON](#securejson)
+ - [JSONP](#jsonp)
+ - [AsciiJSON](#asciijson)
+ - [PureJSON](#purejson)
+ - [Serving static files](#serving-static-files)
+ - [Serving data from file](#serving-data-from-file)
+ - [Serving data from reader](#serving-data-from-reader)
+ - [HTML rendering](#html-rendering)
+ - [Custom Template renderer](#custom-template-renderer)
+ - [Custom Delimiters](#custom-delimiters)
+ - [Custom Template Funcs](#custom-template-funcs)
+ - [Multitemplate](#multitemplate)
+ - [Redirects](#redirects)
+ - [Custom Middleware](#custom-middleware)
+ - [Using BasicAuth() middleware](#using-basicauth-middleware)
+ - [Goroutines inside a middleware](#goroutines-inside-a-middleware)
+ - [Custom HTTP configuration](#custom-http-configuration)
+ - [Support Let's Encrypt](#support-lets-encrypt)
+ - [Run multiple service using Gin](#run-multiple-service-using-gin)
+ - [Graceful shutdown or restart](#graceful-shutdown-or-restart)
+ - [Third-party packages](#third-party-packages)
+ - [Manually](#manually)
+ - [Build a single binary with templates](#build-a-single-binary-with-templates)
+ - [Bind form-data request with custom struct](#bind-form-data-request-with-custom-struct)
+ - [Try to bind body into different structs](#try-to-bind-body-into-different-structs)
+ - [http2 server push](#http2-server-push)
+ - [Define format for the log of routes](#define-format-for-the-log-of-routes)
+ - [Set and get a cookie](#set-and-get-a-cookie)
+ - [Testing](#testing)
+ - [Users](#users)
+
+## Installation
+
+To install Gin package, you need to install Go and set your Go workspace first.
+
+1. The first need [Go](https://golang.org/) installed (**version 1.12+ is required**), then you can use the below Go command to install Gin.
+
+```sh
+$ go get -u github.com/gin-gonic/gin
+```
+
+2. Import it in your code:
+
+```go
+import "github.com/gin-gonic/gin"
+```
+
+3. (Optional) Import `net/http`. This is required for example if using constants such as `http.StatusOK`.
+
+```go
+import "net/http"
+```
+
+## Quick start
+
+```sh
+# assume the following codes in example.go file
+$ cat example.go
+```
+
+```go
+package main
+
+import "github.com/gin-gonic/gin"
+
+func main() {
+ r := gin.Default()
+ r.GET("/ping", func(c *gin.Context) {
+ c.JSON(200, gin.H{
+ "message": "pong",
+ })
+ })
+ r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
+}
+```
+
+```
+# run example.go and visit 0.0.0.0:8080/ping (for windows "localhost:8080/ping") on browser
+$ go run example.go
+```
+
+## Benchmarks
+
+Gin uses a custom version of [HttpRouter](https://github.com/julienschmidt/httprouter)
+
+[See all benchmarks](/BENCHMARKS.md)
+
+| Benchmark name | (1) | (2) | (3) | (4) |
+| ------------------------------ | ---------:| ---------------:| ------------:| ---------------:|
+| BenchmarkGin_GithubAll | **43550** | **27364 ns/op** | **0 B/op** | **0 allocs/op** |
+| BenchmarkAce_GithubAll | 40543 | 29670 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAero_GithubAll | 57632 | 20648 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkBear_GithubAll | 9234 | 216179 ns/op | 86448 B/op | 943 allocs/op |
+| BenchmarkBeego_GithubAll | 7407 | 243496 ns/op | 71456 B/op | 609 allocs/op |
+| BenchmarkBone_GithubAll | 420 | 2922835 ns/op | 720160 B/op | 8620 allocs/op |
+| BenchmarkChi_GithubAll | 7620 | 238331 ns/op | 87696 B/op | 609 allocs/op |
+| BenchmarkDenco_GithubAll | 18355 | 64494 ns/op | 20224 B/op | 167 allocs/op |
+| BenchmarkEcho_GithubAll | 31251 | 38479 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkGocraftWeb_GithubAll | 4117 | 300062 ns/op | 131656 B/op | 1686 allocs/op |
+| BenchmarkGoji_GithubAll | 3274 | 416158 ns/op | 56112 B/op | 334 allocs/op |
+| BenchmarkGojiv2_GithubAll | 1402 | 870518 ns/op | 352720 B/op | 4321 allocs/op |
+| BenchmarkGoJsonRest_GithubAll | 2976 | 401507 ns/op | 134371 B/op | 2737 allocs/op |
+| BenchmarkGoRestful_GithubAll | 410 | 2913158 ns/op | 910144 B/op | 2938 allocs/op |
+| BenchmarkGorillaMux_GithubAll | 346 | 3384987 ns/op | 251650 B/op | 1994 allocs/op |
+| BenchmarkGowwwRouter_GithubAll | 10000 | 143025 ns/op | 72144 B/op | 501 allocs/op |
+| BenchmarkHttpRouter_GithubAll | 55938 | 21360 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkHttpTreeMux_GithubAll | 10000 | 153944 ns/op | 65856 B/op | 671 allocs/op |
+| BenchmarkKocha_GithubAll | 10000 | 106315 ns/op | 23304 B/op | 843 allocs/op |
+| BenchmarkLARS_GithubAll | 47779 | 25084 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMacaron_GithubAll | 3266 | 371907 ns/op | 149409 B/op | 1624 allocs/op |
+| BenchmarkMartini_GithubAll | 331 | 3444706 ns/op | 226551 B/op | 2325 allocs/op |
+| BenchmarkPat_GithubAll | 273 | 4381818 ns/op | 1483152 B/op | 26963 allocs/op |
+| BenchmarkPossum_GithubAll | 10000 | 164367 ns/op | 84448 B/op | 609 allocs/op |
+| BenchmarkR2router_GithubAll | 10000 | 160220 ns/op | 77328 B/op | 979 allocs/op |
+| BenchmarkRivet_GithubAll | 14625 | 82453 ns/op | 16272 B/op | 167 allocs/op |
+| BenchmarkTango_GithubAll | 6255 | 279611 ns/op | 63826 B/op | 1618 allocs/op |
+| BenchmarkTigerTonic_GithubAll | 2008 | 687874 ns/op | 193856 B/op | 4474 allocs/op |
+| BenchmarkTraffic_GithubAll | 355 | 3478508 ns/op | 820744 B/op | 14114 allocs/op |
+| BenchmarkVulcan_GithubAll | 6885 | 193333 ns/op | 19894 B/op | 609 allocs/op |
+
+- (1): Total Repetitions achieved in constant time, higher means more confident result
+- (2): Single Repetition Duration (ns/op), lower is better
+- (3): Heap Memory (B/op), lower is better
+- (4): Average Allocations per Repetition (allocs/op), lower is better
+
+## Gin v1. stable
+
+- [x] Zero allocation router.
+- [x] Still the fastest http router and framework. From routing to writing.
+- [x] Complete suite of unit tests.
+- [x] Battle tested.
+- [x] API frozen, new releases will not break your code.
+
+## Build with [jsoniter](https://github.com/json-iterator/go)
+
+Gin uses `encoding/json` as default json package but you can change to [jsoniter](https://github.com/json-iterator/go) by build from other tags.
+
+```sh
+$ go build -tags=jsoniter .
+```
+
+## API Examples
+
+You can find a number of ready-to-run examples at [Gin examples repository](https://github.com/gin-gonic/examples).
+
+### Using GET, POST, PUT, PATCH, DELETE and OPTIONS
+
+```go
+func main() {
+ // Creates a gin router with default middleware:
+ // logger and recovery (crash-free) middleware
+ router := gin.Default()
+
+ router.GET("/someGet", getting)
+ router.POST("/somePost", posting)
+ router.PUT("/somePut", putting)
+ router.DELETE("/someDelete", deleting)
+ router.PATCH("/somePatch", patching)
+ router.HEAD("/someHead", head)
+ router.OPTIONS("/someOptions", options)
+
+ // By default it serves on :8080 unless a
+ // PORT environment variable was defined.
+ router.Run()
+ // router.Run(":3000") for a hard coded port
+}
+```
+
+### Parameters in path
+
+```go
+func main() {
+ router := gin.Default()
+
+ // This handler will match /user/john but will not match /user/ or /user
+ router.GET("/user/:name", func(c *gin.Context) {
+ name := c.Param("name")
+ c.String(http.StatusOK, "Hello %s", name)
+ })
+
+ // However, this one will match /user/john/ and also /user/john/send
+ // If no other routers match /user/john, it will redirect to /user/john/
+ router.GET("/user/:name/*action", func(c *gin.Context) {
+ name := c.Param("name")
+ action := c.Param("action")
+ message := name + " is " + action
+ c.String(http.StatusOK, message)
+ })
+
+ // For each matched request Context will hold the route definition
+ router.POST("/user/:name/*action", func(c *gin.Context) {
+ c.FullPath() == "/user/:name/*action" // true
+ })
+
+ // This handler will add a new router for /user/groups.
+ // Exact routes are resolved before param routes, regardless of the order they were defined.
+ // Routes starting with /user/groups are never interpreted as /user/:name/... routes
+ router.GET("/user/groups", func(c *gin.Context) {
+ c.String(http.StatusOK, "The available groups are [...]", name)
+ })
+
+ router.Run(":8080")
+}
+```
+
+### Querystring parameters
+
+```go
+func main() {
+ router := gin.Default()
+
+ // Query string parameters are parsed using the existing underlying request object.
+ // The request responds to a url matching: /welcome?firstname=Jane&lastname=Doe
+ router.GET("/welcome", func(c *gin.Context) {
+ firstname := c.DefaultQuery("firstname", "Guest")
+ lastname := c.Query("lastname") // shortcut for c.Request.URL.Query().Get("lastname")
+
+ c.String(http.StatusOK, "Hello %s %s", firstname, lastname)
+ })
+ router.Run(":8080")
+}
+```
+
+### Multipart/Urlencoded Form
+
+```go
+func main() {
+ router := gin.Default()
+
+ router.POST("/form_post", func(c *gin.Context) {
+ message := c.PostForm("message")
+ nick := c.DefaultPostForm("nick", "anonymous")
+
+ c.JSON(200, gin.H{
+ "status": "posted",
+ "message": message,
+ "nick": nick,
+ })
+ })
+ router.Run(":8080")
+}
+```
+
+### Another example: query + post form
+
+```
+POST /post?id=1234&page=1 HTTP/1.1
+Content-Type: application/x-www-form-urlencoded
+
+name=manu&message=this_is_great
+```
+
+```go
+func main() {
+ router := gin.Default()
+
+ router.POST("/post", func(c *gin.Context) {
+
+ id := c.Query("id")
+ page := c.DefaultQuery("page", "0")
+ name := c.PostForm("name")
+ message := c.PostForm("message")
+
+ fmt.Printf("id: %s; page: %s; name: %s; message: %s", id, page, name, message)
+ })
+ router.Run(":8080")
+}
+```
+
+```
+id: 1234; page: 1; name: manu; message: this_is_great
+```
+
+### Map as querystring or postform parameters
+
+```
+POST /post?ids[a]=1234&ids[b]=hello HTTP/1.1
+Content-Type: application/x-www-form-urlencoded
+
+names[first]=thinkerou&names[second]=tianou
+```
+
+```go
+func main() {
+ router := gin.Default()
+
+ router.POST("/post", func(c *gin.Context) {
+
+ ids := c.QueryMap("ids")
+ names := c.PostFormMap("names")
+
+ fmt.Printf("ids: %v; names: %v", ids, names)
+ })
+ router.Run(":8080")
+}
+```
+
+```
+ids: map[b:hello a:1234]; names: map[second:tianou first:thinkerou]
+```
+
+### Upload files
+
+#### Single file
+
+References issue [#774](https://github.com/gin-gonic/gin/issues/774) and detail [example code](https://github.com/gin-gonic/examples/tree/master/upload-file/single).
+
+`file.Filename` **SHOULD NOT** be trusted. See [`Content-Disposition` on MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition#Directives) and [#1693](https://github.com/gin-gonic/gin/issues/1693)
+
+> The filename is always optional and must not be used blindly by the application: path information should be stripped, and conversion to the server file system rules should be done.
+
+```go
+func main() {
+ router := gin.Default()
+ // Set a lower memory limit for multipart forms (default is 32 MiB)
+ router.MaxMultipartMemory = 8 << 20 // 8 MiB
+ router.POST("/upload", func(c *gin.Context) {
+ // single file
+ file, _ := c.FormFile("file")
+ log.Println(file.Filename)
+
+ // Upload the file to specific dst.
+ c.SaveUploadedFile(file, dst)
+
+ c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))
+ })
+ router.Run(":8080")
+}
+```
+
+How to `curl`:
+
+```bash
+curl -X POST http://localhost:8080/upload \
+ -F "file=@/Users/appleboy/test.zip" \
+ -H "Content-Type: multipart/form-data"
+```
+
+#### Multiple files
+
+See the detail [example code](https://github.com/gin-gonic/examples/tree/master/upload-file/multiple).
+
+```go
+func main() {
+ router := gin.Default()
+ // Set a lower memory limit for multipart forms (default is 32 MiB)
+ router.MaxMultipartMemory = 8 << 20 // 8 MiB
+ router.POST("/upload", func(c *gin.Context) {
+ // Multipart form
+ form, _ := c.MultipartForm()
+ files := form.File["upload[]"]
+
+ for _, file := range files {
+ log.Println(file.Filename)
+
+ // Upload the file to specific dst.
+ c.SaveUploadedFile(file, dst)
+ }
+ c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files)))
+ })
+ router.Run(":8080")
+}
+```
+
+How to `curl`:
+
+```bash
+curl -X POST http://localhost:8080/upload \
+ -F "upload[]=@/Users/appleboy/test1.zip" \
+ -F "upload[]=@/Users/appleboy/test2.zip" \
+ -H "Content-Type: multipart/form-data"
+```
+
+### Grouping routes
+
+```go
+func main() {
+ router := gin.Default()
+
+ // Simple group: v1
+ v1 := router.Group("/v1")
+ {
+ v1.POST("/login", loginEndpoint)
+ v1.POST("/submit", submitEndpoint)
+ v1.POST("/read", readEndpoint)
+ }
+
+ // Simple group: v2
+ v2 := router.Group("/v2")
+ {
+ v2.POST("/login", loginEndpoint)
+ v2.POST("/submit", submitEndpoint)
+ v2.POST("/read", readEndpoint)
+ }
+
+ router.Run(":8080")
+}
+```
+
+### Blank Gin without middleware by default
+
+Use
+
+```go
+r := gin.New()
+```
+
+instead of
+
+```go
+// Default With the Logger and Recovery middleware already attached
+r := gin.Default()
+```
+
+
+### Using middleware
+```go
+func main() {
+ // Creates a router without any middleware by default
+ r := gin.New()
+
+ // Global middleware
+ // Logger middleware will write the logs to gin.DefaultWriter even if you set with GIN_MODE=release.
+ // By default gin.DefaultWriter = os.Stdout
+ r.Use(gin.Logger())
+
+ // Recovery middleware recovers from any panics and writes a 500 if there was one.
+ r.Use(gin.Recovery())
+
+ // Per route middleware, you can add as many as you desire.
+ r.GET("/benchmark", MyBenchLogger(), benchEndpoint)
+
+ // Authorization group
+ // authorized := r.Group("/", AuthRequired())
+ // exactly the same as:
+ authorized := r.Group("/")
+ // per group middleware! in this case we use the custom created
+ // AuthRequired() middleware just in the "authorized" group.
+ authorized.Use(AuthRequired())
+ {
+ authorized.POST("/login", loginEndpoint)
+ authorized.POST("/submit", submitEndpoint)
+ authorized.POST("/read", readEndpoint)
+
+ // nested group
+ testing := authorized.Group("testing")
+ testing.GET("/analytics", analyticsEndpoint)
+ }
+
+ // Listen and serve on 0.0.0.0:8080
+ r.Run(":8080")
+}
+```
+
+### Custom Recovery behavior
+```go
+func main() {
+ // Creates a router without any middleware by default
+ r := gin.New()
+
+ // Global middleware
+ // Logger middleware will write the logs to gin.DefaultWriter even if you set with GIN_MODE=release.
+ // By default gin.DefaultWriter = os.Stdout
+ r.Use(gin.Logger())
+
+ // Recovery middleware recovers from any panics and writes a 500 if there was one.
+ r.Use(gin.CustomRecovery(func(c *gin.Context, recovered interface{}) {
+ if err, ok := recovered.(string); ok {
+ c.String(http.StatusInternalServerError, fmt.Sprintf("error: %s", err))
+ }
+ c.AbortWithStatus(http.StatusInternalServerError)
+ }))
+
+ r.GET("/panic", func(c *gin.Context) {
+ // panic with a string -- the custom middleware could save this to a database or report it to the user
+ panic("foo")
+ })
+
+ r.GET("/", func(c *gin.Context) {
+ c.String(http.StatusOK, "ohai")
+ })
+
+ // Listen and serve on 0.0.0.0:8080
+ r.Run(":8080")
+}
+```
+
+### How to write log file
+```go
+func main() {
+ // Disable Console Color, you don't need console color when writing the logs to file.
+ gin.DisableConsoleColor()
+
+ // Logging to a file.
+ f, _ := os.Create("gin.log")
+ gin.DefaultWriter = io.MultiWriter(f)
+
+ // Use the following code if you need to write the logs to file and console at the same time.
+ // gin.DefaultWriter = io.MultiWriter(f, os.Stdout)
+
+ router := gin.Default()
+ router.GET("/ping", func(c *gin.Context) {
+ c.String(200, "pong")
+ })
+
+ router.Run(":8080")
+}
+```
+
+### Custom Log Format
+```go
+func main() {
+ router := gin.New()
+
+ // LoggerWithFormatter middleware will write the logs to gin.DefaultWriter
+ // By default gin.DefaultWriter = os.Stdout
+ router.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {
+
+ // your custom format
+ return fmt.Sprintf("%s - [%s] \"%s %s %s %d %s \"%s\" %s\"\n",
+ param.ClientIP,
+ param.TimeStamp.Format(time.RFC1123),
+ param.Method,
+ param.Path,
+ param.Request.Proto,
+ param.StatusCode,
+ param.Latency,
+ param.Request.UserAgent(),
+ param.ErrorMessage,
+ )
+ }))
+ router.Use(gin.Recovery())
+
+ router.GET("/ping", func(c *gin.Context) {
+ c.String(200, "pong")
+ })
+
+ router.Run(":8080")
+}
+```
+
+**Sample Output**
+```
+::1 - [Fri, 07 Dec 2018 17:04:38 JST] "GET /ping HTTP/1.1 200 122.767µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36" "
+```
+
+### Controlling Log output coloring
+
+By default, logs output on console should be colorized depending on the detected TTY.
+
+Never colorize logs:
+
+```go
+func main() {
+ // Disable log's color
+ gin.DisableConsoleColor()
+
+ // Creates a gin router with default middleware:
+ // logger and recovery (crash-free) middleware
+ router := gin.Default()
+
+ router.GET("/ping", func(c *gin.Context) {
+ c.String(200, "pong")
+ })
+
+ router.Run(":8080")
+}
+```
+
+Always colorize logs:
+
+```go
+func main() {
+ // Force log's color
+ gin.ForceConsoleColor()
+
+ // Creates a gin router with default middleware:
+ // logger and recovery (crash-free) middleware
+ router := gin.Default()
+
+ router.GET("/ping", func(c *gin.Context) {
+ c.String(200, "pong")
+ })
+
+ router.Run(":8080")
+}
+```
+
+### Model binding and validation
+
+To bind a request body into a type, use model binding. We currently support binding of JSON, XML, YAML and standard form values (foo=bar&boo=baz).
+
+Gin uses [**go-playground/validator/v10**](https://github.com/go-playground/validator) for validation. Check the full docs on tags usage [here](https://godoc.org/github.com/go-playground/validator#hdr-Baked_In_Validators_and_Tags).
+
+Note that you need to set the corresponding binding tag on all fields you want to bind. For example, when binding from JSON, set `json:"fieldname"`.
+
+Also, Gin provides two sets of methods for binding:
+- **Type** - Must bind
+ - **Methods** - `Bind`, `BindJSON`, `BindXML`, `BindQuery`, `BindYAML`, `BindHeader`
+ - **Behavior** - These methods use `MustBindWith` under the hood. If there is a binding error, the request is aborted with `c.AbortWithError(400, err).SetType(ErrorTypeBind)`. This sets the response status code to 400 and the `Content-Type` header is set to `text/plain; charset=utf-8`. Note that if you try to set the response code after this, it will result in a warning `[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 400 with 422`. If you wish to have greater control over the behavior, consider using the `ShouldBind` equivalent method.
+- **Type** - Should bind
+ - **Methods** - `ShouldBind`, `ShouldBindJSON`, `ShouldBindXML`, `ShouldBindQuery`, `ShouldBindYAML`, `ShouldBindHeader`
+ - **Behavior** - These methods use `ShouldBindWith` under the hood. If there is a binding error, the error is returned and it is the developer's responsibility to handle the request and error appropriately.
+
+When using the Bind-method, Gin tries to infer the binder depending on the Content-Type header. If you are sure what you are binding, you can use `MustBindWith` or `ShouldBindWith`.
+
+You can also specify that specific fields are required. If a field is decorated with `binding:"required"` and has a empty value when binding, an error will be returned.
+
+```go
+// Binding from JSON
+type Login struct {
+ User string `form:"user" json:"user" xml:"user" binding:"required"`
+ Password string `form:"password" json:"password" xml:"password" binding:"required"`
+}
+
+func main() {
+ router := gin.Default()
+
+ // Example for binding JSON ({"user": "manu", "password": "123"})
+ router.POST("/loginJSON", func(c *gin.Context) {
+ var json Login
+ if err := c.ShouldBindJSON(&json); err != nil {
+ c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
+ return
+ }
+
+ if json.User != "manu" || json.Password != "123" {
+ c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"})
+ return
+ }
+
+ c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
+ })
+
+ // Example for binding XML (
+ //
+ //
Using posts/index.tmpl
+ +{{ end }} +``` + +templates/users/index.tmpl + +```html +{{ define "users/index.tmpl" }} +Using users/index.tmpl
+ +{{ end }} +``` + +#### Custom Template renderer + +You can also use your own html template render + +```go +import "html/template" + +func main() { + router := gin.Default() + html := template.Must(template.ParseFiles("file1", "file2")) + router.SetHTMLTemplate(html) + router.Run(":8080") +} +``` + +#### Custom Delimiters + +You may use custom delims + +```go + r := gin.Default() + r.Delims("{[{", "}]}") + r.LoadHTMLGlob("/path/to/templates") +``` + +#### Custom Template Funcs + +See the detail [example code](https://github.com/gin-gonic/examples/tree/master/template). + +main.go + +```go +import ( + "fmt" + "html/template" + "net/http" + "time" + + "github.com/gin-gonic/gin" +) + +func formatAsDate(t time.Time) string { + year, month, day := t.Date() + return fmt.Sprintf("%d%02d/%02d", year, month, day) +} + +func main() { + router := gin.Default() + router.Delims("{[{", "}]}") + router.SetFuncMap(template.FuncMap{ + "formatAsDate": formatAsDate, + }) + router.LoadHTMLFiles("./testdata/template/raw.tmpl") + + router.GET("/raw", func(c *gin.Context) { + c.HTML(http.StatusOK, "raw.tmpl", gin.H{ + "now": time.Date(2017, 07, 01, 0, 0, 0, 0, time.UTC), + }) + }) + + router.Run(":8080") +} + +``` + +raw.tmpl + +```html +Date: {[{.now | formatAsDate}]} +``` + +Result: +``` +Date: 2017/07/01 +``` + +### Multitemplate + +Gin allow by default use only one html.Template. Check [a multitemplate render](https://github.com/gin-contrib/multitemplate) for using features like go 1.6 `block template`. + +### Redirects + +Issuing a HTTP redirect is easy. Both internal and external locations are supported. + +```go +r.GET("/test", func(c *gin.Context) { + c.Redirect(http.StatusMovedPermanently, "http://www.google.com/") +}) +``` + +Issuing a HTTP redirect from POST. Refer to issue: [#444](https://github.com/gin-gonic/gin/issues/444) +```go +r.POST("/test", func(c *gin.Context) { + c.Redirect(http.StatusFound, "/foo") +}) +``` + +Issuing a Router redirect, use `HandleContext` like below. + +``` go +r.GET("/test", func(c *gin.Context) { + c.Request.URL.Path = "/test2" + r.HandleContext(c) +}) +r.GET("/test2", func(c *gin.Context) { + c.JSON(200, gin.H{"hello": "world"}) +}) +``` + + +### Custom Middleware + +```go +func Logger() gin.HandlerFunc { + return func(c *gin.Context) { + t := time.Now() + + // Set example variable + c.Set("example", "12345") + + // before request + + c.Next() + + // after request + latency := time.Since(t) + log.Print(latency) + + // access the status we are sending + status := c.Writer.Status() + log.Println(status) + } +} + +func main() { + r := gin.New() + r.Use(Logger()) + + r.GET("/test", func(c *gin.Context) { + example := c.MustGet("example").(string) + + // it would print: "12345" + log.Println(example) + }) + + // Listen and serve on 0.0.0.0:8080 + r.Run(":8080") +} +``` + +### Using BasicAuth() middleware + +```go +// simulate some private data +var secrets = gin.H{ + "foo": gin.H{"email": "foo@bar.com", "phone": "123433"}, + "austin": gin.H{"email": "austin@example.com", "phone": "666"}, + "lena": gin.H{"email": "lena@guapa.com", "phone": "523443"}, +} + +func main() { + r := gin.Default() + + // Group using gin.BasicAuth() middleware + // gin.Accounts is a shortcut for map[string]string + authorized := r.Group("/admin", gin.BasicAuth(gin.Accounts{ + "foo": "bar", + "austin": "1234", + "lena": "hello2", + "manu": "4321", + })) + + // /admin/secrets endpoint + // hit "localhost:8080/admin/secrets + authorized.GET("/secrets", func(c *gin.Context) { + // get user, it was set by the BasicAuth middleware + user := c.MustGet(gin.AuthUserKey).(string) + if secret, ok := secrets[user]; ok { + c.JSON(http.StatusOK, gin.H{"user": user, "secret": secret}) + } else { + c.JSON(http.StatusOK, gin.H{"user": user, "secret": "NO SECRET :("}) + } + }) + + // Listen and serve on 0.0.0.0:8080 + r.Run(":8080") +} +``` + +### Goroutines inside a middleware + +When starting new Goroutines inside a middleware or handler, you **SHOULD NOT** use the original context inside it, you have to use a read-only copy. + +```go +func main() { + r := gin.Default() + + r.GET("/long_async", func(c *gin.Context) { + // create copy to be used inside the goroutine + cCp := c.Copy() + go func() { + // simulate a long task with time.Sleep(). 5 seconds + time.Sleep(5 * time.Second) + + // note that you are using the copied context "cCp", IMPORTANT + log.Println("Done! in path " + cCp.Request.URL.Path) + }() + }) + + r.GET("/long_sync", func(c *gin.Context) { + // simulate a long task with time.Sleep(). 5 seconds + time.Sleep(5 * time.Second) + + // since we are NOT using a goroutine, we do not have to copy the context + log.Println("Done! in path " + c.Request.URL.Path) + }) + + // Listen and serve on 0.0.0.0:8080 + r.Run(":8080") +} +``` + +### Custom HTTP configuration + +Use `http.ListenAndServe()` directly, like this: + +```go +func main() { + router := gin.Default() + http.ListenAndServe(":8080", router) +} +``` +or + +```go +func main() { + router := gin.Default() + + s := &http.Server{ + Addr: ":8080", + Handler: router, + ReadTimeout: 10 * time.Second, + WriteTimeout: 10 * time.Second, + MaxHeaderBytes: 1 << 20, + } + s.ListenAndServe() +} +``` + +### Support Let's Encrypt + +example for 1-line LetsEncrypt HTTPS servers. + +```go +package main + +import ( + "log" + + "github.com/gin-gonic/autotls" + "github.com/gin-gonic/gin" +) + +func main() { + r := gin.Default() + + // Ping handler + r.GET("/ping", func(c *gin.Context) { + c.String(200, "pong") + }) + + log.Fatal(autotls.Run(r, "example1.com", "example2.com")) +} +``` + +example for custom autocert manager. + +```go +package main + +import ( + "log" + + "github.com/gin-gonic/autotls" + "github.com/gin-gonic/gin" + "golang.org/x/crypto/acme/autocert" +) + +func main() { + r := gin.Default() + + // Ping handler + r.GET("/ping", func(c *gin.Context) { + c.String(200, "pong") + }) + + m := autocert.Manager{ + Prompt: autocert.AcceptTOS, + HostPolicy: autocert.HostWhitelist("example1.com", "example2.com"), + Cache: autocert.DirCache("/var/www/.cache"), + } + + log.Fatal(autotls.RunWithManager(r, &m)) +} +``` + +### Run multiple service using Gin + +See the [question](https://github.com/gin-gonic/gin/issues/346) and try the following example: + +```go +package main + +import ( + "log" + "net/http" + "time" + + "github.com/gin-gonic/gin" + "golang.org/x/sync/errgroup" +) + +var ( + g errgroup.Group +) + +func router01() http.Handler { + e := gin.New() + e.Use(gin.Recovery()) + e.GET("/", func(c *gin.Context) { + c.JSON( + http.StatusOK, + gin.H{ + "code": http.StatusOK, + "error": "Welcome server 01", + }, + ) + }) + + return e +} + +func router02() http.Handler { + e := gin.New() + e.Use(gin.Recovery()) + e.GET("/", func(c *gin.Context) { + c.JSON( + http.StatusOK, + gin.H{ + "code": http.StatusOK, + "error": "Welcome server 02", + }, + ) + }) + + return e +} + +func main() { + server01 := &http.Server{ + Addr: ":8080", + Handler: router01(), + ReadTimeout: 5 * time.Second, + WriteTimeout: 10 * time.Second, + } + + server02 := &http.Server{ + Addr: ":8081", + Handler: router02(), + ReadTimeout: 5 * time.Second, + WriteTimeout: 10 * time.Second, + } + + g.Go(func() error { + err := server01.ListenAndServe() + if err != nil && err != http.ErrServerClosed { + log.Fatal(err) + } + return err + }) + + g.Go(func() error { + err := server02.ListenAndServe() + if err != nil && err != http.ErrServerClosed { + log.Fatal(err) + } + return err + }) + + if err := g.Wait(); err != nil { + log.Fatal(err) + } +} +``` + +### Graceful shutdown or restart + +There are a few approaches you can use to perform a graceful shutdown or restart. You can make use of third-party packages specifically built for that, or you can manually do the same with the functions and methods from the built-in packages. + +#### Third-party packages + +We can use [fvbock/endless](https://github.com/fvbock/endless) to replace the default `ListenAndServe`. Refer to issue [#296](https://github.com/gin-gonic/gin/issues/296) for more details. + +```go +router := gin.Default() +router.GET("/", handler) +// [...] +endless.ListenAndServe(":4242", router) +``` + +Alternatives: + +* [manners](https://github.com/braintree/manners): A polite Go HTTP server that shuts down gracefully. +* [graceful](https://github.com/tylerb/graceful): Graceful is a Go package enabling graceful shutdown of an http.Handler server. +* [grace](https://github.com/facebookgo/grace): Graceful restart & zero downtime deploy for Go servers. + +#### Manually + +In case you are using Go 1.8 or a later version, you may not need to use those libraries. Consider using `http.Server`'s built-in [Shutdown()](https://golang.org/pkg/net/http/#Server.Shutdown) method for graceful shutdowns. The example below describes its usage, and we've got more examples using gin [here](https://github.com/gin-gonic/examples/tree/master/graceful-shutdown). + +```go +// +build go1.8 + +package main + +import ( + "context" + "log" + "net/http" + "os" + "os/signal" + "syscall" + "time" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + router.GET("/", func(c *gin.Context) { + time.Sleep(5 * time.Second) + c.String(http.StatusOK, "Welcome Gin Server") + }) + + srv := &http.Server{ + Addr: ":8080", + Handler: router, + } + + // Initializing the server in a goroutine so that + // it won't block the graceful shutdown handling below + go func() { + if err := srv.ListenAndServe(); err != nil && errors.Is(err, http.ErrServerClosed) { + log.Printf("listen: %s\n", err) + } + }() + + // Wait for interrupt signal to gracefully shutdown the server with + // a timeout of 5 seconds. + quit := make(chan os.Signal) + // kill (no param) default send syscall.SIGTERM + // kill -2 is syscall.SIGINT + // kill -9 is syscall.SIGKILL but can't be catch, so don't need add it + signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) + <-quit + log.Println("Shutting down server...") + + // The context is used to inform the server it has 5 seconds to finish + // the request it is currently handling + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + if err := srv.Shutdown(ctx); err != nil { + log.Fatal("Server forced to shutdown:", err) + } + + log.Println("Server exiting") +} +``` + +### Build a single binary with templates + +You can build a server into a single binary containing templates by using [go-assets][]. + +[go-assets]: https://github.com/jessevdk/go-assets + +```go +func main() { + r := gin.New() + + t, err := loadTemplate() + if err != nil { + panic(err) + } + r.SetHTMLTemplate(t) + + r.GET("/", func(c *gin.Context) { + c.HTML(http.StatusOK, "/html/index.tmpl",nil) + }) + r.Run(":8080") +} + +// loadTemplate loads templates embedded by go-assets-builder +func loadTemplate() (*template.Template, error) { + t := template.New("") + for name, file := range Assets.Files { + defer file.Close() + if file.IsDir() || !strings.HasSuffix(name, ".tmpl") { + continue + } + h, err := ioutil.ReadAll(file) + if err != nil { + return nil, err + } + t, err = t.New(name).Parse(string(h)) + if err != nil { + return nil, err + } + } + return t, nil +} +``` + +See a complete example in the `https://github.com/gin-gonic/examples/tree/master/assets-in-binary` directory. + +### Bind form-data request with custom struct + +The follow example using custom struct: + +```go +type StructA struct { + FieldA string `form:"field_a"` +} + +type StructB struct { + NestedStruct StructA + FieldB string `form:"field_b"` +} + +type StructC struct { + NestedStructPointer *StructA + FieldC string `form:"field_c"` +} + +type StructD struct { + NestedAnonyStruct struct { + FieldX string `form:"field_x"` + } + FieldD string `form:"field_d"` +} + +func GetDataB(c *gin.Context) { + var b StructB + c.Bind(&b) + c.JSON(200, gin.H{ + "a": b.NestedStruct, + "b": b.FieldB, + }) +} + +func GetDataC(c *gin.Context) { + var b StructC + c.Bind(&b) + c.JSON(200, gin.H{ + "a": b.NestedStructPointer, + "c": b.FieldC, + }) +} + +func GetDataD(c *gin.Context) { + var b StructD + c.Bind(&b) + c.JSON(200, gin.H{ + "x": b.NestedAnonyStruct, + "d": b.FieldD, + }) +} + +func main() { + r := gin.Default() + r.GET("/getb", GetDataB) + r.GET("/getc", GetDataC) + r.GET("/getd", GetDataD) + + r.Run() +} +``` + +Using the command `curl` command result: + +``` +$ curl "http://localhost:8080/getb?field_a=hello&field_b=world" +{"a":{"FieldA":"hello"},"b":"world"} +$ curl "http://localhost:8080/getc?field_a=hello&field_c=world" +{"a":{"FieldA":"hello"},"c":"world"} +$ curl "http://localhost:8080/getd?field_x=hello&field_d=world" +{"d":"world","x":{"FieldX":"hello"}} +``` + +### Try to bind body into different structs + +The normal methods for binding request body consumes `c.Request.Body` and they +cannot be called multiple times. + +```go +type formA struct { + Foo string `json:"foo" xml:"foo" binding:"required"` +} + +type formB struct { + Bar string `json:"bar" xml:"bar" binding:"required"` +} + +func SomeHandler(c *gin.Context) { + objA := formA{} + objB := formB{} + // This c.ShouldBind consumes c.Request.Body and it cannot be reused. + if errA := c.ShouldBind(&objA); errA == nil { + c.String(http.StatusOK, `the body should be formA`) + // Always an error is occurred by this because c.Request.Body is EOF now. + } else if errB := c.ShouldBind(&objB); errB == nil { + c.String(http.StatusOK, `the body should be formB`) + } else { + ... + } +} +``` + +For this, you can use `c.ShouldBindBodyWith`. + +```go +func SomeHandler(c *gin.Context) { + objA := formA{} + objB := formB{} + // This reads c.Request.Body and stores the result into the context. + if errA := c.ShouldBindBodyWith(&objA, binding.JSON); errA == nil { + c.String(http.StatusOK, `the body should be formA`) + // At this time, it reuses body stored in the context. + } else if errB := c.ShouldBindBodyWith(&objB, binding.JSON); errB == nil { + c.String(http.StatusOK, `the body should be formB JSON`) + // And it can accepts other formats + } else if errB2 := c.ShouldBindBodyWith(&objB, binding.XML); errB2 == nil { + c.String(http.StatusOK, `the body should be formB XML`) + } else { + ... + } +} +``` + +* `c.ShouldBindBodyWith` stores body into the context before binding. This has +a slight impact to performance, so you should not use this method if you are +enough to call binding at once. +* This feature is only needed for some formats -- `JSON`, `XML`, `MsgPack`, +`ProtoBuf`. For other formats, `Query`, `Form`, `FormPost`, `FormMultipart`, +can be called by `c.ShouldBind()` multiple times without any damage to +performance (See [#1341](https://github.com/gin-gonic/gin/pull/1341)). + +### http2 server push + +http.Pusher is supported only **go1.8+**. See the [golang blog](https://blog.golang.org/h2push) for detail information. + +```go +package main + +import ( + "html/template" + "log" + + "github.com/gin-gonic/gin" +) + +var html = template.Must(template.New("https").Parse(` + + +^J3SC{O=CWxCY&tzN _e77nA1hADi`t7&u!?%Zj`)z6KO9|{!E|=v5 @f{vaML=$U9%U8o5M@M-iZal%
zBN^G5t}
}%
zzVo%_9w8BSG>juMktjF{u22BBu8OA$$^t=?P~-FYjP8DGM9kyFd_t*If+lmos_vKh
zcy1F3B0pgjNM)ibC~K=ZgqSbm%k&n#$xBA+rS-7;L}NWVG7c!9u%gO#mI!9+)X`BL
ztxI`yOgW^}v5=#$fQuONx!;(Ih{YDu>o2@yfu@Ev4vb2#*4xizdX^%)ETV1Nvd5URB1~u=
6glYr2S*)gb
z^9Ehqju71?)@5)}Btw#%#!)6nZcY(!KRD?GZ)~^gd7CUxwP;W-tO|m(QahFo+olkj
zGCI{=!nt%aBP6MsCK+r;c+dY7jhqT*g{sf9OXjP)LzZMNrU?AmOok{)4T)@`fHPF8
zYV+0-+aby<#Lh|0C>BfQ0=-t0E