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.
Files changed (378) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +24 -0
  3. data/.github/workflows/gem-push.yml +38 -0
  4. data/.github/workflows/licensed.yml +43 -0
  5. data/.gitignore +10 -0
  6. data/.licensed.yml +9 -0
  7. data/.licenses/go/github.com/armon/circbuf.dep.yml +31 -0
  8. data/.licenses/go/github.com/gorilla/mux.dep.yml +41 -0
  9. data/.licenses/go/github.com/hashicorp/go-cleanhttp.dep.yml +375 -0
  10. data/.licenses/go/github.com/mitchellh/go-homedir.dep.yml +32 -0
  11. data/.licenses/go/github.com/pkg/errors.dep.yml +36 -0
  12. data/.licenses/go/github.com/planetscale/planetscale-go/planetscale.dep.yml +160 -0
  13. data/.licenses/go/github.com/planetscale/sql-proxy/proxy.dep.yml +180 -0
  14. data/.licenses/go/go.uber.org/atomic.dep.yml +31 -0
  15. data/.licenses/go/go.uber.org/multierr.dep.yml +30 -0
  16. data/.licenses/go/go.uber.org/zap.dep.yml +30 -0
  17. data/.licenses/go/go.uber.org/zap/buffer.dep.yml +30 -0
  18. data/.licenses/go/go.uber.org/zap/internal/bufferpool.dep.yml +30 -0
  19. data/.licenses/go/go.uber.org/zap/internal/color.dep.yml +30 -0
  20. data/.licenses/go/go.uber.org/zap/internal/exit.dep.yml +31 -0
  21. data/.licenses/go/go.uber.org/zap/zapcore.dep.yml +31 -0
  22. data/.licenses/go/golang.org/x/net/context/ctxhttp.dep.yml +63 -0
  23. data/.licenses/go/golang.org/x/oauth2.dep.yml +44 -0
  24. data/.licenses/go/golang.org/x/oauth2/internal.dep.yml +38 -0
  25. data/.ruby_version +1 -0
  26. data/Gemfile +8 -0
  27. data/LICENSE +201 -0
  28. data/README.md +88 -0
  29. data/Rakefile +10 -0
  30. data/bin/console +15 -0
  31. data/bin/setup +17 -0
  32. data/controller.go +255 -0
  33. data/go.mod +16 -0
  34. data/go.sum +428 -0
  35. data/lib/generators/planetscale/install_generator.rb +58 -0
  36. data/lib/planetscale.rb +137 -0
  37. data/lib/planetscale/version.rb +5 -0
  38. data/planetscale.gemspec +44 -0
  39. data/proxy.go +128 -0
  40. data/vendor/github.com/armon/circbuf/.gitignore +22 -0
  41. data/vendor/github.com/armon/circbuf/LICENSE +20 -0
  42. data/vendor/github.com/armon/circbuf/README.md +28 -0
  43. data/vendor/github.com/armon/circbuf/circbuf.go +92 -0
  44. data/vendor/github.com/armon/circbuf/go.mod +1 -0
  45. data/vendor/github.com/golang/protobuf/AUTHORS +3 -0
  46. data/vendor/github.com/golang/protobuf/CONTRIBUTORS +3 -0
  47. data/vendor/github.com/golang/protobuf/LICENSE +28 -0
  48. data/vendor/github.com/golang/protobuf/proto/buffer.go +324 -0
  49. data/vendor/github.com/golang/protobuf/proto/defaults.go +63 -0
  50. data/vendor/github.com/golang/protobuf/proto/deprecated.go +113 -0
  51. data/vendor/github.com/golang/protobuf/proto/discard.go +58 -0
  52. data/vendor/github.com/golang/protobuf/proto/extensions.go +356 -0
  53. data/vendor/github.com/golang/protobuf/proto/properties.go +306 -0
  54. data/vendor/github.com/golang/protobuf/proto/proto.go +167 -0
  55. data/vendor/github.com/golang/protobuf/proto/registry.go +317 -0
  56. data/vendor/github.com/golang/protobuf/proto/text_decode.go +801 -0
  57. data/vendor/github.com/golang/protobuf/proto/text_encode.go +560 -0
  58. data/vendor/github.com/golang/protobuf/proto/wire.go +78 -0
  59. data/vendor/github.com/golang/protobuf/proto/wrappers.go +34 -0
  60. data/vendor/github.com/gorilla/mux/AUTHORS +8 -0
  61. data/vendor/github.com/gorilla/mux/LICENSE +27 -0
  62. data/vendor/github.com/gorilla/mux/README.md +805 -0
  63. data/vendor/github.com/gorilla/mux/doc.go +306 -0
  64. data/vendor/github.com/gorilla/mux/go.mod +3 -0
  65. data/vendor/github.com/gorilla/mux/middleware.go +74 -0
  66. data/vendor/github.com/gorilla/mux/mux.go +606 -0
  67. data/vendor/github.com/gorilla/mux/regexp.go +388 -0
  68. data/vendor/github.com/gorilla/mux/route.go +736 -0
  69. data/vendor/github.com/gorilla/mux/test_helpers.go +19 -0
  70. data/vendor/github.com/hashicorp/go-cleanhttp/LICENSE +363 -0
  71. data/vendor/github.com/hashicorp/go-cleanhttp/README.md +30 -0
  72. data/vendor/github.com/hashicorp/go-cleanhttp/cleanhttp.go +58 -0
  73. data/vendor/github.com/hashicorp/go-cleanhttp/doc.go +20 -0
  74. data/vendor/github.com/hashicorp/go-cleanhttp/go.mod +3 -0
  75. data/vendor/github.com/hashicorp/go-cleanhttp/handlers.go +48 -0
  76. data/vendor/github.com/mitchellh/go-homedir/LICENSE +21 -0
  77. data/vendor/github.com/mitchellh/go-homedir/README.md +14 -0
  78. data/vendor/github.com/mitchellh/go-homedir/go.mod +1 -0
  79. data/vendor/github.com/mitchellh/go-homedir/homedir.go +167 -0
  80. data/vendor/github.com/pkg/errors/.gitignore +24 -0
  81. data/vendor/github.com/pkg/errors/.travis.yml +10 -0
  82. data/vendor/github.com/pkg/errors/LICENSE +23 -0
  83. data/vendor/github.com/pkg/errors/Makefile +44 -0
  84. data/vendor/github.com/pkg/errors/README.md +59 -0
  85. data/vendor/github.com/pkg/errors/appveyor.yml +32 -0
  86. data/vendor/github.com/pkg/errors/errors.go +288 -0
  87. data/vendor/github.com/pkg/errors/go113.go +38 -0
  88. data/vendor/github.com/pkg/errors/stack.go +177 -0
  89. data/vendor/github.com/planetscale/planetscale-go/planetscale/backups.go +139 -0
  90. data/vendor/github.com/planetscale/planetscale-go/planetscale/branches.go +258 -0
  91. data/vendor/github.com/planetscale/planetscale-go/planetscale/certs.go +142 -0
  92. data/vendor/github.com/planetscale/planetscale-go/planetscale/client.go +305 -0
  93. data/vendor/github.com/planetscale/planetscale-go/planetscale/databases.go +131 -0
  94. data/vendor/github.com/planetscale/planetscale-go/planetscale/deploy_requests.go +368 -0
  95. data/vendor/github.com/planetscale/planetscale-go/planetscale/organizations.go +78 -0
  96. data/vendor/github.com/planetscale/planetscale-go/planetscale/service_tokens.go +163 -0
  97. data/vendor/github.com/planetscale/sql-proxy/proxy/client.go +467 -0
  98. data/vendor/github.com/planetscale/sql-proxy/proxy/tls_cache.go +73 -0
  99. data/vendor/go.uber.org/atomic/.codecov.yml +19 -0
  100. data/vendor/go.uber.org/atomic/.gitignore +12 -0
  101. data/vendor/go.uber.org/atomic/.travis.yml +27 -0
  102. data/vendor/go.uber.org/atomic/CHANGELOG.md +76 -0
  103. data/vendor/go.uber.org/atomic/LICENSE.txt +19 -0
  104. data/vendor/go.uber.org/atomic/Makefile +78 -0
  105. data/vendor/go.uber.org/atomic/README.md +63 -0
  106. data/vendor/go.uber.org/atomic/bool.go +81 -0
  107. data/vendor/go.uber.org/atomic/bool_ext.go +53 -0
  108. data/vendor/go.uber.org/atomic/doc.go +23 -0
  109. data/vendor/go.uber.org/atomic/duration.go +82 -0
  110. data/vendor/go.uber.org/atomic/duration_ext.go +40 -0
  111. data/vendor/go.uber.org/atomic/error.go +51 -0
  112. data/vendor/go.uber.org/atomic/error_ext.go +39 -0
  113. data/vendor/go.uber.org/atomic/float64.go +76 -0
  114. data/vendor/go.uber.org/atomic/float64_ext.go +47 -0
  115. data/vendor/go.uber.org/atomic/gen.go +26 -0
  116. data/vendor/go.uber.org/atomic/go.mod +8 -0
  117. data/vendor/go.uber.org/atomic/go.sum +9 -0
  118. data/vendor/go.uber.org/atomic/int32.go +102 -0
  119. data/vendor/go.uber.org/atomic/int64.go +102 -0
  120. data/vendor/go.uber.org/atomic/nocmp.go +35 -0
  121. data/vendor/go.uber.org/atomic/string.go +54 -0
  122. data/vendor/go.uber.org/atomic/string_ext.go +43 -0
  123. data/vendor/go.uber.org/atomic/uint32.go +102 -0
  124. data/vendor/go.uber.org/atomic/uint64.go +102 -0
  125. data/vendor/go.uber.org/atomic/value.go +31 -0
  126. data/vendor/go.uber.org/multierr/.codecov.yml +15 -0
  127. data/vendor/go.uber.org/multierr/.gitignore +4 -0
  128. data/vendor/go.uber.org/multierr/.travis.yml +23 -0
  129. data/vendor/go.uber.org/multierr/CHANGELOG.md +60 -0
  130. data/vendor/go.uber.org/multierr/LICENSE.txt +19 -0
  131. data/vendor/go.uber.org/multierr/Makefile +42 -0
  132. data/vendor/go.uber.org/multierr/README.md +23 -0
  133. data/vendor/go.uber.org/multierr/error.go +449 -0
  134. data/vendor/go.uber.org/multierr/glide.yaml +8 -0
  135. data/vendor/go.uber.org/multierr/go.mod +8 -0
  136. data/vendor/go.uber.org/multierr/go.sum +11 -0
  137. data/vendor/go.uber.org/multierr/go113.go +52 -0
  138. data/vendor/go.uber.org/zap/.codecov.yml +17 -0
  139. data/vendor/go.uber.org/zap/.gitignore +32 -0
  140. data/vendor/go.uber.org/zap/.readme.tmpl +109 -0
  141. data/vendor/go.uber.org/zap/.travis.yml +23 -0
  142. data/vendor/go.uber.org/zap/CHANGELOG.md +432 -0
  143. data/vendor/go.uber.org/zap/CODE_OF_CONDUCT.md +75 -0
  144. data/vendor/go.uber.org/zap/CONTRIBUTING.md +81 -0
  145. data/vendor/go.uber.org/zap/FAQ.md +156 -0
  146. data/vendor/go.uber.org/zap/LICENSE.txt +19 -0
  147. data/vendor/go.uber.org/zap/Makefile +63 -0
  148. data/vendor/go.uber.org/zap/README.md +134 -0
  149. data/vendor/go.uber.org/zap/array.go +320 -0
  150. data/vendor/go.uber.org/zap/buffer/buffer.go +123 -0
  151. data/vendor/go.uber.org/zap/buffer/pool.go +49 -0
  152. data/vendor/go.uber.org/zap/checklicense.sh +17 -0
  153. data/vendor/go.uber.org/zap/config.go +264 -0
  154. data/vendor/go.uber.org/zap/doc.go +113 -0
  155. data/vendor/go.uber.org/zap/encoder.go +79 -0
  156. data/vendor/go.uber.org/zap/error.go +80 -0
  157. data/vendor/go.uber.org/zap/field.go +539 -0
  158. data/vendor/go.uber.org/zap/flag.go +39 -0
  159. data/vendor/go.uber.org/zap/glide.yaml +34 -0
  160. data/vendor/go.uber.org/zap/global.go +168 -0
  161. data/vendor/go.uber.org/zap/global_go112.go +26 -0
  162. data/vendor/go.uber.org/zap/global_prego112.go +26 -0
  163. data/vendor/go.uber.org/zap/go.mod +13 -0
  164. data/vendor/go.uber.org/zap/go.sum +56 -0
  165. data/vendor/go.uber.org/zap/http_handler.go +81 -0
  166. data/vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go +31 -0
  167. data/vendor/go.uber.org/zap/internal/color/color.go +44 -0
  168. data/vendor/go.uber.org/zap/internal/exit/exit.go +64 -0
  169. data/vendor/go.uber.org/zap/level.go +132 -0
  170. data/vendor/go.uber.org/zap/logger.go +344 -0
  171. data/vendor/go.uber.org/zap/options.go +140 -0
  172. data/vendor/go.uber.org/zap/sink.go +161 -0
  173. data/vendor/go.uber.org/zap/stacktrace.go +85 -0
  174. data/vendor/go.uber.org/zap/sugar.go +304 -0
  175. data/vendor/go.uber.org/zap/time.go +27 -0
  176. data/vendor/go.uber.org/zap/writer.go +99 -0
  177. data/vendor/go.uber.org/zap/zapcore/console_encoder.go +161 -0
  178. data/vendor/go.uber.org/zap/zapcore/core.go +113 -0
  179. data/vendor/go.uber.org/zap/zapcore/doc.go +24 -0
  180. data/vendor/go.uber.org/zap/zapcore/encoder.go +443 -0
  181. data/vendor/go.uber.org/zap/zapcore/entry.go +264 -0
  182. data/vendor/go.uber.org/zap/zapcore/error.go +115 -0
  183. data/vendor/go.uber.org/zap/zapcore/field.go +227 -0
  184. data/vendor/go.uber.org/zap/zapcore/hook.go +68 -0
  185. data/vendor/go.uber.org/zap/zapcore/increase_level.go +66 -0
  186. data/vendor/go.uber.org/zap/zapcore/json_encoder.go +534 -0
  187. data/vendor/go.uber.org/zap/zapcore/level.go +175 -0
  188. data/vendor/go.uber.org/zap/zapcore/level_strings.go +46 -0
  189. data/vendor/go.uber.org/zap/zapcore/marshaler.go +61 -0
  190. data/vendor/go.uber.org/zap/zapcore/memory_encoder.go +179 -0
  191. data/vendor/go.uber.org/zap/zapcore/sampler.go +208 -0
  192. data/vendor/go.uber.org/zap/zapcore/tee.go +81 -0
  193. data/vendor/go.uber.org/zap/zapcore/write_syncer.go +123 -0
  194. data/vendor/golang.org/x/net/AUTHORS +3 -0
  195. data/vendor/golang.org/x/net/CONTRIBUTORS +3 -0
  196. data/vendor/golang.org/x/net/LICENSE +27 -0
  197. data/vendor/golang.org/x/net/PATENTS +22 -0
  198. data/vendor/golang.org/x/net/context/context.go +56 -0
  199. data/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go +71 -0
  200. data/vendor/golang.org/x/net/context/go17.go +73 -0
  201. data/vendor/golang.org/x/net/context/go19.go +21 -0
  202. data/vendor/golang.org/x/net/context/pre_go17.go +301 -0
  203. data/vendor/golang.org/x/net/context/pre_go19.go +110 -0
  204. data/vendor/golang.org/x/oauth2/.travis.yml +13 -0
  205. data/vendor/golang.org/x/oauth2/AUTHORS +3 -0
  206. data/vendor/golang.org/x/oauth2/CONTRIBUTING.md +26 -0
  207. data/vendor/golang.org/x/oauth2/CONTRIBUTORS +3 -0
  208. data/vendor/golang.org/x/oauth2/LICENSE +27 -0
  209. data/vendor/golang.org/x/oauth2/README.md +36 -0
  210. data/vendor/golang.org/x/oauth2/go.mod +9 -0
  211. data/vendor/golang.org/x/oauth2/go.sum +361 -0
  212. data/vendor/golang.org/x/oauth2/internal/client_appengine.go +14 -0
  213. data/vendor/golang.org/x/oauth2/internal/doc.go +6 -0
  214. data/vendor/golang.org/x/oauth2/internal/oauth2.go +37 -0
  215. data/vendor/golang.org/x/oauth2/internal/token.go +294 -0
  216. data/vendor/golang.org/x/oauth2/internal/transport.go +33 -0
  217. data/vendor/golang.org/x/oauth2/oauth2.go +381 -0
  218. data/vendor/golang.org/x/oauth2/token.go +178 -0
  219. data/vendor/golang.org/x/oauth2/transport.go +89 -0
  220. data/vendor/google.golang.org/appengine/LICENSE +202 -0
  221. data/vendor/google.golang.org/appengine/internal/api.go +678 -0
  222. data/vendor/google.golang.org/appengine/internal/api_classic.go +169 -0
  223. data/vendor/google.golang.org/appengine/internal/api_common.go +123 -0
  224. data/vendor/google.golang.org/appengine/internal/app_id.go +28 -0
  225. data/vendor/google.golang.org/appengine/internal/base/api_base.pb.go +308 -0
  226. data/vendor/google.golang.org/appengine/internal/base/api_base.proto +33 -0
  227. data/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go +4367 -0
  228. data/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto +551 -0
  229. data/vendor/google.golang.org/appengine/internal/identity.go +55 -0
  230. data/vendor/google.golang.org/appengine/internal/identity_classic.go +61 -0
  231. data/vendor/google.golang.org/appengine/internal/identity_flex.go +11 -0
  232. data/vendor/google.golang.org/appengine/internal/identity_vm.go +134 -0
  233. data/vendor/google.golang.org/appengine/internal/internal.go +110 -0
  234. data/vendor/google.golang.org/appengine/internal/log/log_service.pb.go +1313 -0
  235. data/vendor/google.golang.org/appengine/internal/log/log_service.proto +150 -0
  236. data/vendor/google.golang.org/appengine/internal/main.go +16 -0
  237. data/vendor/google.golang.org/appengine/internal/main_common.go +7 -0
  238. data/vendor/google.golang.org/appengine/internal/main_vm.go +69 -0
  239. data/vendor/google.golang.org/appengine/internal/metadata.go +60 -0
  240. data/vendor/google.golang.org/appengine/internal/net.go +56 -0
  241. data/vendor/google.golang.org/appengine/internal/regen.sh +40 -0
  242. data/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go +361 -0
  243. data/vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto +44 -0
  244. data/vendor/google.golang.org/appengine/internal/transaction.go +115 -0
  245. data/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go +527 -0
  246. data/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto +64 -0
  247. data/vendor/google.golang.org/appengine/urlfetch/urlfetch.go +210 -0
  248. data/vendor/google.golang.org/protobuf/AUTHORS +3 -0
  249. data/vendor/google.golang.org/protobuf/CONTRIBUTORS +3 -0
  250. data/vendor/google.golang.org/protobuf/LICENSE +27 -0
  251. data/vendor/google.golang.org/protobuf/PATENTS +22 -0
  252. data/vendor/google.golang.org/protobuf/encoding/prototext/decode.go +773 -0
  253. data/vendor/google.golang.org/protobuf/encoding/prototext/doc.go +7 -0
  254. data/vendor/google.golang.org/protobuf/encoding/prototext/encode.go +371 -0
  255. data/vendor/google.golang.org/protobuf/encoding/protowire/wire.go +538 -0
  256. data/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go +318 -0
  257. data/vendor/google.golang.org/protobuf/internal/descopts/options.go +29 -0
  258. data/vendor/google.golang.org/protobuf/internal/detrand/rand.go +69 -0
  259. data/vendor/google.golang.org/protobuf/internal/encoding/defval/default.go +213 -0
  260. data/vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go +241 -0
  261. data/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go +207 -0
  262. data/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go +665 -0
  263. data/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go +190 -0
  264. data/vendor/google.golang.org/protobuf/internal/encoding/text/decode_string.go +161 -0
  265. data/vendor/google.golang.org/protobuf/internal/encoding/text/decode_token.go +373 -0
  266. data/vendor/google.golang.org/protobuf/internal/encoding/text/doc.go +29 -0
  267. data/vendor/google.golang.org/protobuf/internal/encoding/text/encode.go +265 -0
  268. data/vendor/google.golang.org/protobuf/internal/errors/errors.go +89 -0
  269. data/vendor/google.golang.org/protobuf/internal/errors/is_go112.go +39 -0
  270. data/vendor/google.golang.org/protobuf/internal/errors/is_go113.go +12 -0
  271. data/vendor/google.golang.org/protobuf/internal/filedesc/build.go +158 -0
  272. data/vendor/google.golang.org/protobuf/internal/filedesc/desc.go +631 -0
  273. data/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go +471 -0
  274. data/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go +704 -0
  275. data/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go +450 -0
  276. data/vendor/google.golang.org/protobuf/internal/filedesc/desc_list_gen.go +356 -0
  277. data/vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go +107 -0
  278. data/vendor/google.golang.org/protobuf/internal/filetype/build.go +297 -0
  279. data/vendor/google.golang.org/protobuf/internal/flags/flags.go +24 -0
  280. data/vendor/google.golang.org/protobuf/internal/flags/proto_legacy_disable.go +9 -0
  281. data/vendor/google.golang.org/protobuf/internal/flags/proto_legacy_enable.go +9 -0
  282. data/vendor/google.golang.org/protobuf/internal/genid/any_gen.go +34 -0
  283. data/vendor/google.golang.org/protobuf/internal/genid/api_gen.go +106 -0
  284. data/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go +829 -0
  285. data/vendor/google.golang.org/protobuf/internal/genid/doc.go +11 -0
  286. data/vendor/google.golang.org/protobuf/internal/genid/duration_gen.go +34 -0
  287. data/vendor/google.golang.org/protobuf/internal/genid/empty_gen.go +19 -0
  288. data/vendor/google.golang.org/protobuf/internal/genid/field_mask_gen.go +31 -0
  289. data/vendor/google.golang.org/protobuf/internal/genid/goname.go +25 -0
  290. data/vendor/google.golang.org/protobuf/internal/genid/map_entry.go +16 -0
  291. data/vendor/google.golang.org/protobuf/internal/genid/source_context_gen.go +31 -0
  292. data/vendor/google.golang.org/protobuf/internal/genid/struct_gen.go +116 -0
  293. data/vendor/google.golang.org/protobuf/internal/genid/timestamp_gen.go +34 -0
  294. data/vendor/google.golang.org/protobuf/internal/genid/type_gen.go +184 -0
  295. data/vendor/google.golang.org/protobuf/internal/genid/wrappers.go +13 -0
  296. data/vendor/google.golang.org/protobuf/internal/genid/wrappers_gen.go +175 -0
  297. data/vendor/google.golang.org/protobuf/internal/impl/api_export.go +177 -0
  298. data/vendor/google.golang.org/protobuf/internal/impl/checkinit.go +141 -0
  299. data/vendor/google.golang.org/protobuf/internal/impl/codec_extension.go +223 -0
  300. data/vendor/google.golang.org/protobuf/internal/impl/codec_field.go +830 -0
  301. data/vendor/google.golang.org/protobuf/internal/impl/codec_gen.go +5637 -0
  302. data/vendor/google.golang.org/protobuf/internal/impl/codec_map.go +388 -0
  303. data/vendor/google.golang.org/protobuf/internal/impl/codec_map_go111.go +37 -0
  304. data/vendor/google.golang.org/protobuf/internal/impl/codec_map_go112.go +11 -0
  305. data/vendor/google.golang.org/protobuf/internal/impl/codec_message.go +217 -0
  306. data/vendor/google.golang.org/protobuf/internal/impl/codec_messageset.go +123 -0
  307. data/vendor/google.golang.org/protobuf/internal/impl/codec_reflect.go +209 -0
  308. data/vendor/google.golang.org/protobuf/internal/impl/codec_tables.go +557 -0
  309. data/vendor/google.golang.org/protobuf/internal/impl/codec_unsafe.go +17 -0
  310. data/vendor/google.golang.org/protobuf/internal/impl/convert.go +496 -0
  311. data/vendor/google.golang.org/protobuf/internal/impl/convert_list.go +141 -0
  312. data/vendor/google.golang.org/protobuf/internal/impl/convert_map.go +121 -0
  313. data/vendor/google.golang.org/protobuf/internal/impl/decode.go +276 -0
  314. data/vendor/google.golang.org/protobuf/internal/impl/encode.go +201 -0
  315. data/vendor/google.golang.org/protobuf/internal/impl/enum.go +21 -0
  316. data/vendor/google.golang.org/protobuf/internal/impl/extension.go +156 -0
  317. data/vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go +219 -0
  318. data/vendor/google.golang.org/protobuf/internal/impl/legacy_export.go +92 -0
  319. data/vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go +176 -0
  320. data/vendor/google.golang.org/protobuf/internal/impl/legacy_file.go +81 -0
  321. data/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go +558 -0
  322. data/vendor/google.golang.org/protobuf/internal/impl/merge.go +176 -0
  323. data/vendor/google.golang.org/protobuf/internal/impl/merge_gen.go +209 -0
  324. data/vendor/google.golang.org/protobuf/internal/impl/message.go +276 -0
  325. data/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go +465 -0
  326. data/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go +543 -0
  327. data/vendor/google.golang.org/protobuf/internal/impl/message_reflect_gen.go +249 -0
  328. data/vendor/google.golang.org/protobuf/internal/impl/pointer_reflect.go +178 -0
  329. data/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go +174 -0
  330. data/vendor/google.golang.org/protobuf/internal/impl/validate.go +576 -0
  331. data/vendor/google.golang.org/protobuf/internal/impl/weak.go +74 -0
  332. data/vendor/google.golang.org/protobuf/internal/order/order.go +89 -0
  333. data/vendor/google.golang.org/protobuf/internal/order/range.go +115 -0
  334. data/vendor/google.golang.org/protobuf/internal/pragma/pragma.go +29 -0
  335. data/vendor/google.golang.org/protobuf/internal/set/ints.go +58 -0
  336. data/vendor/google.golang.org/protobuf/internal/strs/strings.go +196 -0
  337. data/vendor/google.golang.org/protobuf/internal/strs/strings_pure.go +27 -0
  338. data/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go +94 -0
  339. data/vendor/google.golang.org/protobuf/internal/version/version.go +79 -0
  340. data/vendor/google.golang.org/protobuf/proto/checkinit.go +71 -0
  341. data/vendor/google.golang.org/protobuf/proto/decode.go +278 -0
  342. data/vendor/google.golang.org/protobuf/proto/decode_gen.go +603 -0
  343. data/vendor/google.golang.org/protobuf/proto/doc.go +94 -0
  344. data/vendor/google.golang.org/protobuf/proto/encode.go +319 -0
  345. data/vendor/google.golang.org/protobuf/proto/encode_gen.go +97 -0
  346. data/vendor/google.golang.org/protobuf/proto/equal.go +167 -0
  347. data/vendor/google.golang.org/protobuf/proto/extension.go +92 -0
  348. data/vendor/google.golang.org/protobuf/proto/merge.go +139 -0
  349. data/vendor/google.golang.org/protobuf/proto/messageset.go +93 -0
  350. data/vendor/google.golang.org/protobuf/proto/proto.go +43 -0
  351. data/vendor/google.golang.org/protobuf/proto/proto_methods.go +19 -0
  352. data/vendor/google.golang.org/protobuf/proto/proto_reflect.go +19 -0
  353. data/vendor/google.golang.org/protobuf/proto/reset.go +43 -0
  354. data/vendor/google.golang.org/protobuf/proto/size.go +97 -0
  355. data/vendor/google.golang.org/protobuf/proto/size_gen.go +55 -0
  356. data/vendor/google.golang.org/protobuf/proto/wrappers.go +29 -0
  357. data/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go +276 -0
  358. data/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go +248 -0
  359. data/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go +286 -0
  360. data/vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go +374 -0
  361. data/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go +252 -0
  362. data/vendor/google.golang.org/protobuf/reflect/protoreflect/methods.go +77 -0
  363. data/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go +504 -0
  364. data/vendor/google.golang.org/protobuf/reflect/protoreflect/source.go +128 -0
  365. data/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go +461 -0
  366. data/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go +665 -0
  367. data/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go +285 -0
  368. data/vendor/google.golang.org/protobuf/reflect/protoreflect/value_pure.go +59 -0
  369. data/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go +411 -0
  370. data/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe.go +98 -0
  371. data/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go +869 -0
  372. data/vendor/google.golang.org/protobuf/runtime/protoiface/legacy.go +15 -0
  373. data/vendor/google.golang.org/protobuf/runtime/protoiface/methods.go +167 -0
  374. data/vendor/google.golang.org/protobuf/runtime/protoimpl/impl.go +44 -0
  375. data/vendor/google.golang.org/protobuf/runtime/protoimpl/version.go +56 -0
  376. data/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go +4039 -0
  377. data/vendor/modules.txt +79 -0
  378. metadata +495 -0
