planetscale 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/workflows/ci.yml +24 -0
- data/.github/workflows/gem-push.yml +38 -0
- data/.github/workflows/licensed.yml +43 -0
- data/.gitignore +10 -0
- data/.licensed.yml +9 -0
- data/.licenses/go/github.com/armon/circbuf.dep.yml +31 -0
- data/.licenses/go/github.com/gorilla/mux.dep.yml +41 -0
- data/.licenses/go/github.com/hashicorp/go-cleanhttp.dep.yml +375 -0
- data/.licenses/go/github.com/mitchellh/go-homedir.dep.yml +32 -0
- data/.licenses/go/github.com/pkg/errors.dep.yml +36 -0
- data/.licenses/go/github.com/planetscale/planetscale-go/planetscale.dep.yml +160 -0
- data/.licenses/go/github.com/planetscale/sql-proxy/proxy.dep.yml +180 -0
- data/.licenses/go/go.uber.org/atomic.dep.yml +31 -0
- data/.licenses/go/go.uber.org/multierr.dep.yml +30 -0
- data/.licenses/go/go.uber.org/zap.dep.yml +30 -0
- data/.licenses/go/go.uber.org/zap/buffer.dep.yml +30 -0
- data/.licenses/go/go.uber.org/zap/internal/bufferpool.dep.yml +30 -0
- data/.licenses/go/go.uber.org/zap/internal/color.dep.yml +30 -0
- data/.licenses/go/go.uber.org/zap/internal/exit.dep.yml +31 -0
- data/.licenses/go/go.uber.org/zap/zapcore.dep.yml +31 -0
- data/.licenses/go/golang.org/x/net/context/ctxhttp.dep.yml +63 -0
- data/.licenses/go/golang.org/x/oauth2.dep.yml +44 -0
- data/.licenses/go/golang.org/x/oauth2/internal.dep.yml +38 -0
- data/.ruby_version +1 -0
- data/Gemfile +8 -0
- data/LICENSE +201 -0
- data/README.md +88 -0
- data/Rakefile +10 -0
- data/bin/console +15 -0
- data/bin/setup +17 -0
- data/controller.go +255 -0
- data/go.mod +16 -0
- data/go.sum +428 -0
- data/lib/generators/planetscale/install_generator.rb +58 -0
- data/lib/planetscale.rb +137 -0
- data/lib/planetscale/version.rb +5 -0
- data/planetscale.gemspec +44 -0
- data/proxy.go +128 -0
- data/vendor/github.com/armon/circbuf/.gitignore +22 -0
- data/vendor/github.com/armon/circbuf/LICENSE +20 -0
- data/vendor/github.com/armon/circbuf/README.md +28 -0
- data/vendor/github.com/armon/circbuf/circbuf.go +92 -0
- data/vendor/github.com/armon/circbuf/go.mod +1 -0
- data/vendor/github.com/golang/protobuf/AUTHORS +3 -0
- data/vendor/github.com/golang/protobuf/CONTRIBUTORS +3 -0
- data/vendor/github.com/golang/protobuf/LICENSE +28 -0
- data/vendor/github.com/golang/protobuf/proto/buffer.go +324 -0
- data/vendor/github.com/golang/protobuf/proto/defaults.go +63 -0
- data/vendor/github.com/golang/protobuf/proto/deprecated.go +113 -0
- data/vendor/github.com/golang/protobuf/proto/discard.go +58 -0
- data/vendor/github.com/golang/protobuf/proto/extensions.go +356 -0
- data/vendor/github.com/golang/protobuf/proto/properties.go +306 -0
- data/vendor/github.com/golang/protobuf/proto/proto.go +167 -0
- data/vendor/github.com/golang/protobuf/proto/registry.go +317 -0
- data/vendor/github.com/golang/protobuf/proto/text_decode.go +801 -0
- data/vendor/github.com/golang/protobuf/proto/text_encode.go +560 -0
- data/vendor/github.com/golang/protobuf/proto/wire.go +78 -0
- data/vendor/github.com/golang/protobuf/proto/wrappers.go +34 -0
- data/vendor/github.com/gorilla/mux/AUTHORS +8 -0
- data/vendor/github.com/gorilla/mux/LICENSE +27 -0
- data/vendor/github.com/gorilla/mux/README.md +805 -0
- data/vendor/github.com/gorilla/mux/doc.go +306 -0
- data/vendor/github.com/gorilla/mux/go.mod +3 -0
- data/vendor/github.com/gorilla/mux/middleware.go +74 -0
- data/vendor/github.com/gorilla/mux/mux.go +606 -0
- data/vendor/github.com/gorilla/mux/regexp.go +388 -0
- data/vendor/github.com/gorilla/mux/route.go +736 -0
- data/vendor/github.com/gorilla/mux/test_helpers.go +19 -0
- data/vendor/github.com/hashicorp/go-cleanhttp/LICENSE +363 -0
- data/vendor/github.com/hashicorp/go-cleanhttp/README.md +30 -0
- data/vendor/github.com/hashicorp/go-cleanhttp/cleanhttp.go +58 -0
- data/vendor/github.com/hashicorp/go-cleanhttp/doc.go +20 -0
- data/vendor/github.com/hashicorp/go-cleanhttp/go.mod +3 -0
- data/vendor/github.com/hashicorp/go-cleanhttp/handlers.go +48 -0
- data/vendor/github.com/mitchellh/go-homedir/LICENSE +21 -0
- data/vendor/github.com/mitchellh/go-homedir/README.md +14 -0
- data/vendor/github.com/mitchellh/go-homedir/go.mod +1 -0
- data/vendor/github.com/mitchellh/go-homedir/homedir.go +167 -0
- data/vendor/github.com/pkg/errors/.gitignore +24 -0
- data/vendor/github.com/pkg/errors/.travis.yml +10 -0
- data/vendor/github.com/pkg/errors/LICENSE +23 -0
- data/vendor/github.com/pkg/errors/Makefile +44 -0
- data/vendor/github.com/pkg/errors/README.md +59 -0
- data/vendor/github.com/pkg/errors/appveyor.yml +32 -0
- data/vendor/github.com/pkg/errors/errors.go +288 -0
- data/vendor/github.com/pkg/errors/go113.go +38 -0
- data/vendor/github.com/pkg/errors/stack.go +177 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/backups.go +139 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/branches.go +258 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/certs.go +142 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/client.go +305 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/databases.go +131 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/deploy_requests.go +368 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/organizations.go +78 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/service_tokens.go +163 -0
- data/vendor/github.com/planetscale/sql-proxy/proxy/client.go +467 -0
- data/vendor/github.com/planetscale/sql-proxy/proxy/tls_cache.go +73 -0
- data/vendor/go.uber.org/atomic/.codecov.yml +19 -0
- data/vendor/go.uber.org/atomic/.gitignore +12 -0
- data/vendor/go.uber.org/atomic/.travis.yml +27 -0
- data/vendor/go.uber.org/atomic/CHANGELOG.md +76 -0
- data/vendor/go.uber.org/atomic/LICENSE.txt +19 -0
- data/vendor/go.uber.org/atomic/Makefile +78 -0
- data/vendor/go.uber.org/atomic/README.md +63 -0
- data/vendor/go.uber.org/atomic/bool.go +81 -0
- data/vendor/go.uber.org/atomic/bool_ext.go +53 -0
- data/vendor/go.uber.org/atomic/doc.go +23 -0
- data/vendor/go.uber.org/atomic/duration.go +82 -0
- data/vendor/go.uber.org/atomic/duration_ext.go +40 -0
- data/vendor/go.uber.org/atomic/error.go +51 -0
- data/vendor/go.uber.org/atomic/error_ext.go +39 -0
- data/vendor/go.uber.org/atomic/float64.go +76 -0
- data/vendor/go.uber.org/atomic/float64_ext.go +47 -0
- data/vendor/go.uber.org/atomic/gen.go +26 -0
- data/vendor/go.uber.org/atomic/go.mod +8 -0
- data/vendor/go.uber.org/atomic/go.sum +9 -0
- data/vendor/go.uber.org/atomic/int32.go +102 -0
- data/vendor/go.uber.org/atomic/int64.go +102 -0
- data/vendor/go.uber.org/atomic/nocmp.go +35 -0
- data/vendor/go.uber.org/atomic/string.go +54 -0
- data/vendor/go.uber.org/atomic/string_ext.go +43 -0
- data/vendor/go.uber.org/atomic/uint32.go +102 -0
- data/vendor/go.uber.org/atomic/uint64.go +102 -0
- data/vendor/go.uber.org/atomic/value.go +31 -0
- data/vendor/go.uber.org/multierr/.codecov.yml +15 -0
- data/vendor/go.uber.org/multierr/.gitignore +4 -0
- data/vendor/go.uber.org/multierr/.travis.yml +23 -0
- data/vendor/go.uber.org/multierr/CHANGELOG.md +60 -0
- data/vendor/go.uber.org/multierr/LICENSE.txt +19 -0
- data/vendor/go.uber.org/multierr/Makefile +42 -0
- data/vendor/go.uber.org/multierr/README.md +23 -0
- data/vendor/go.uber.org/multierr/error.go +449 -0
- data/vendor/go.uber.org/multierr/glide.yaml +8 -0
- data/vendor/go.uber.org/multierr/go.mod +8 -0
- data/vendor/go.uber.org/multierr/go.sum +11 -0
- data/vendor/go.uber.org/multierr/go113.go +52 -0
- data/vendor/go.uber.org/zap/.codecov.yml +17 -0
- data/vendor/go.uber.org/zap/.gitignore +32 -0
- data/vendor/go.uber.org/zap/.readme.tmpl +109 -0
- data/vendor/go.uber.org/zap/.travis.yml +23 -0
- data/vendor/go.uber.org/zap/CHANGELOG.md +432 -0
- data/vendor/go.uber.org/zap/CODE_OF_CONDUCT.md +75 -0
- data/vendor/go.uber.org/zap/CONTRIBUTING.md +81 -0
- data/vendor/go.uber.org/zap/FAQ.md +156 -0
- data/vendor/go.uber.org/zap/LICENSE.txt +19 -0
- data/vendor/go.uber.org/zap/Makefile +63 -0
- data/vendor/go.uber.org/zap/README.md +134 -0
- data/vendor/go.uber.org/zap/array.go +320 -0
- data/vendor/go.uber.org/zap/buffer/buffer.go +123 -0
- data/vendor/go.uber.org/zap/buffer/pool.go +49 -0
- data/vendor/go.uber.org/zap/checklicense.sh +17 -0
- data/vendor/go.uber.org/zap/config.go +264 -0
- data/vendor/go.uber.org/zap/doc.go +113 -0
- data/vendor/go.uber.org/zap/encoder.go +79 -0
- data/vendor/go.uber.org/zap/error.go +80 -0
- data/vendor/go.uber.org/zap/field.go +539 -0
- data/vendor/go.uber.org/zap/flag.go +39 -0
- data/vendor/go.uber.org/zap/glide.yaml +34 -0
- data/vendor/go.uber.org/zap/global.go +168 -0
- data/vendor/go.uber.org/zap/global_go112.go +26 -0
- data/vendor/go.uber.org/zap/global_prego112.go +26 -0
- data/vendor/go.uber.org/zap/go.mod +13 -0
- data/vendor/go.uber.org/zap/go.sum +56 -0
- data/vendor/go.uber.org/zap/http_handler.go +81 -0
- data/vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go +31 -0
- data/vendor/go.uber.org/zap/internal/color/color.go +44 -0
- data/vendor/go.uber.org/zap/internal/exit/exit.go +64 -0
- data/vendor/go.uber.org/zap/level.go +132 -0
- data/vendor/go.uber.org/zap/logger.go +344 -0
- data/vendor/go.uber.org/zap/options.go +140 -0
- data/vendor/go.uber.org/zap/sink.go +161 -0
- data/vendor/go.uber.org/zap/stacktrace.go +85 -0
- data/vendor/go.uber.org/zap/sugar.go +304 -0
- data/vendor/go.uber.org/zap/time.go +27 -0
- data/vendor/go.uber.org/zap/writer.go +99 -0
- data/vendor/go.uber.org/zap/zapcore/console_encoder.go +161 -0
- data/vendor/go.uber.org/zap/zapcore/core.go +113 -0
- data/vendor/go.uber.org/zap/zapcore/doc.go +24 -0
- data/vendor/go.uber.org/zap/zapcore/encoder.go +443 -0
- data/vendor/go.uber.org/zap/zapcore/entry.go +264 -0
- data/vendor/go.uber.org/zap/zapcore/error.go +115 -0
- data/vendor/go.uber.org/zap/zapcore/field.go +227 -0
- data/vendor/go.uber.org/zap/zapcore/hook.go +68 -0
- data/vendor/go.uber.org/zap/zapcore/increase_level.go +66 -0
- data/vendor/go.uber.org/zap/zapcore/json_encoder.go +534 -0
- data/vendor/go.uber.org/zap/zapcore/level.go +175 -0
- data/vendor/go.uber.org/zap/zapcore/level_strings.go +46 -0
- data/vendor/go.uber.org/zap/zapcore/marshaler.go +61 -0
- data/vendor/go.uber.org/zap/zapcore/memory_encoder.go +179 -0
- data/vendor/go.uber.org/zap/zapcore/sampler.go +208 -0
- data/vendor/go.uber.org/zap/zapcore/tee.go +81 -0
- data/vendor/go.uber.org/zap/zapcore/write_syncer.go +123 -0
- data/vendor/golang.org/x/net/AUTHORS +3 -0
- data/vendor/golang.org/x/net/CONTRIBUTORS +3 -0
- data/vendor/golang.org/x/net/LICENSE +27 -0
- data/vendor/golang.org/x/net/PATENTS +22 -0
- data/vendor/golang.org/x/net/context/context.go +56 -0
- data/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go +71 -0
- data/vendor/golang.org/x/net/context/go17.go +73 -0
- data/vendor/golang.org/x/net/context/go19.go +21 -0
- data/vendor/golang.org/x/net/context/pre_go17.go +301 -0
- data/vendor/golang.org/x/net/context/pre_go19.go +110 -0
- data/vendor/golang.org/x/oauth2/.travis.yml +13 -0
- data/vendor/golang.org/x/oauth2/AUTHORS +3 -0
- data/vendor/golang.org/x/oauth2/CONTRIBUTING.md +26 -0
- data/vendor/golang.org/x/oauth2/CONTRIBUTORS +3 -0
- data/vendor/golang.org/x/oauth2/LICENSE +27 -0
- data/vendor/golang.org/x/oauth2/README.md +36 -0
- data/vendor/golang.org/x/oauth2/go.mod +9 -0
- data/vendor/golang.org/x/oauth2/go.sum +361 -0
- data/vendor/golang.org/x/oauth2/internal/client_appengine.go +14 -0
- data/vendor/golang.org/x/oauth2/internal/doc.go +6 -0
- data/vendor/golang.org/x/oauth2/internal/oauth2.go +37 -0
- data/vendor/golang.org/x/oauth2/internal/token.go +294 -0
- data/vendor/golang.org/x/oauth2/internal/transport.go +33 -0
- data/vendor/golang.org/x/oauth2/oauth2.go +381 -0
- data/vendor/golang.org/x/oauth2/token.go +178 -0
- data/vendor/golang.org/x/oauth2/transport.go +89 -0
- data/vendor/google.golang.org/appengine/LICENSE +202 -0
- data/vendor/google.golang.org/appengine/internal/api.go +678 -0
- data/vendor/google.golang.org/appengine/internal/api_classic.go +169 -0
- data/vendor/google.golang.org/appengine/internal/api_common.go +123 -0
- data/vendor/google.golang.org/appengine/internal/app_id.go +28 -0
- data/vendor/google.golang.org/appengine/internal/base/api_base.pb.go +308 -0
- data/vendor/google.golang.org/appengine/internal/base/api_base.proto +33 -0
- data/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go +4367 -0
- data/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto +551 -0
- data/vendor/google.golang.org/appengine/internal/identity.go +55 -0
- data/vendor/google.golang.org/appengine/internal/identity_classic.go +61 -0
- data/vendor/google.golang.org/appengine/internal/identity_flex.go +11 -0
- data/vendor/google.golang.org/appengine/internal/identity_vm.go +134 -0
- data/vendor/google.golang.org/appengine/internal/internal.go +110 -0
- data/vendor/google.golang.org/appengine/internal/log/log_service.pb.go +1313 -0
- data/vendor/google.golang.org/appengine/internal/log/log_service.proto +150 -0
- data/vendor/google.golang.org/appengine/internal/main.go +16 -0
- data/vendor/google.golang.org/appengine/internal/main_common.go +7 -0
- data/vendor/google.golang.org/appengine/internal/main_vm.go +69 -0
- data/vendor/google.golang.org/appengine/internal/metadata.go +60 -0
- data/vendor/google.golang.org/appengine/internal/net.go +56 -0
- data/vendor/google.golang.org/appengine/internal/regen.sh +40 -0
- data/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go +361 -0
- data/vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto +44 -0
- data/vendor/google.golang.org/appengine/internal/transaction.go +115 -0
- data/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go +527 -0
- data/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto +64 -0
- data/vendor/google.golang.org/appengine/urlfetch/urlfetch.go +210 -0
- data/vendor/google.golang.org/protobuf/AUTHORS +3 -0
- data/vendor/google.golang.org/protobuf/CONTRIBUTORS +3 -0
- data/vendor/google.golang.org/protobuf/LICENSE +27 -0
- data/vendor/google.golang.org/protobuf/PATENTS +22 -0
- data/vendor/google.golang.org/protobuf/encoding/prototext/decode.go +773 -0
- data/vendor/google.golang.org/protobuf/encoding/prototext/doc.go +7 -0
- data/vendor/google.golang.org/protobuf/encoding/prototext/encode.go +371 -0
- data/vendor/google.golang.org/protobuf/encoding/protowire/wire.go +538 -0
- data/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go +318 -0
- data/vendor/google.golang.org/protobuf/internal/descopts/options.go +29 -0
- data/vendor/google.golang.org/protobuf/internal/detrand/rand.go +69 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/defval/default.go +213 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go +241 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go +207 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go +665 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go +190 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/text/decode_string.go +161 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/text/decode_token.go +373 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/text/doc.go +29 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/text/encode.go +265 -0
- data/vendor/google.golang.org/protobuf/internal/errors/errors.go +89 -0
- data/vendor/google.golang.org/protobuf/internal/errors/is_go112.go +39 -0
- data/vendor/google.golang.org/protobuf/internal/errors/is_go113.go +12 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/build.go +158 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/desc.go +631 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go +471 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go +704 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go +450 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/desc_list_gen.go +356 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go +107 -0
- data/vendor/google.golang.org/protobuf/internal/filetype/build.go +297 -0
- data/vendor/google.golang.org/protobuf/internal/flags/flags.go +24 -0
- data/vendor/google.golang.org/protobuf/internal/flags/proto_legacy_disable.go +9 -0
- data/vendor/google.golang.org/protobuf/internal/flags/proto_legacy_enable.go +9 -0
- data/vendor/google.golang.org/protobuf/internal/genid/any_gen.go +34 -0
- data/vendor/google.golang.org/protobuf/internal/genid/api_gen.go +106 -0
- data/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go +829 -0
- data/vendor/google.golang.org/protobuf/internal/genid/doc.go +11 -0
- data/vendor/google.golang.org/protobuf/internal/genid/duration_gen.go +34 -0
- data/vendor/google.golang.org/protobuf/internal/genid/empty_gen.go +19 -0
- data/vendor/google.golang.org/protobuf/internal/genid/field_mask_gen.go +31 -0
- data/vendor/google.golang.org/protobuf/internal/genid/goname.go +25 -0
- data/vendor/google.golang.org/protobuf/internal/genid/map_entry.go +16 -0
- data/vendor/google.golang.org/protobuf/internal/genid/source_context_gen.go +31 -0
- data/vendor/google.golang.org/protobuf/internal/genid/struct_gen.go +116 -0
- data/vendor/google.golang.org/protobuf/internal/genid/timestamp_gen.go +34 -0
- data/vendor/google.golang.org/protobuf/internal/genid/type_gen.go +184 -0
- data/vendor/google.golang.org/protobuf/internal/genid/wrappers.go +13 -0
- data/vendor/google.golang.org/protobuf/internal/genid/wrappers_gen.go +175 -0
- data/vendor/google.golang.org/protobuf/internal/impl/api_export.go +177 -0
- data/vendor/google.golang.org/protobuf/internal/impl/checkinit.go +141 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_extension.go +223 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_field.go +830 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_gen.go +5637 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_map.go +388 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_map_go111.go +37 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_map_go112.go +11 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_message.go +217 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_messageset.go +123 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_reflect.go +209 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_tables.go +557 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_unsafe.go +17 -0
- data/vendor/google.golang.org/protobuf/internal/impl/convert.go +496 -0
- data/vendor/google.golang.org/protobuf/internal/impl/convert_list.go +141 -0
- data/vendor/google.golang.org/protobuf/internal/impl/convert_map.go +121 -0
- data/vendor/google.golang.org/protobuf/internal/impl/decode.go +276 -0
- data/vendor/google.golang.org/protobuf/internal/impl/encode.go +201 -0
- data/vendor/google.golang.org/protobuf/internal/impl/enum.go +21 -0
- data/vendor/google.golang.org/protobuf/internal/impl/extension.go +156 -0
- data/vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go +219 -0
- data/vendor/google.golang.org/protobuf/internal/impl/legacy_export.go +92 -0
- data/vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go +176 -0
- data/vendor/google.golang.org/protobuf/internal/impl/legacy_file.go +81 -0
- data/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go +558 -0
- data/vendor/google.golang.org/protobuf/internal/impl/merge.go +176 -0
- data/vendor/google.golang.org/protobuf/internal/impl/merge_gen.go +209 -0
- data/vendor/google.golang.org/protobuf/internal/impl/message.go +276 -0
- data/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go +465 -0
- data/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go +543 -0
- data/vendor/google.golang.org/protobuf/internal/impl/message_reflect_gen.go +249 -0
- data/vendor/google.golang.org/protobuf/internal/impl/pointer_reflect.go +178 -0
- data/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go +174 -0
- data/vendor/google.golang.org/protobuf/internal/impl/validate.go +576 -0
- data/vendor/google.golang.org/protobuf/internal/impl/weak.go +74 -0
- data/vendor/google.golang.org/protobuf/internal/order/order.go +89 -0
- data/vendor/google.golang.org/protobuf/internal/order/range.go +115 -0
- data/vendor/google.golang.org/protobuf/internal/pragma/pragma.go +29 -0
- data/vendor/google.golang.org/protobuf/internal/set/ints.go +58 -0
- data/vendor/google.golang.org/protobuf/internal/strs/strings.go +196 -0
- data/vendor/google.golang.org/protobuf/internal/strs/strings_pure.go +27 -0
- data/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go +94 -0
- data/vendor/google.golang.org/protobuf/internal/version/version.go +79 -0
- data/vendor/google.golang.org/protobuf/proto/checkinit.go +71 -0
- data/vendor/google.golang.org/protobuf/proto/decode.go +278 -0
- data/vendor/google.golang.org/protobuf/proto/decode_gen.go +603 -0
- data/vendor/google.golang.org/protobuf/proto/doc.go +94 -0
- data/vendor/google.golang.org/protobuf/proto/encode.go +319 -0
- data/vendor/google.golang.org/protobuf/proto/encode_gen.go +97 -0
- data/vendor/google.golang.org/protobuf/proto/equal.go +167 -0
- data/vendor/google.golang.org/protobuf/proto/extension.go +92 -0
- data/vendor/google.golang.org/protobuf/proto/merge.go +139 -0
- data/vendor/google.golang.org/protobuf/proto/messageset.go +93 -0
- data/vendor/google.golang.org/protobuf/proto/proto.go +43 -0
- data/vendor/google.golang.org/protobuf/proto/proto_methods.go +19 -0
- data/vendor/google.golang.org/protobuf/proto/proto_reflect.go +19 -0
- data/vendor/google.golang.org/protobuf/proto/reset.go +43 -0
- data/vendor/google.golang.org/protobuf/proto/size.go +97 -0
- data/vendor/google.golang.org/protobuf/proto/size_gen.go +55 -0
- data/vendor/google.golang.org/protobuf/proto/wrappers.go +29 -0
- data/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go +276 -0
- data/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go +248 -0
- data/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go +286 -0
- data/vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go +374 -0
- data/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go +252 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/methods.go +77 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go +504 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/source.go +128 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go +461 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go +665 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go +285 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/value_pure.go +59 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go +411 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe.go +98 -0
- data/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go +869 -0
- data/vendor/google.golang.org/protobuf/runtime/protoiface/legacy.go +15 -0
- data/vendor/google.golang.org/protobuf/runtime/protoiface/methods.go +167 -0
- data/vendor/google.golang.org/protobuf/runtime/protoimpl/impl.go +44 -0
- data/vendor/google.golang.org/protobuf/runtime/protoimpl/version.go +56 -0
- data/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go +4039 -0
- data/vendor/modules.txt +79 -0
- metadata +495 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
syntax = "proto2";
|
|
2
|
+
option go_package = "urlfetch";
|
|
3
|
+
|
|
4
|
+
package appengine;
|
|
5
|
+
|
|
6
|
+
message URLFetchServiceError {
|
|
7
|
+
enum ErrorCode {
|
|
8
|
+
OK = 0;
|
|
9
|
+
INVALID_URL = 1;
|
|
10
|
+
FETCH_ERROR = 2;
|
|
11
|
+
UNSPECIFIED_ERROR = 3;
|
|
12
|
+
RESPONSE_TOO_LARGE = 4;
|
|
13
|
+
DEADLINE_EXCEEDED = 5;
|
|
14
|
+
SSL_CERTIFICATE_ERROR = 6;
|
|
15
|
+
DNS_ERROR = 7;
|
|
16
|
+
CLOSED = 8;
|
|
17
|
+
INTERNAL_TRANSIENT_ERROR = 9;
|
|
18
|
+
TOO_MANY_REDIRECTS = 10;
|
|
19
|
+
MALFORMED_REPLY = 11;
|
|
20
|
+
CONNECTION_ERROR = 12;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
message URLFetchRequest {
|
|
25
|
+
enum RequestMethod {
|
|
26
|
+
GET = 1;
|
|
27
|
+
POST = 2;
|
|
28
|
+
HEAD = 3;
|
|
29
|
+
PUT = 4;
|
|
30
|
+
DELETE = 5;
|
|
31
|
+
PATCH = 6;
|
|
32
|
+
}
|
|
33
|
+
required RequestMethod Method = 1;
|
|
34
|
+
required string Url = 2;
|
|
35
|
+
repeated group Header = 3 {
|
|
36
|
+
required string Key = 4;
|
|
37
|
+
required string Value = 5;
|
|
38
|
+
}
|
|
39
|
+
optional bytes Payload = 6 [ctype=CORD];
|
|
40
|
+
|
|
41
|
+
optional bool FollowRedirects = 7 [default=true];
|
|
42
|
+
|
|
43
|
+
optional double Deadline = 8;
|
|
44
|
+
|
|
45
|
+
optional bool MustValidateServerCertificate = 9 [default=true];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
message URLFetchResponse {
|
|
49
|
+
optional bytes Content = 1;
|
|
50
|
+
required int32 StatusCode = 2;
|
|
51
|
+
repeated group Header = 3 {
|
|
52
|
+
required string Key = 4;
|
|
53
|
+
required string Value = 5;
|
|
54
|
+
}
|
|
55
|
+
optional bool ContentWasTruncated = 6 [default=false];
|
|
56
|
+
optional int64 ExternalBytesSent = 7;
|
|
57
|
+
optional int64 ExternalBytesReceived = 8;
|
|
58
|
+
|
|
59
|
+
optional string FinalUrl = 9;
|
|
60
|
+
|
|
61
|
+
optional int64 ApiCpuMilliseconds = 10 [default=0];
|
|
62
|
+
optional int64 ApiBytesSent = 11 [default=0];
|
|
63
|
+
optional int64 ApiBytesReceived = 12 [default=0];
|
|
64
|
+
}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
// Copyright 2011 Google Inc. All rights reserved.
|
|
2
|
+
// Use of this source code is governed by the Apache 2.0
|
|
3
|
+
// license that can be found in the LICENSE file.
|
|
4
|
+
|
|
5
|
+
// Package urlfetch provides an http.RoundTripper implementation
|
|
6
|
+
// for fetching URLs via App Engine's urlfetch service.
|
|
7
|
+
package urlfetch // import "google.golang.org/appengine/urlfetch"
|
|
8
|
+
|
|
9
|
+
import (
|
|
10
|
+
"errors"
|
|
11
|
+
"fmt"
|
|
12
|
+
"io"
|
|
13
|
+
"io/ioutil"
|
|
14
|
+
"net/http"
|
|
15
|
+
"net/url"
|
|
16
|
+
"strconv"
|
|
17
|
+
"strings"
|
|
18
|
+
"time"
|
|
19
|
+
|
|
20
|
+
"github.com/golang/protobuf/proto"
|
|
21
|
+
"golang.org/x/net/context"
|
|
22
|
+
|
|
23
|
+
"google.golang.org/appengine/internal"
|
|
24
|
+
pb "google.golang.org/appengine/internal/urlfetch"
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
// Transport is an implementation of http.RoundTripper for
|
|
28
|
+
// App Engine. Users should generally create an http.Client using
|
|
29
|
+
// this transport and use the Client rather than using this transport
|
|
30
|
+
// directly.
|
|
31
|
+
type Transport struct {
|
|
32
|
+
Context context.Context
|
|
33
|
+
|
|
34
|
+
// Controls whether the application checks the validity of SSL certificates
|
|
35
|
+
// over HTTPS connections. A value of false (the default) instructs the
|
|
36
|
+
// application to send a request to the server only if the certificate is
|
|
37
|
+
// valid and signed by a trusted certificate authority (CA), and also
|
|
38
|
+
// includes a hostname that matches the certificate. A value of true
|
|
39
|
+
// instructs the application to perform no certificate validation.
|
|
40
|
+
AllowInvalidServerCertificate bool
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Verify statically that *Transport implements http.RoundTripper.
|
|
44
|
+
var _ http.RoundTripper = (*Transport)(nil)
|
|
45
|
+
|
|
46
|
+
// Client returns an *http.Client using a default urlfetch Transport. This
|
|
47
|
+
// client will have the default deadline of 5 seconds, and will check the
|
|
48
|
+
// validity of SSL certificates.
|
|
49
|
+
//
|
|
50
|
+
// Any deadline of the provided context will be used for requests through this client;
|
|
51
|
+
// if the client does not have a deadline then a 5 second default is used.
|
|
52
|
+
func Client(ctx context.Context) *http.Client {
|
|
53
|
+
return &http.Client{
|
|
54
|
+
Transport: &Transport{
|
|
55
|
+
Context: ctx,
|
|
56
|
+
},
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
type bodyReader struct {
|
|
61
|
+
content []byte
|
|
62
|
+
truncated bool
|
|
63
|
+
closed bool
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// ErrTruncatedBody is the error returned after the final Read() from a
|
|
67
|
+
// response's Body if the body has been truncated by App Engine's proxy.
|
|
68
|
+
var ErrTruncatedBody = errors.New("urlfetch: truncated body")
|
|
69
|
+
|
|
70
|
+
func statusCodeToText(code int) string {
|
|
71
|
+
if t := http.StatusText(code); t != "" {
|
|
72
|
+
return t
|
|
73
|
+
}
|
|
74
|
+
return strconv.Itoa(code)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
func (br *bodyReader) Read(p []byte) (n int, err error) {
|
|
78
|
+
if br.closed {
|
|
79
|
+
if br.truncated {
|
|
80
|
+
return 0, ErrTruncatedBody
|
|
81
|
+
}
|
|
82
|
+
return 0, io.EOF
|
|
83
|
+
}
|
|
84
|
+
n = copy(p, br.content)
|
|
85
|
+
if n > 0 {
|
|
86
|
+
br.content = br.content[n:]
|
|
87
|
+
return
|
|
88
|
+
}
|
|
89
|
+
if br.truncated {
|
|
90
|
+
br.closed = true
|
|
91
|
+
return 0, ErrTruncatedBody
|
|
92
|
+
}
|
|
93
|
+
return 0, io.EOF
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
func (br *bodyReader) Close() error {
|
|
97
|
+
br.closed = true
|
|
98
|
+
br.content = nil
|
|
99
|
+
return nil
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// A map of the URL Fetch-accepted methods that take a request body.
|
|
103
|
+
var methodAcceptsRequestBody = map[string]bool{
|
|
104
|
+
"POST": true,
|
|
105
|
+
"PUT": true,
|
|
106
|
+
"PATCH": true,
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// urlString returns a valid string given a URL. This function is necessary because
|
|
110
|
+
// the String method of URL doesn't correctly handle URLs with non-empty Opaque values.
|
|
111
|
+
// See http://code.google.com/p/go/issues/detail?id=4860.
|
|
112
|
+
func urlString(u *url.URL) string {
|
|
113
|
+
if u.Opaque == "" || strings.HasPrefix(u.Opaque, "//") {
|
|
114
|
+
return u.String()
|
|
115
|
+
}
|
|
116
|
+
aux := *u
|
|
117
|
+
aux.Opaque = "//" + aux.Host + aux.Opaque
|
|
118
|
+
return aux.String()
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// RoundTrip issues a single HTTP request and returns its response. Per the
|
|
122
|
+
// http.RoundTripper interface, RoundTrip only returns an error if there
|
|
123
|
+
// was an unsupported request or the URL Fetch proxy fails.
|
|
124
|
+
// Note that HTTP response codes such as 5xx, 403, 404, etc are not
|
|
125
|
+
// errors as far as the transport is concerned and will be returned
|
|
126
|
+
// with err set to nil.
|
|
127
|
+
func (t *Transport) RoundTrip(req *http.Request) (res *http.Response, err error) {
|
|
128
|
+
methNum, ok := pb.URLFetchRequest_RequestMethod_value[req.Method]
|
|
129
|
+
if !ok {
|
|
130
|
+
return nil, fmt.Errorf("urlfetch: unsupported HTTP method %q", req.Method)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
method := pb.URLFetchRequest_RequestMethod(methNum)
|
|
134
|
+
|
|
135
|
+
freq := &pb.URLFetchRequest{
|
|
136
|
+
Method: &method,
|
|
137
|
+
Url: proto.String(urlString(req.URL)),
|
|
138
|
+
FollowRedirects: proto.Bool(false), // http.Client's responsibility
|
|
139
|
+
MustValidateServerCertificate: proto.Bool(!t.AllowInvalidServerCertificate),
|
|
140
|
+
}
|
|
141
|
+
if deadline, ok := t.Context.Deadline(); ok {
|
|
142
|
+
freq.Deadline = proto.Float64(deadline.Sub(time.Now()).Seconds())
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
for k, vals := range req.Header {
|
|
146
|
+
for _, val := range vals {
|
|
147
|
+
freq.Header = append(freq.Header, &pb.URLFetchRequest_Header{
|
|
148
|
+
Key: proto.String(k),
|
|
149
|
+
Value: proto.String(val),
|
|
150
|
+
})
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if methodAcceptsRequestBody[req.Method] && req.Body != nil {
|
|
154
|
+
// Avoid a []byte copy if req.Body has a Bytes method.
|
|
155
|
+
switch b := req.Body.(type) {
|
|
156
|
+
case interface {
|
|
157
|
+
Bytes() []byte
|
|
158
|
+
}:
|
|
159
|
+
freq.Payload = b.Bytes()
|
|
160
|
+
default:
|
|
161
|
+
freq.Payload, err = ioutil.ReadAll(req.Body)
|
|
162
|
+
if err != nil {
|
|
163
|
+
return nil, err
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
fres := &pb.URLFetchResponse{}
|
|
169
|
+
if err := internal.Call(t.Context, "urlfetch", "Fetch", freq, fres); err != nil {
|
|
170
|
+
return nil, err
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
res = &http.Response{}
|
|
174
|
+
res.StatusCode = int(*fres.StatusCode)
|
|
175
|
+
res.Status = fmt.Sprintf("%d %s", res.StatusCode, statusCodeToText(res.StatusCode))
|
|
176
|
+
res.Header = make(http.Header)
|
|
177
|
+
res.Request = req
|
|
178
|
+
|
|
179
|
+
// Faked:
|
|
180
|
+
res.ProtoMajor = 1
|
|
181
|
+
res.ProtoMinor = 1
|
|
182
|
+
res.Proto = "HTTP/1.1"
|
|
183
|
+
res.Close = true
|
|
184
|
+
|
|
185
|
+
for _, h := range fres.Header {
|
|
186
|
+
hkey := http.CanonicalHeaderKey(*h.Key)
|
|
187
|
+
hval := *h.Value
|
|
188
|
+
if hkey == "Content-Length" {
|
|
189
|
+
// Will get filled in below for all but HEAD requests.
|
|
190
|
+
if req.Method == "HEAD" {
|
|
191
|
+
res.ContentLength, _ = strconv.ParseInt(hval, 10, 64)
|
|
192
|
+
}
|
|
193
|
+
continue
|
|
194
|
+
}
|
|
195
|
+
res.Header.Add(hkey, hval)
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if req.Method != "HEAD" {
|
|
199
|
+
res.ContentLength = int64(len(fres.Content))
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
truncated := fres.GetContentWasTruncated()
|
|
203
|
+
res.Body = &bodyReader{content: fres.Content, truncated: truncated}
|
|
204
|
+
return
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
func init() {
|
|
208
|
+
internal.RegisterErrorCodeMap("urlfetch", pb.URLFetchServiceError_ErrorCode_name)
|
|
209
|
+
internal.RegisterTimeoutErrorCode("urlfetch", int32(pb.URLFetchServiceError_DEADLINE_EXCEEDED))
|
|
210
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
Copyright (c) 2018 The Go Authors. All rights reserved.
|
|
2
|
+
|
|
3
|
+
Redistribution and use in source and binary forms, with or without
|
|
4
|
+
modification, are permitted provided that the following conditions are
|
|
5
|
+
met:
|
|
6
|
+
|
|
7
|
+
* Redistributions of source code must retain the above copyright
|
|
8
|
+
notice, this list of conditions and the following disclaimer.
|
|
9
|
+
* Redistributions in binary form must reproduce the above
|
|
10
|
+
copyright notice, this list of conditions and the following disclaimer
|
|
11
|
+
in the documentation and/or other materials provided with the
|
|
12
|
+
distribution.
|
|
13
|
+
* Neither the name of Google Inc. nor the names of its
|
|
14
|
+
contributors may be used to endorse or promote products derived from
|
|
15
|
+
this software without specific prior written permission.
|
|
16
|
+
|
|
17
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
18
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
19
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
20
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
21
|
+
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
22
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
23
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
24
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
25
|
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
26
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
27
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Additional IP Rights Grant (Patents)
|
|
2
|
+
|
|
3
|
+
"This implementation" means the copyrightable works distributed by
|
|
4
|
+
Google as part of the Go project.
|
|
5
|
+
|
|
6
|
+
Google hereby grants to You a perpetual, worldwide, non-exclusive,
|
|
7
|
+
no-charge, royalty-free, irrevocable (except as stated in this section)
|
|
8
|
+
patent license to make, have made, use, offer to sell, sell, import,
|
|
9
|
+
transfer and otherwise run, modify and propagate the contents of this
|
|
10
|
+
implementation of Go, where such license applies only to those patent
|
|
11
|
+
claims, both currently owned or controlled by Google and acquired in
|
|
12
|
+
the future, licensable by Google that are necessarily infringed by this
|
|
13
|
+
implementation of Go. This grant does not include claims that would be
|
|
14
|
+
infringed only as a consequence of further modification of this
|
|
15
|
+
implementation. If you or your agent or exclusive licensee institute or
|
|
16
|
+
order or agree to the institution of patent litigation against any
|
|
17
|
+
entity (including a cross-claim or counterclaim in a lawsuit) alleging
|
|
18
|
+
that this implementation of Go or any code incorporated within this
|
|
19
|
+
implementation of Go constitutes direct or contributory patent
|
|
20
|
+
infringement, or inducement of patent infringement, then any patent
|
|
21
|
+
rights granted to you under this License for this implementation of Go
|
|
22
|
+
shall terminate as of the date such litigation is filed.
|
|
@@ -0,0 +1,773 @@
|
|
|
1
|
+
// Copyright 2018 The Go Authors. All rights reserved.
|
|
2
|
+
// Use of this source code is governed by a BSD-style
|
|
3
|
+
// license that can be found in the LICENSE file.
|
|
4
|
+
|
|
5
|
+
package prototext
|
|
6
|
+
|
|
7
|
+
import (
|
|
8
|
+
"fmt"
|
|
9
|
+
"unicode/utf8"
|
|
10
|
+
|
|
11
|
+
"google.golang.org/protobuf/internal/encoding/messageset"
|
|
12
|
+
"google.golang.org/protobuf/internal/encoding/text"
|
|
13
|
+
"google.golang.org/protobuf/internal/errors"
|
|
14
|
+
"google.golang.org/protobuf/internal/flags"
|
|
15
|
+
"google.golang.org/protobuf/internal/genid"
|
|
16
|
+
"google.golang.org/protobuf/internal/pragma"
|
|
17
|
+
"google.golang.org/protobuf/internal/set"
|
|
18
|
+
"google.golang.org/protobuf/internal/strs"
|
|
19
|
+
"google.golang.org/protobuf/proto"
|
|
20
|
+
pref "google.golang.org/protobuf/reflect/protoreflect"
|
|
21
|
+
"google.golang.org/protobuf/reflect/protoregistry"
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
// Unmarshal reads the given []byte into the given proto.Message.
|
|
25
|
+
// The provided message must be mutable (e.g., a non-nil pointer to a message).
|
|
26
|
+
func Unmarshal(b []byte, m proto.Message) error {
|
|
27
|
+
return UnmarshalOptions{}.Unmarshal(b, m)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// UnmarshalOptions is a configurable textproto format unmarshaler.
|
|
31
|
+
type UnmarshalOptions struct {
|
|
32
|
+
pragma.NoUnkeyedLiterals
|
|
33
|
+
|
|
34
|
+
// AllowPartial accepts input for messages that will result in missing
|
|
35
|
+
// required fields. If AllowPartial is false (the default), Unmarshal will
|
|
36
|
+
// return error if there are any missing required fields.
|
|
37
|
+
AllowPartial bool
|
|
38
|
+
|
|
39
|
+
// DiscardUnknown specifies whether to ignore unknown fields when parsing.
|
|
40
|
+
// An unknown field is any field whose field name or field number does not
|
|
41
|
+
// resolve to any known or extension field in the message.
|
|
42
|
+
// By default, unmarshal rejects unknown fields as an error.
|
|
43
|
+
DiscardUnknown bool
|
|
44
|
+
|
|
45
|
+
// Resolver is used for looking up types when unmarshaling
|
|
46
|
+
// google.protobuf.Any messages or extension fields.
|
|
47
|
+
// If nil, this defaults to using protoregistry.GlobalTypes.
|
|
48
|
+
Resolver interface {
|
|
49
|
+
protoregistry.MessageTypeResolver
|
|
50
|
+
protoregistry.ExtensionTypeResolver
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Unmarshal reads the given []byte and populates the given proto.Message
|
|
55
|
+
// using options in the UnmarshalOptions object.
|
|
56
|
+
// The provided message must be mutable (e.g., a non-nil pointer to a message).
|
|
57
|
+
func (o UnmarshalOptions) Unmarshal(b []byte, m proto.Message) error {
|
|
58
|
+
return o.unmarshal(b, m)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// unmarshal is a centralized function that all unmarshal operations go through.
|
|
62
|
+
// For profiling purposes, avoid changing the name of this function or
|
|
63
|
+
// introducing other code paths for unmarshal that do not go through this.
|
|
64
|
+
func (o UnmarshalOptions) unmarshal(b []byte, m proto.Message) error {
|
|
65
|
+
proto.Reset(m)
|
|
66
|
+
|
|
67
|
+
if o.Resolver == nil {
|
|
68
|
+
o.Resolver = protoregistry.GlobalTypes
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
dec := decoder{text.NewDecoder(b), o}
|
|
72
|
+
if err := dec.unmarshalMessage(m.ProtoReflect(), false); err != nil {
|
|
73
|
+
return err
|
|
74
|
+
}
|
|
75
|
+
if o.AllowPartial {
|
|
76
|
+
return nil
|
|
77
|
+
}
|
|
78
|
+
return proto.CheckInitialized(m)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
type decoder struct {
|
|
82
|
+
*text.Decoder
|
|
83
|
+
opts UnmarshalOptions
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// newError returns an error object with position info.
|
|
87
|
+
func (d decoder) newError(pos int, f string, x ...interface{}) error {
|
|
88
|
+
line, column := d.Position(pos)
|
|
89
|
+
head := fmt.Sprintf("(line %d:%d): ", line, column)
|
|
90
|
+
return errors.New(head+f, x...)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// unexpectedTokenError returns a syntax error for the given unexpected token.
|
|
94
|
+
func (d decoder) unexpectedTokenError(tok text.Token) error {
|
|
95
|
+
return d.syntaxError(tok.Pos(), "unexpected token: %s", tok.RawString())
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// syntaxError returns a syntax error for given position.
|
|
99
|
+
func (d decoder) syntaxError(pos int, f string, x ...interface{}) error {
|
|
100
|
+
line, column := d.Position(pos)
|
|
101
|
+
head := fmt.Sprintf("syntax error (line %d:%d): ", line, column)
|
|
102
|
+
return errors.New(head+f, x...)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// unmarshalMessage unmarshals into the given protoreflect.Message.
|
|
106
|
+
func (d decoder) unmarshalMessage(m pref.Message, checkDelims bool) error {
|
|
107
|
+
messageDesc := m.Descriptor()
|
|
108
|
+
if !flags.ProtoLegacy && messageset.IsMessageSet(messageDesc) {
|
|
109
|
+
return errors.New("no support for proto1 MessageSets")
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if messageDesc.FullName() == genid.Any_message_fullname {
|
|
113
|
+
return d.unmarshalAny(m, checkDelims)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if checkDelims {
|
|
117
|
+
tok, err := d.Read()
|
|
118
|
+
if err != nil {
|
|
119
|
+
return err
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if tok.Kind() != text.MessageOpen {
|
|
123
|
+
return d.unexpectedTokenError(tok)
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
var seenNums set.Ints
|
|
128
|
+
var seenOneofs set.Ints
|
|
129
|
+
fieldDescs := messageDesc.Fields()
|
|
130
|
+
|
|
131
|
+
for {
|
|
132
|
+
// Read field name.
|
|
133
|
+
tok, err := d.Read()
|
|
134
|
+
if err != nil {
|
|
135
|
+
return err
|
|
136
|
+
}
|
|
137
|
+
switch typ := tok.Kind(); typ {
|
|
138
|
+
case text.Name:
|
|
139
|
+
// Continue below.
|
|
140
|
+
case text.EOF:
|
|
141
|
+
if checkDelims {
|
|
142
|
+
return text.ErrUnexpectedEOF
|
|
143
|
+
}
|
|
144
|
+
return nil
|
|
145
|
+
default:
|
|
146
|
+
if checkDelims && typ == text.MessageClose {
|
|
147
|
+
return nil
|
|
148
|
+
}
|
|
149
|
+
return d.unexpectedTokenError(tok)
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Resolve the field descriptor.
|
|
153
|
+
var name pref.Name
|
|
154
|
+
var fd pref.FieldDescriptor
|
|
155
|
+
var xt pref.ExtensionType
|
|
156
|
+
var xtErr error
|
|
157
|
+
var isFieldNumberName bool
|
|
158
|
+
|
|
159
|
+
switch tok.NameKind() {
|
|
160
|
+
case text.IdentName:
|
|
161
|
+
name = pref.Name(tok.IdentName())
|
|
162
|
+
fd = fieldDescs.ByTextName(string(name))
|
|
163
|
+
|
|
164
|
+
case text.TypeName:
|
|
165
|
+
// Handle extensions only. This code path is not for Any.
|
|
166
|
+
xt, xtErr = d.opts.Resolver.FindExtensionByName(pref.FullName(tok.TypeName()))
|
|
167
|
+
|
|
168
|
+
case text.FieldNumber:
|
|
169
|
+
isFieldNumberName = true
|
|
170
|
+
num := pref.FieldNumber(tok.FieldNumber())
|
|
171
|
+
if !num.IsValid() {
|
|
172
|
+
return d.newError(tok.Pos(), "invalid field number: %d", num)
|
|
173
|
+
}
|
|
174
|
+
fd = fieldDescs.ByNumber(num)
|
|
175
|
+
if fd == nil {
|
|
176
|
+
xt, xtErr = d.opts.Resolver.FindExtensionByNumber(messageDesc.FullName(), num)
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
if xt != nil {
|
|
181
|
+
fd = xt.TypeDescriptor()
|
|
182
|
+
if !messageDesc.ExtensionRanges().Has(fd.Number()) || fd.ContainingMessage().FullName() != messageDesc.FullName() {
|
|
183
|
+
return d.newError(tok.Pos(), "message %v cannot be extended by %v", messageDesc.FullName(), fd.FullName())
|
|
184
|
+
}
|
|
185
|
+
} else if xtErr != nil && xtErr != protoregistry.NotFound {
|
|
186
|
+
return d.newError(tok.Pos(), "unable to resolve [%s]: %v", tok.RawString(), xtErr)
|
|
187
|
+
}
|
|
188
|
+
if flags.ProtoLegacy {
|
|
189
|
+
if fd != nil && fd.IsWeak() && fd.Message().IsPlaceholder() {
|
|
190
|
+
fd = nil // reset since the weak reference is not linked in
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Handle unknown fields.
|
|
195
|
+
if fd == nil {
|
|
196
|
+
if d.opts.DiscardUnknown || messageDesc.ReservedNames().Has(name) {
|
|
197
|
+
d.skipValue()
|
|
198
|
+
continue
|
|
199
|
+
}
|
|
200
|
+
return d.newError(tok.Pos(), "unknown field: %v", tok.RawString())
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Handle fields identified by field number.
|
|
204
|
+
if isFieldNumberName {
|
|
205
|
+
// TODO: Add an option to permit parsing field numbers.
|
|
206
|
+
//
|
|
207
|
+
// This requires careful thought as the MarshalOptions.EmitUnknown
|
|
208
|
+
// option allows formatting unknown fields as the field number and the
|
|
209
|
+
// best-effort textual representation of the field value. In that case,
|
|
210
|
+
// it may not be possible to unmarshal the value from a parser that does
|
|
211
|
+
// have information about the unknown field.
|
|
212
|
+
return d.newError(tok.Pos(), "cannot specify field by number: %v", tok.RawString())
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
switch {
|
|
216
|
+
case fd.IsList():
|
|
217
|
+
kind := fd.Kind()
|
|
218
|
+
if kind != pref.MessageKind && kind != pref.GroupKind && !tok.HasSeparator() {
|
|
219
|
+
return d.syntaxError(tok.Pos(), "missing field separator :")
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
list := m.Mutable(fd).List()
|
|
223
|
+
if err := d.unmarshalList(fd, list); err != nil {
|
|
224
|
+
return err
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
case fd.IsMap():
|
|
228
|
+
mmap := m.Mutable(fd).Map()
|
|
229
|
+
if err := d.unmarshalMap(fd, mmap); err != nil {
|
|
230
|
+
return err
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
default:
|
|
234
|
+
kind := fd.Kind()
|
|
235
|
+
if kind != pref.MessageKind && kind != pref.GroupKind && !tok.HasSeparator() {
|
|
236
|
+
return d.syntaxError(tok.Pos(), "missing field separator :")
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// If field is a oneof, check if it has already been set.
|
|
240
|
+
if od := fd.ContainingOneof(); od != nil {
|
|
241
|
+
idx := uint64(od.Index())
|
|
242
|
+
if seenOneofs.Has(idx) {
|
|
243
|
+
return d.newError(tok.Pos(), "error parsing %q, oneof %v is already set", tok.RawString(), od.FullName())
|
|
244
|
+
}
|
|
245
|
+
seenOneofs.Set(idx)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
num := uint64(fd.Number())
|
|
249
|
+
if seenNums.Has(num) {
|
|
250
|
+
return d.newError(tok.Pos(), "non-repeated field %q is repeated", tok.RawString())
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if err := d.unmarshalSingular(fd, m); err != nil {
|
|
254
|
+
return err
|
|
255
|
+
}
|
|
256
|
+
seenNums.Set(num)
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
return nil
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// unmarshalSingular unmarshals a non-repeated field value specified by the
|
|
264
|
+
// given FieldDescriptor.
|
|
265
|
+
func (d decoder) unmarshalSingular(fd pref.FieldDescriptor, m pref.Message) error {
|
|
266
|
+
var val pref.Value
|
|
267
|
+
var err error
|
|
268
|
+
switch fd.Kind() {
|
|
269
|
+
case pref.MessageKind, pref.GroupKind:
|
|
270
|
+
val = m.NewField(fd)
|
|
271
|
+
err = d.unmarshalMessage(val.Message(), true)
|
|
272
|
+
default:
|
|
273
|
+
val, err = d.unmarshalScalar(fd)
|
|
274
|
+
}
|
|
275
|
+
if err == nil {
|
|
276
|
+
m.Set(fd, val)
|
|
277
|
+
}
|
|
278
|
+
return err
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// unmarshalScalar unmarshals a scalar/enum protoreflect.Value specified by the
|
|
282
|
+
// given FieldDescriptor.
|
|
283
|
+
func (d decoder) unmarshalScalar(fd pref.FieldDescriptor) (pref.Value, error) {
|
|
284
|
+
tok, err := d.Read()
|
|
285
|
+
if err != nil {
|
|
286
|
+
return pref.Value{}, err
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
if tok.Kind() != text.Scalar {
|
|
290
|
+
return pref.Value{}, d.unexpectedTokenError(tok)
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
kind := fd.Kind()
|
|
294
|
+
switch kind {
|
|
295
|
+
case pref.BoolKind:
|
|
296
|
+
if b, ok := tok.Bool(); ok {
|
|
297
|
+
return pref.ValueOfBool(b), nil
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind:
|
|
301
|
+
if n, ok := tok.Int32(); ok {
|
|
302
|
+
return pref.ValueOfInt32(n), nil
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind:
|
|
306
|
+
if n, ok := tok.Int64(); ok {
|
|
307
|
+
return pref.ValueOfInt64(n), nil
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
case pref.Uint32Kind, pref.Fixed32Kind:
|
|
311
|
+
if n, ok := tok.Uint32(); ok {
|
|
312
|
+
return pref.ValueOfUint32(n), nil
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
case pref.Uint64Kind, pref.Fixed64Kind:
|
|
316
|
+
if n, ok := tok.Uint64(); ok {
|
|
317
|
+
return pref.ValueOfUint64(n), nil
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
case pref.FloatKind:
|
|
321
|
+
if n, ok := tok.Float32(); ok {
|
|
322
|
+
return pref.ValueOfFloat32(n), nil
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
case pref.DoubleKind:
|
|
326
|
+
if n, ok := tok.Float64(); ok {
|
|
327
|
+
return pref.ValueOfFloat64(n), nil
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
case pref.StringKind:
|
|
331
|
+
if s, ok := tok.String(); ok {
|
|
332
|
+
if strs.EnforceUTF8(fd) && !utf8.ValidString(s) {
|
|
333
|
+
return pref.Value{}, d.newError(tok.Pos(), "contains invalid UTF-8")
|
|
334
|
+
}
|
|
335
|
+
return pref.ValueOfString(s), nil
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
case pref.BytesKind:
|
|
339
|
+
if b, ok := tok.String(); ok {
|
|
340
|
+
return pref.ValueOfBytes([]byte(b)), nil
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
case pref.EnumKind:
|
|
344
|
+
if lit, ok := tok.Enum(); ok {
|
|
345
|
+
// Lookup EnumNumber based on name.
|
|
346
|
+
if enumVal := fd.Enum().Values().ByName(pref.Name(lit)); enumVal != nil {
|
|
347
|
+
return pref.ValueOfEnum(enumVal.Number()), nil
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
if num, ok := tok.Int32(); ok {
|
|
351
|
+
return pref.ValueOfEnum(pref.EnumNumber(num)), nil
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
default:
|
|
355
|
+
panic(fmt.Sprintf("invalid scalar kind %v", kind))
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
return pref.Value{}, d.newError(tok.Pos(), "invalid value for %v type: %v", kind, tok.RawString())
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// unmarshalList unmarshals into given protoreflect.List. A list value can
|
|
362
|
+
// either be in [] syntax or simply just a single scalar/message value.
|
|
363
|
+
func (d decoder) unmarshalList(fd pref.FieldDescriptor, list pref.List) error {
|
|
364
|
+
tok, err := d.Peek()
|
|
365
|
+
if err != nil {
|
|
366
|
+
return err
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
switch fd.Kind() {
|
|
370
|
+
case pref.MessageKind, pref.GroupKind:
|
|
371
|
+
switch tok.Kind() {
|
|
372
|
+
case text.ListOpen:
|
|
373
|
+
d.Read()
|
|
374
|
+
for {
|
|
375
|
+
tok, err := d.Peek()
|
|
376
|
+
if err != nil {
|
|
377
|
+
return err
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
switch tok.Kind() {
|
|
381
|
+
case text.ListClose:
|
|
382
|
+
d.Read()
|
|
383
|
+
return nil
|
|
384
|
+
case text.MessageOpen:
|
|
385
|
+
pval := list.NewElement()
|
|
386
|
+
if err := d.unmarshalMessage(pval.Message(), true); err != nil {
|
|
387
|
+
return err
|
|
388
|
+
}
|
|
389
|
+
list.Append(pval)
|
|
390
|
+
default:
|
|
391
|
+
return d.unexpectedTokenError(tok)
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
case text.MessageOpen:
|
|
396
|
+
pval := list.NewElement()
|
|
397
|
+
if err := d.unmarshalMessage(pval.Message(), true); err != nil {
|
|
398
|
+
return err
|
|
399
|
+
}
|
|
400
|
+
list.Append(pval)
|
|
401
|
+
return nil
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
default:
|
|
405
|
+
switch tok.Kind() {
|
|
406
|
+
case text.ListOpen:
|
|
407
|
+
d.Read()
|
|
408
|
+
for {
|
|
409
|
+
tok, err := d.Peek()
|
|
410
|
+
if err != nil {
|
|
411
|
+
return err
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
switch tok.Kind() {
|
|
415
|
+
case text.ListClose:
|
|
416
|
+
d.Read()
|
|
417
|
+
return nil
|
|
418
|
+
case text.Scalar:
|
|
419
|
+
pval, err := d.unmarshalScalar(fd)
|
|
420
|
+
if err != nil {
|
|
421
|
+
return err
|
|
422
|
+
}
|
|
423
|
+
list.Append(pval)
|
|
424
|
+
default:
|
|
425
|
+
return d.unexpectedTokenError(tok)
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
case text.Scalar:
|
|
430
|
+
pval, err := d.unmarshalScalar(fd)
|
|
431
|
+
if err != nil {
|
|
432
|
+
return err
|
|
433
|
+
}
|
|
434
|
+
list.Append(pval)
|
|
435
|
+
return nil
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
return d.unexpectedTokenError(tok)
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// unmarshalMap unmarshals into given protoreflect.Map. A map value is a
|
|
443
|
+
// textproto message containing {key: <kvalue>, value: <mvalue>}.
|
|
444
|
+
func (d decoder) unmarshalMap(fd pref.FieldDescriptor, mmap pref.Map) error {
|
|
445
|
+
// Determine ahead whether map entry is a scalar type or a message type in
|
|
446
|
+
// order to call the appropriate unmarshalMapValue func inside
|
|
447
|
+
// unmarshalMapEntry.
|
|
448
|
+
var unmarshalMapValue func() (pref.Value, error)
|
|
449
|
+
switch fd.MapValue().Kind() {
|
|
450
|
+
case pref.MessageKind, pref.GroupKind:
|
|
451
|
+
unmarshalMapValue = func() (pref.Value, error) {
|
|
452
|
+
pval := mmap.NewValue()
|
|
453
|
+
if err := d.unmarshalMessage(pval.Message(), true); err != nil {
|
|
454
|
+
return pref.Value{}, err
|
|
455
|
+
}
|
|
456
|
+
return pval, nil
|
|
457
|
+
}
|
|
458
|
+
default:
|
|
459
|
+
unmarshalMapValue = func() (pref.Value, error) {
|
|
460
|
+
return d.unmarshalScalar(fd.MapValue())
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
tok, err := d.Read()
|
|
465
|
+
if err != nil {
|
|
466
|
+
return err
|
|
467
|
+
}
|
|
468
|
+
switch tok.Kind() {
|
|
469
|
+
case text.MessageOpen:
|
|
470
|
+
return d.unmarshalMapEntry(fd, mmap, unmarshalMapValue)
|
|
471
|
+
|
|
472
|
+
case text.ListOpen:
|
|
473
|
+
for {
|
|
474
|
+
tok, err := d.Read()
|
|
475
|
+
if err != nil {
|
|
476
|
+
return err
|
|
477
|
+
}
|
|
478
|
+
switch tok.Kind() {
|
|
479
|
+
case text.ListClose:
|
|
480
|
+
return nil
|
|
481
|
+
case text.MessageOpen:
|
|
482
|
+
if err := d.unmarshalMapEntry(fd, mmap, unmarshalMapValue); err != nil {
|
|
483
|
+
return err
|
|
484
|
+
}
|
|
485
|
+
default:
|
|
486
|
+
return d.unexpectedTokenError(tok)
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
default:
|
|
491
|
+
return d.unexpectedTokenError(tok)
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
// unmarshalMap unmarshals into given protoreflect.Map. A map value is a
|
|
496
|
+
// textproto message containing {key: <kvalue>, value: <mvalue>}.
|
|
497
|
+
func (d decoder) unmarshalMapEntry(fd pref.FieldDescriptor, mmap pref.Map, unmarshalMapValue func() (pref.Value, error)) error {
|
|
498
|
+
var key pref.MapKey
|
|
499
|
+
var pval pref.Value
|
|
500
|
+
Loop:
|
|
501
|
+
for {
|
|
502
|
+
// Read field name.
|
|
503
|
+
tok, err := d.Read()
|
|
504
|
+
if err != nil {
|
|
505
|
+
return err
|
|
506
|
+
}
|
|
507
|
+
switch tok.Kind() {
|
|
508
|
+
case text.Name:
|
|
509
|
+
if tok.NameKind() != text.IdentName {
|
|
510
|
+
if !d.opts.DiscardUnknown {
|
|
511
|
+
return d.newError(tok.Pos(), "unknown map entry field %q", tok.RawString())
|
|
512
|
+
}
|
|
513
|
+
d.skipValue()
|
|
514
|
+
continue Loop
|
|
515
|
+
}
|
|
516
|
+
// Continue below.
|
|
517
|
+
case text.MessageClose:
|
|
518
|
+
break Loop
|
|
519
|
+
default:
|
|
520
|
+
return d.unexpectedTokenError(tok)
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
switch name := pref.Name(tok.IdentName()); name {
|
|
524
|
+
case genid.MapEntry_Key_field_name:
|
|
525
|
+
if !tok.HasSeparator() {
|
|
526
|
+
return d.syntaxError(tok.Pos(), "missing field separator :")
|
|
527
|
+
}
|
|
528
|
+
if key.IsValid() {
|
|
529
|
+
return d.newError(tok.Pos(), "map entry %q cannot be repeated", name)
|
|
530
|
+
}
|
|
531
|
+
val, err := d.unmarshalScalar(fd.MapKey())
|
|
532
|
+
if err != nil {
|
|
533
|
+
return err
|
|
534
|
+
}
|
|
535
|
+
key = val.MapKey()
|
|
536
|
+
|
|
537
|
+
case genid.MapEntry_Value_field_name:
|
|
538
|
+
if kind := fd.MapValue().Kind(); (kind != pref.MessageKind) && (kind != pref.GroupKind) {
|
|
539
|
+
if !tok.HasSeparator() {
|
|
540
|
+
return d.syntaxError(tok.Pos(), "missing field separator :")
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
if pval.IsValid() {
|
|
544
|
+
return d.newError(tok.Pos(), "map entry %q cannot be repeated", name)
|
|
545
|
+
}
|
|
546
|
+
pval, err = unmarshalMapValue()
|
|
547
|
+
if err != nil {
|
|
548
|
+
return err
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
default:
|
|
552
|
+
if !d.opts.DiscardUnknown {
|
|
553
|
+
return d.newError(tok.Pos(), "unknown map entry field %q", name)
|
|
554
|
+
}
|
|
555
|
+
d.skipValue()
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
if !key.IsValid() {
|
|
560
|
+
key = fd.MapKey().Default().MapKey()
|
|
561
|
+
}
|
|
562
|
+
if !pval.IsValid() {
|
|
563
|
+
switch fd.MapValue().Kind() {
|
|
564
|
+
case pref.MessageKind, pref.GroupKind:
|
|
565
|
+
// If value field is not set for message/group types, construct an
|
|
566
|
+
// empty one as default.
|
|
567
|
+
pval = mmap.NewValue()
|
|
568
|
+
default:
|
|
569
|
+
pval = fd.MapValue().Default()
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
mmap.Set(key, pval)
|
|
573
|
+
return nil
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
// unmarshalAny unmarshals an Any textproto. It can either be in expanded form
|
|
577
|
+
// or non-expanded form.
|
|
578
|
+
func (d decoder) unmarshalAny(m pref.Message, checkDelims bool) error {
|
|
579
|
+
var typeURL string
|
|
580
|
+
var bValue []byte
|
|
581
|
+
var seenTypeUrl bool
|
|
582
|
+
var seenValue bool
|
|
583
|
+
var isExpanded bool
|
|
584
|
+
|
|
585
|
+
if checkDelims {
|
|
586
|
+
tok, err := d.Read()
|
|
587
|
+
if err != nil {
|
|
588
|
+
return err
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
if tok.Kind() != text.MessageOpen {
|
|
592
|
+
return d.unexpectedTokenError(tok)
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
Loop:
|
|
597
|
+
for {
|
|
598
|
+
// Read field name. Can only have 3 possible field names, i.e. type_url,
|
|
599
|
+
// value and type URL name inside [].
|
|
600
|
+
tok, err := d.Read()
|
|
601
|
+
if err != nil {
|
|
602
|
+
return err
|
|
603
|
+
}
|
|
604
|
+
if typ := tok.Kind(); typ != text.Name {
|
|
605
|
+
if checkDelims {
|
|
606
|
+
if typ == text.MessageClose {
|
|
607
|
+
break Loop
|
|
608
|
+
}
|
|
609
|
+
} else if typ == text.EOF {
|
|
610
|
+
break Loop
|
|
611
|
+
}
|
|
612
|
+
return d.unexpectedTokenError(tok)
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
switch tok.NameKind() {
|
|
616
|
+
case text.IdentName:
|
|
617
|
+
// Both type_url and value fields require field separator :.
|
|
618
|
+
if !tok.HasSeparator() {
|
|
619
|
+
return d.syntaxError(tok.Pos(), "missing field separator :")
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
switch name := pref.Name(tok.IdentName()); name {
|
|
623
|
+
case genid.Any_TypeUrl_field_name:
|
|
624
|
+
if seenTypeUrl {
|
|
625
|
+
return d.newError(tok.Pos(), "duplicate %v field", genid.Any_TypeUrl_field_fullname)
|
|
626
|
+
}
|
|
627
|
+
if isExpanded {
|
|
628
|
+
return d.newError(tok.Pos(), "conflict with [%s] field", typeURL)
|
|
629
|
+
}
|
|
630
|
+
tok, err := d.Read()
|
|
631
|
+
if err != nil {
|
|
632
|
+
return err
|
|
633
|
+
}
|
|
634
|
+
var ok bool
|
|
635
|
+
typeURL, ok = tok.String()
|
|
636
|
+
if !ok {
|
|
637
|
+
return d.newError(tok.Pos(), "invalid %v field value: %v", genid.Any_TypeUrl_field_fullname, tok.RawString())
|
|
638
|
+
}
|
|
639
|
+
seenTypeUrl = true
|
|
640
|
+
|
|
641
|
+
case genid.Any_Value_field_name:
|
|
642
|
+
if seenValue {
|
|
643
|
+
return d.newError(tok.Pos(), "duplicate %v field", genid.Any_Value_field_fullname)
|
|
644
|
+
}
|
|
645
|
+
if isExpanded {
|
|
646
|
+
return d.newError(tok.Pos(), "conflict with [%s] field", typeURL)
|
|
647
|
+
}
|
|
648
|
+
tok, err := d.Read()
|
|
649
|
+
if err != nil {
|
|
650
|
+
return err
|
|
651
|
+
}
|
|
652
|
+
s, ok := tok.String()
|
|
653
|
+
if !ok {
|
|
654
|
+
return d.newError(tok.Pos(), "invalid %v field value: %v", genid.Any_Value_field_fullname, tok.RawString())
|
|
655
|
+
}
|
|
656
|
+
bValue = []byte(s)
|
|
657
|
+
seenValue = true
|
|
658
|
+
|
|
659
|
+
default:
|
|
660
|
+
if !d.opts.DiscardUnknown {
|
|
661
|
+
return d.newError(tok.Pos(), "invalid field name %q in %v message", tok.RawString(), genid.Any_message_fullname)
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
case text.TypeName:
|
|
666
|
+
if isExpanded {
|
|
667
|
+
return d.newError(tok.Pos(), "cannot have more than one type")
|
|
668
|
+
}
|
|
669
|
+
if seenTypeUrl {
|
|
670
|
+
return d.newError(tok.Pos(), "conflict with type_url field")
|
|
671
|
+
}
|
|
672
|
+
typeURL = tok.TypeName()
|
|
673
|
+
var err error
|
|
674
|
+
bValue, err = d.unmarshalExpandedAny(typeURL, tok.Pos())
|
|
675
|
+
if err != nil {
|
|
676
|
+
return err
|
|
677
|
+
}
|
|
678
|
+
isExpanded = true
|
|
679
|
+
|
|
680
|
+
default:
|
|
681
|
+
if !d.opts.DiscardUnknown {
|
|
682
|
+
return d.newError(tok.Pos(), "invalid field name %q in %v message", tok.RawString(), genid.Any_message_fullname)
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
fds := m.Descriptor().Fields()
|
|
688
|
+
if len(typeURL) > 0 {
|
|
689
|
+
m.Set(fds.ByNumber(genid.Any_TypeUrl_field_number), pref.ValueOfString(typeURL))
|
|
690
|
+
}
|
|
691
|
+
if len(bValue) > 0 {
|
|
692
|
+
m.Set(fds.ByNumber(genid.Any_Value_field_number), pref.ValueOfBytes(bValue))
|
|
693
|
+
}
|
|
694
|
+
return nil
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
func (d decoder) unmarshalExpandedAny(typeURL string, pos int) ([]byte, error) {
|
|
698
|
+
mt, err := d.opts.Resolver.FindMessageByURL(typeURL)
|
|
699
|
+
if err != nil {
|
|
700
|
+
return nil, d.newError(pos, "unable to resolve message [%v]: %v", typeURL, err)
|
|
701
|
+
}
|
|
702
|
+
// Create new message for the embedded message type and unmarshal the value
|
|
703
|
+
// field into it.
|
|
704
|
+
m := mt.New()
|
|
705
|
+
if err := d.unmarshalMessage(m, true); err != nil {
|
|
706
|
+
return nil, err
|
|
707
|
+
}
|
|
708
|
+
// Serialize the embedded message and return the resulting bytes.
|
|
709
|
+
b, err := proto.MarshalOptions{
|
|
710
|
+
AllowPartial: true, // Never check required fields inside an Any.
|
|
711
|
+
Deterministic: true,
|
|
712
|
+
}.Marshal(m.Interface())
|
|
713
|
+
if err != nil {
|
|
714
|
+
return nil, d.newError(pos, "error in marshaling message into Any.value: %v", err)
|
|
715
|
+
}
|
|
716
|
+
return b, nil
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
// skipValue makes the decoder parse a field value in order to advance the read
|
|
720
|
+
// to the next field. It relies on Read returning an error if the types are not
|
|
721
|
+
// in valid sequence.
|
|
722
|
+
func (d decoder) skipValue() error {
|
|
723
|
+
tok, err := d.Read()
|
|
724
|
+
if err != nil {
|
|
725
|
+
return err
|
|
726
|
+
}
|
|
727
|
+
// Only need to continue reading for messages and lists.
|
|
728
|
+
switch tok.Kind() {
|
|
729
|
+
case text.MessageOpen:
|
|
730
|
+
return d.skipMessageValue()
|
|
731
|
+
|
|
732
|
+
case text.ListOpen:
|
|
733
|
+
for {
|
|
734
|
+
tok, err := d.Read()
|
|
735
|
+
if err != nil {
|
|
736
|
+
return err
|
|
737
|
+
}
|
|
738
|
+
switch tok.Kind() {
|
|
739
|
+
case text.ListClose:
|
|
740
|
+
return nil
|
|
741
|
+
case text.MessageOpen:
|
|
742
|
+
return d.skipMessageValue()
|
|
743
|
+
default:
|
|
744
|
+
// Skip items. This will not validate whether skipped values are
|
|
745
|
+
// of the same type or not, same behavior as C++
|
|
746
|
+
// TextFormat::Parser::AllowUnknownField(true) version 3.8.0.
|
|
747
|
+
if err := d.skipValue(); err != nil {
|
|
748
|
+
return err
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
return nil
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
// skipMessageValue makes the decoder parse and skip over all fields in a
|
|
757
|
+
// message. It assumes that the previous read type is MessageOpen.
|
|
758
|
+
func (d decoder) skipMessageValue() error {
|
|
759
|
+
for {
|
|
760
|
+
tok, err := d.Read()
|
|
761
|
+
if err != nil {
|
|
762
|
+
return err
|
|
763
|
+
}
|
|
764
|
+
switch tok.Kind() {
|
|
765
|
+
case text.MessageClose:
|
|
766
|
+
return nil
|
|
767
|
+
case text.Name:
|
|
768
|
+
if err := d.skipValue(); err != nil {
|
|
769
|
+
return err
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
}
|