@@ -0,0 +1,678 @@
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
+ // +build !appengine
6
+
7
+ package internal
8
+
9
+ import (
10
+ "bytes"
11
+ "errors"
12
+ "fmt"
13
+ "io/ioutil"
14
+ "log"
15
+ "net"
16
+ "net/http"
17
+ "net/url"
18
+ "os"
19
+ "runtime"
20
+ "strconv"
21
+ "strings"
22
+ "sync"
23
+ "sync/atomic"
24
+ "time"
25
+
26
+ "github.com/golang/protobuf/proto"
27
+ netcontext "golang.org/x/net/context"
28
+
29
+ basepb "google.golang.org/appengine/internal/base"
30
+ logpb "google.golang.org/appengine/internal/log"
31
+ remotepb "google.golang.org/appengine/internal/remote_api"
32
+ )
33
+
34
+ const (
35
+ apiPath = "/rpc_http"
36
+ defaultTicketSuffix = "/default.20150612t184001.0"
37
+ )
38
+
39
+ var (
40
+ // Incoming headers.
41
+ ticketHeader = http.CanonicalHeaderKey("X-AppEngine-API-Ticket")
42
+ dapperHeader = http.CanonicalHeaderKey("X-Google-DapperTraceInfo")
43
+ traceHeader = http.CanonicalHeaderKey("X-Cloud-Trace-Context")
44
+ curNamespaceHeader = http.CanonicalHeaderKey("X-AppEngine-Current-Namespace")
45
+ userIPHeader = http.CanonicalHeaderKey("X-AppEngine-User-IP")
46
+ remoteAddrHeader = http.CanonicalHeaderKey("X-AppEngine-Remote-Addr")
47
+ devRequestIdHeader = http.CanonicalHeaderKey("X-Appengine-Dev-Request-Id")
48
+
49
+ // Outgoing headers.
50
+ apiEndpointHeader = http.CanonicalHeaderKey("X-Google-RPC-Service-Endpoint")
51
+ apiEndpointHeaderValue = []string{"app-engine-apis"}
52
+ apiMethodHeader = http.CanonicalHeaderKey("X-Google-RPC-Service-Method")
53
+ apiMethodHeaderValue = []string{"/VMRemoteAPI.CallRemoteAPI"}
54
+ apiDeadlineHeader = http.CanonicalHeaderKey("X-Google-RPC-Service-Deadline")
55
+ apiContentType = http.CanonicalHeaderKey("Content-Type")
56
+ apiContentTypeValue = []string{"application/octet-stream"}
57
+ logFlushHeader = http.CanonicalHeaderKey("X-AppEngine-Log-Flush-Count")
58
+
59
+ apiHTTPClient = &http.Client{
60
+ Transport: &http.Transport{
61
+ Proxy: http.ProxyFromEnvironment,
62
+ Dial: limitDial,
63
+ MaxIdleConns: 1000,
64
+ MaxIdleConnsPerHost: 10000,
65
+ IdleConnTimeout: 90 * time.Second,
66
+ },
67
+ }
68
+
69
+ defaultTicketOnce sync.Once
70
+ defaultTicket string
71
+ backgroundContextOnce sync.Once
72
+ backgroundContext netcontext.Context
73
+ )
74
+
75
+ func apiURL() *url.URL {
76
+ host, port := "appengine.googleapis.internal", "10001"
77
+ if h := os.Getenv("API_HOST"); h != "" {
78
+ host = h
79
+ }
80
+ if p := os.Getenv("API_PORT"); p != "" {
81
+ port = p
82
+ }
83
+ return &url.URL{
84
+ Scheme: "http",
85
+ Host: host + ":" + port,
86
+ Path: apiPath,
87
+ }
88
+ }
89
+
90
+ func handleHTTP(w http.ResponseWriter, r *http.Request) {
91
+ c := &context{
92
+ req: r,
93
+ outHeader: w.Header(),
94
+ apiURL: apiURL(),
95
+ }
96
+ r = r.WithContext(withContext(r.Context(), c))
97
+ c.req = r
98
+
99
+ stopFlushing := make(chan int)
100
+
101
+ // Patch up RemoteAddr so it looks reasonable.
102
+ if addr := r.Header.Get(userIPHeader); addr != "" {
103
+ r.RemoteAddr = addr
104
+ } else if addr = r.Header.Get(remoteAddrHeader); addr != "" {
105
+ r.RemoteAddr = addr
106
+ } else {
107
+ // Should not normally reach here, but pick a sensible default anyway.
108
+ r.RemoteAddr = "127.0.0.1"
109
+ }
110
+ // The address in the headers will most likely be of these forms:
111
+ // 123.123.123.123
112
+ // 2001:db8::1
113
+ // net/http.Request.RemoteAddr is specified to be in "IP:port" form.
114
+ if _, _, err := net.SplitHostPort(r.RemoteAddr); err != nil {
115
+ // Assume the remote address is only a host; add a default port.
116
+ r.RemoteAddr = net.JoinHostPort(r.RemoteAddr, "80")
117
+ }
118
+
119
+ // Start goroutine responsible for flushing app logs.
120
+ // This is done after adding c to ctx.m (and stopped before removing it)
121
+ // because flushing logs requires making an API call.
122
+ go c.logFlusher(stopFlushing)
123
+
124
+ executeRequestSafely(c, r)
125
+ c.outHeader = nil // make sure header changes aren't respected any more
126
+
127
+ stopFlushing <- 1 // any logging beyond this point will be dropped
128
+
129
+ // Flush any pending logs asynchronously.
130
+ c.pendingLogs.Lock()
131
+ flushes := c.pendingLogs.flushes
132
+ if len(c.pendingLogs.lines) > 0 {
133
+ flushes++
134
+ }
135
+ c.pendingLogs.Unlock()
136
+ flushed := make(chan struct{})
137
+ go func() {
138
+ defer close(flushed)
139
+ // Force a log flush, because with very short requests we
140
+ // may not ever flush logs.
141
+ c.flushLog(true)
142
+ }()
143
+ w.Header().Set(logFlushHeader, strconv.Itoa(flushes))
144
+
145
+ // Avoid nil Write call if c.Write is never called.
146
+ if c.outCode != 0 {
147
+ w.WriteHeader(c.outCode)
148
+ }
149
+ if c.outBody != nil {
150
+ w.Write(c.outBody)
151
+ }
152
+ // Wait for the last flush to complete before returning,
153
+ // otherwise the security ticket will not be valid.
154
+ <-flushed
155
+ }
156
+
157
+ func executeRequestSafely(c *context, r *http.Request) {
158
+ defer func() {
159
+ if x := recover(); x != nil {
160
+ logf(c, 4, "%s", renderPanic(x)) // 4 == critical
161
+ c.outCode = 500
162
+ }
163
+ }()
164
+
165
+ http.DefaultServeMux.ServeHTTP(c, r)
166
+ }
167
+
168
+ func renderPanic(x interface{}) string {
169
+ buf := make([]byte, 16<<10) // 16 KB should be plenty
170
+ buf = buf[:runtime.Stack(buf, false)]
171
+
172
+ // Remove the first few stack frames:
173
+ // this func
174
+ // the recover closure in the caller
175
+ // That will root the stack trace at the site of the panic.
176
+ const (
177
+ skipStart = "internal.renderPanic"
178
+ skipFrames = 2
179
+ )
180
+ start := bytes.Index(buf, []byte(skipStart))
181
+ p := start
182
+ for i := 0; i < skipFrames*2 && p+1 < len(buf); i++ {
183
+ p = bytes.IndexByte(buf[p+1:], '\n') + p + 1
184
+ if p < 0 {
185
+ break
186
+ }
187
+ }
188
+ if p >= 0 {
189
+ // buf[start:p+1] is the block to remove.
190
+ // Copy buf[p+1:] over buf[start:] and shrink buf.
191
+ copy(buf[start:], buf[p+1:])
192
+ buf = buf[:len(buf)-(p+1-start)]
193
+ }
194
+
195
+ // Add panic heading.
196
+ head := fmt.Sprintf("panic: %v\n\n", x)
197
+ if len(head) > len(buf) {
198
+ // Extremely unlikely to happen.
199
+ return head
200
+ }
201
+ copy(buf[len(head):], buf)
202
+ copy(buf, head)
203
+
204
+ return string(buf)
205
+ }
206
+
207
+ // context represents the context of an in-flight HTTP request.
208
+ // It implements the appengine.Context and http.ResponseWriter interfaces.
209
+ type context struct {
210
+ req *http.Request
211
+
212
+ outCode int
213
+ outHeader http.Header
214
+ outBody []byte
215
+
216
+ pendingLogs struct {
217
+ sync.Mutex
218
+ lines []*logpb.UserAppLogLine
219
+ flushes int
220
+ }
221
+
222
+ apiURL *url.URL
223
+ }
224
+
225
+ var contextKey = "holds a *context"
226
+
227
+ // jointContext joins two contexts in a superficial way.
228
+ // It takes values and timeouts from a base context, and only values from another context.
229
+ type jointContext struct {
230
+ base netcontext.Context
231
+ valuesOnly netcontext.Context
232
+ }
233
+
234
+ func (c jointContext) Deadline() (time.Time, bool) {
235
+ return c.base.Deadline()
236
+ }
237
+
238
+ func (c jointContext) Done() <-chan struct{} {
239
+ return c.base.Done()
240
+ }
241
+
242
+ func (c jointContext) Err() error {
243
+ return c.base.Err()
244
+ }
245
+
246
+ func (c jointContext) Value(key interface{}) interface{} {
247
+ if val := c.base.Value(key); val != nil {
248
+ return val
249
+ }
250
+ return c.valuesOnly.Value(key)
251
+ }
252
+
253
+ // fromContext returns the App Engine context or nil if ctx is not
254
+ // derived from an App Engine context.
255
+ func fromContext(ctx netcontext.Context) *context {
256
+ c, _ := ctx.Value(&contextKey).(*context)
257
+ return c
258
+ }
259
+
260
+ func withContext(parent netcontext.Context, c *context) netcontext.Context {
261
+ ctx := netcontext.WithValue(parent, &contextKey, c)
262
+ if ns := c.req.Header.Get(curNamespaceHeader); ns != "" {
263
+ ctx = withNamespace(ctx, ns)
264
+ }
265
+ return ctx
266
+ }
267
+
268
+ func toContext(c *context) netcontext.Context {
269
+ return withContext(netcontext.Background(), c)
270
+ }
271
+
272
+ func IncomingHeaders(ctx netcontext.Context) http.Header {
273
+ if c := fromContext(ctx); c != nil {
274
+ return c.req.Header
275
+ }
276
+ return nil
277
+ }
278
+
279
+ func ReqContext(req *http.Request) netcontext.Context {
280
+ return req.Context()
281
+ }
282
+
283
+ func WithContext(parent netcontext.Context, req *http.Request) netcontext.Context {
284
+ return jointContext{
285
+ base: parent,
286
+ valuesOnly: req.Context(),
287
+ }
288
+ }
289
+
290
+ // DefaultTicket returns a ticket used for background context or dev_appserver.
291
+ func DefaultTicket() string {
292
+ defaultTicketOnce.Do(func() {
293
+ if IsDevAppServer() {
294
+ defaultTicket = "testapp" + defaultTicketSuffix
295
+ return
296
+ }
297
+ appID := partitionlessAppID()
298
+ escAppID := strings.Replace(strings.Replace(appID, ":", "_", -1), ".", "_", -1)
299
+ majVersion := VersionID(nil)
300
+ if i := strings.Index(majVersion, "."); i > 0 {
301
+ majVersion = majVersion[:i]
302
+ }
303
+ defaultTicket = fmt.Sprintf("%s/%s.%s.%s", escAppID, ModuleName(nil), majVersion, InstanceID())
304
+ })
305
+ return defaultTicket
306
+ }
307
+
308
+ func BackgroundContext() netcontext.Context {
309
+ backgroundContextOnce.Do(func() {
310
+ // Compute background security ticket.
311
+ ticket := DefaultTicket()
312
+
313
+ c := &context{
314
+ req: &http.Request{
315
+ Header: http.Header{
316
+ ticketHeader: []string{ticket},
317
+ },
318
+ },
319
+ apiURL: apiURL(),
320
+ }
321
+ backgroundContext = toContext(c)
322
+
323
+ // TODO(dsymonds): Wire up the shutdown handler to do a final flush.
324
+ go c.logFlusher(make(chan int))
325
+ })
326
+
327
+ return backgroundContext
328
+ }
329
+
330
+ // RegisterTestRequest registers the HTTP request req for testing, such that
331
+ // any API calls are sent to the provided URL. It returns a closure to delete
332
+ // the registration.
333
+ // It should only be used by aetest package.
334
+ func RegisterTestRequest(req *http.Request, apiURL *url.URL, decorate func(netcontext.Context) netcontext.Context) (*http.Request, func()) {
335
+ c := &context{
336
+ req: req,
337
+ apiURL: apiURL,
338
+ }
339
+ ctx := withContext(decorate(req.Context()), c)
340
+ req = req.WithContext(ctx)
341
+ c.req = req
342
+ return req, func() {}
343
+ }
344
+
345
+ var errTimeout = &CallError{
346
+ Detail: "Deadline exceeded",
347
+ Code: int32(remotepb.RpcError_CANCELLED),
348
+ Timeout: true,
349
+ }
350
+
351
+ func (c *context) Header() http.Header { return c.outHeader }
352
+
353
+ // Copied from $GOROOT/src/pkg/net/http/transfer.go. Some response status
354
+ // codes do not permit a response body (nor response entity headers such as
355
+ // Content-Length, Content-Type, etc).
356
+ func bodyAllowedForStatus(status int) bool {
357
+ switch {
358
+ case status >= 100 && status <= 199:
359
+ return false
360
+ case status == 204:
361
+ return false
362
+ case status == 304:
363
+ return false
364
+ }
365
+ return true
366
+ }
367
+
368
+ func (c *context) Write(b []byte) (int, error) {
369
+ if c.outCode == 0 {
370
+ c.WriteHeader(http.StatusOK)
371
+ }
372
+ if len(b) > 0 && !bodyAllowedForStatus(c.outCode) {
373
+ return 0, http.ErrBodyNotAllowed
374
+ }
375
+ c.outBody = append(c.outBody, b...)
376
+ return len(b), nil
377
+ }
378
+
379
+ func (c *context) WriteHeader(code int) {
380
+ if c.outCode != 0 {
381
+ logf(c, 3, "WriteHeader called multiple times on request.") // error level
382
+ return
383
+ }
384
+ c.outCode = code
385
+ }
386
+
387
+ func (c *context) post(body []byte, timeout time.Duration) (b []byte, err error) {
388
+ hreq := &http.Request{
389
+ Method: "POST",
390
+ URL: c.apiURL,
391
+ Header: http.Header{
392
+ apiEndpointHeader: apiEndpointHeaderValue,
393
+ apiMethodHeader: apiMethodHeaderValue,
394
+ apiContentType: apiContentTypeValue,
395
+ apiDeadlineHeader: []string{strconv.FormatFloat(timeout.Seconds(), 'f', -1, 64)},
396
+ },
397
+ Body: ioutil.NopCloser(bytes.NewReader(body)),
398
+ ContentLength: int64(len(body)),
399
+ Host: c.apiURL.Host,
400
+ }
401
+ if info := c.req.Header.Get(dapperHeader); info != "" {
402
+ hreq.Header.Set(dapperHeader, info)
403
+ }
404
+ if info := c.req.Header.Get(traceHeader); info != "" {
405
+ hreq.Header.Set(traceHeader, info)
406
+ }
407
+
408
+ tr := apiHTTPClient.Transport.(*http.Transport)
409
+
410
+ var timedOut int32 // atomic; set to 1 if timed out
411
+ t := time.AfterFunc(timeout, func() {
412
+ atomic.StoreInt32(&timedOut, 1)
413
+ tr.CancelRequest(hreq)
414
+ })
415
+ defer t.Stop()
416
+ defer func() {
417
+ // Check if timeout was exceeded.
418
+ if atomic.LoadInt32(&timedOut) != 0 {
419
+ err = errTimeout
420
+ }
421
+ }()
422
+
423
+ hresp, err := apiHTTPClient.Do(hreq)
424
+ if err != nil {
425
+ return nil, &CallError{
426
+ Detail: fmt.Sprintf("service bridge HTTP failed: %v", err),
427
+ Code: int32(remotepb.RpcError_UNKNOWN),
428
+ }
429
+ }
430
+ defer hresp.Body.Close()
431
+ hrespBody, err := ioutil.ReadAll(hresp.Body)
432
+ if hresp.StatusCode != 200 {
433
+ return nil, &CallError{
434
+ Detail: fmt.Sprintf("service bridge returned HTTP %d (%q)", hresp.StatusCode, hrespBody),
435
+ Code: int32(remotepb.RpcError_UNKNOWN),
436
+ }
437
+ }
438
+ if err != nil {
439
+ return nil, &CallError{
440
+ Detail: fmt.Sprintf("service bridge response bad: %v", err),
441
+ Code: int32(remotepb.RpcError_UNKNOWN),
442
+ }
443
+ }
444
+ return hrespBody, nil
445
+ }
446
+
447
+ func Call(ctx netcontext.Context, service, method string, in, out proto.Message) error {
448
+ if ns := NamespaceFromContext(ctx); ns != "" {
449
+ if fn, ok := NamespaceMods[service]; ok {
450
+ fn(in, ns)
451
+ }
452
+ }
453
+
454
+ if f, ctx, ok := callOverrideFromContext(ctx); ok {
455
+ return f(ctx, service, method, in, out)
456
+ }
457
+
458
+ // Handle already-done contexts quickly.
459
+ select {
460
+ case <-ctx.Done():
461
+ return ctx.Err()
462
+ default:
463
+ }
464
+
465
+ c := fromContext(ctx)
466
+ if c == nil {
467
+ // Give a good error message rather than a panic lower down.
468
+ return errNotAppEngineContext
469
+ }
470
+
471
+ // Apply transaction modifications if we're in a transaction.
472
+ if t := transactionFromContext(ctx); t != nil {
473
+ if t.finished {
474
+ return errors.New("transaction context has expired")
475
+ }
476
+ applyTransaction(in, &t.transaction)
477
+ }
478
+
479
+ // Default RPC timeout is 60s.
480
+ timeout := 60 * time.Second
481
+ if deadline, ok := ctx.Deadline(); ok {
482
+ timeout = deadline.Sub(time.Now())
483
+ }
484
+
485
+ data, err := proto.Marshal(in)
486
+ if err != nil {
487
+ return err
488
+ }
489
+
490
+ ticket := c.req.Header.Get(ticketHeader)
491
+ // Use a test ticket under test environment.
492
+ if ticket == "" {
493
+ if appid := ctx.Value(&appIDOverrideKey); appid != nil {
494
+ ticket = appid.(string) + defaultTicketSuffix
495
+ }
496
+ }
497
+ // Fall back to use background ticket when the request ticket is not available in Flex or dev_appserver.
498
+ if ticket == "" {
499
+ ticket = DefaultTicket()
500
+ }
501
+ if dri := c.req.Header.Get(devRequestIdHeader); IsDevAppServer() && dri != "" {
502
+ ticket = dri
503
+ }
504
+ req := &remotepb.Request{
505
+ ServiceName: &service,
506
+ Method: &method,
507
+ Request: data,
508
+ RequestId: &ticket,
509
+ }
510
+ hreqBody, err := proto.Marshal(req)
511
+ if err != nil {
512
+ return err
513
+ }
514
+
515
+ hrespBody, err := c.post(hreqBody, timeout)
516
+ if err != nil {
517
+ return err
518
+ }
519
+
520
+ res := &remotepb.Response{}
521
+ if err := proto.Unmarshal(hrespBody, res); err != nil {
522
+ return err
523
+ }
524
+ if res.RpcError != nil {
525
+ ce := &CallError{
526
+ Detail: res.RpcError.GetDetail(),
527
+ Code: *res.RpcError.Code,
528
+ }
529
+ switch remotepb.RpcError_ErrorCode(ce.Code) {
530
+ case remotepb.RpcError_CANCELLED, remotepb.RpcError_DEADLINE_EXCEEDED:
531
+ ce.Timeout = true
532
+ }
533
+ return ce
534
+ }
535
+ if res.ApplicationError != nil {
536
+ return &APIError{
537
+ Service: *req.ServiceName,
538
+ Detail: res.ApplicationError.GetDetail(),
539
+ Code: *res.ApplicationError.Code,
540
+ }
541
+ }
542
+ if res.Exception != nil || res.JavaException != nil {
543
+ // This shouldn't happen, but let's be defensive.
544
+ return &CallError{
545
+ Detail: "service bridge returned exception",
546
+ Code: int32(remotepb.RpcError_UNKNOWN),
547
+ }
548
+ }
549
+ return proto.Unmarshal(res.Response, out)
550
+ }
551
+
552
+ func (c *context) Request() *http.Request {
553
+ return c.req
554
+ }
555
+
556
+ func (c *context) addLogLine(ll *logpb.UserAppLogLine) {
557
+ // Truncate long log lines.
558
+ // TODO(dsymonds): Check if this is still necessary.
559
+ const lim = 8 << 10
560
+ if len(*ll.Message) > lim {
561
+ suffix := fmt.Sprintf("...(length %d)", len(*ll.Message))
562
+ ll.Message = proto.String((*ll.Message)[:lim-len(suffix)] + suffix)
563
+ }
564
+
565
+ c.pendingLogs.Lock()
566
+ c.pendingLogs.lines = append(c.pendingLogs.lines, ll)
567
+ c.pendingLogs.Unlock()
568
+ }
569
+
570
+ var logLevelName = map[int64]string{
571
+ 0: "DEBUG",
572
+ 1: "INFO",
573
+ 2: "WARNING",
574
+ 3: "ERROR",
575
+ 4: "CRITICAL",
576
+ }
577
+
578
+ func logf(c *context, level int64, format string, args ...interface{}) {
579
+ if c == nil {
580
+ panic("not an App Engine context")
581
+ }
582
+ s := fmt.Sprintf(format, args...)
583
+ s = strings.TrimRight(s, "\n") // Remove any trailing newline characters.
584
+ c.addLogLine(&logpb.UserAppLogLine{
585
+ TimestampUsec: proto.Int64(time.Now().UnixNano() / 1e3),
586
+ Level: &level,
587
+ Message: &s,
588
+ })
589
+ // Only duplicate log to stderr if not running on App Engine second generation
590
+ if !IsSecondGen() {
591
+ log.Print(logLevelName[level] + ": " + s)
592
+ }
593
+ }
594
+
595
+ // flushLog attempts to flush any pending logs to the appserver.
596
+ // It should not be called concurrently.
597
+ func (c *context) flushLog(force bool) (flushed bool) {
598
+ c.pendingLogs.Lock()
599
+ // Grab up to 30 MB. We can get away with up to 32 MB, but let's be cautious.
600
+ n, rem := 0, 30<<20
601
+ for ; n < len(c.pendingLogs.lines); n++ {
602
+ ll := c.pendingLogs.lines[n]
603
+ // Each log line will require about 3 bytes of overhead.
604
+ nb := proto.Size(ll) + 3
605
+ if nb > rem {
606
+ break
607
+ }
608
+ rem -= nb
609
+ }
610
+ lines := c.pendingLogs.lines[:n]
611
+ c.pendingLogs.lines = c.pendingLogs.lines[n:]
612
+ c.pendingLogs.Unlock()
613
+
614
+ if len(lines) == 0 && !force {
615
+ // Nothing to flush.
616
+ return false
617
+ }
618
+
619
+ rescueLogs := false
620
+ defer func() {
621
+ if rescueLogs {
622
+ c.pendingLogs.Lock()
623
+ c.pendingLogs.lines = append(lines, c.pendingLogs.lines...)
624
+ c.pendingLogs.Unlock()
625
+ }
626
+ }()
627
+
628
+ buf, err := proto.Marshal(&logpb.UserAppLogGroup{
629
+ LogLine: lines,
630
+ })
631
+ if err != nil {
632
+ log.Printf("internal.flushLog: marshaling UserAppLogGroup: %v", err)
633
+ rescueLogs = true
634
+ return false
635
+ }
636
+
637
+ req := &logpb.FlushRequest{
638
+ Logs: buf,
639
+ }
640
+ res := &basepb.VoidProto{}
641
+ c.pendingLogs.Lock()
642
+ c.pendingLogs.flushes++
643
+ c.pendingLogs.Unlock()
644
+ if err := Call(toContext(c), "logservice", "Flush", req, res); err != nil {
645
+ log.Printf("internal.flushLog: Flush RPC: %v", err)
646
+ rescueLogs = true
647
+ return false
648
+ }
649
+ return true
650
+ }
651
+
652
+ const (
653
+ // Log flushing parameters.
654
+ flushInterval = 1 * time.Second
655
+ forceFlushInterval = 60 * time.Second
656
+ )
657
+
658
+ func (c *context) logFlusher(stop <-chan int) {
659
+ lastFlush := time.Now()
660
+ tick := time.NewTicker(flushInterval)
661
+ for {
662
+ select {
663
+ case <-stop:
664
+ // Request finished.
665
+ tick.Stop()
666
+ return
667
+ case <-tick.C:
668
+ force := time.Now().Sub(lastFlush) > forceFlushInterval
669
+ if c.flushLog(force) {
670
+ lastFlush = time.Now()
671
+ }
672
+ }
673
+ }
674
+ }
675
+
676
+ func ContextForTesting(req *http.Request) netcontext.Context {
677
+ return toContext(&context{req: req})
678
+ }