Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gRPC metadata.NewContext and metadata.FromContext should not be used #624

Closed
dfawley opened this issue May 10, 2017 · 7 comments
Closed
Assignees

Comments

@dfawley
Copy link
Contributor

dfawley commented May 10, 2017

After some recent changes in grpc-go, metadata.NewContext now assumes you are accessing the outgoing metadata, and metadata.FromContext assumes you are retrieving the incoming credentials. We are planning on removing these functions due to this ambiguity and the fact that the behavior was changed to avoid unintentional forwarding of metadata when a server makes outgoing grpc calls.

For more information, please see:

grpc/grpc-go#1219
grpc/proposal#25
https://groups.google.com/forum/#!topic/grpc-io/-qM_UnYFHJs

@dfawley
Copy link
Contributor Author

dfawley commented May 10, 2017

I can make this conversion, but in the process, I've run into a handful of auto-generated files with an "insertXGoog" function that does this. E.g.

https://github.com/dfawley/google-cloud-go/blob/master/speech/apiv1beta1/doc.go

What generates these files, and how can I update that?

@dfawley
Copy link
Contributor Author

dfawley commented May 10, 2017

Note that insertXGoog is currently broken (due to grpc/grpc-go#1157), and it will overwrite the existing outgoing metadata in the context. It should be using FromOutgoingContext instead of FromContext.

@rakyll
Copy link
Contributor

rakyll commented May 10, 2017

/cc @pongad @jba

@pongad
Copy link
Contributor

pongad commented May 10, 2017

@dfawley It is generated from here. I can make this change pretty easily.

One question though, you said that it will "overwrite the existing outgoing metadata", but its goal is to change the outgoing metadata. Did you mean it will inadvertently overwrite incoming metadata? Just wanted to make sure I understand this right.

@dfawley
Copy link
Contributor Author

dfawley commented May 10, 2017

It's attempting to add a field to the outgoing metadata, but with the current grpc behavior, it will instead delete the existing outgoing metadata, then merge the additional field with the incoming metadata and use that as the new outgoing metadata.

@pongad
Copy link
Contributor

pongad commented May 10, 2017

Ah I get it now. I'll make this fix.

pongad added a commit to googleapis/gapic-generator that referenced this issue May 12, 2017
Updates googleapis/google-cloud-go#624.

metadata.FromContext and metdata.NewContext
are replaced by metadata.{New,From}{Incoming,Outgoing}Context.

Generated unit tests now verify that x-goog-api-client header
is inserted.

Additionally, clients now save a string slice containing x-goog-api-client
header value instead of the value by itself.
This is a small optimization so that we don't create a new slice every time.
@dfawley
Copy link
Contributor Author

dfawley commented May 19, 2017

Fixed via googleapis/gapic-generator#1262 and dc9545a.

@dfawley dfawley closed this as completed May 19, 2017
garrettjonesgoogle added a commit to googleapis/gapic-generator that referenced this issue May 27, 2017
* Fix JSON pretty print in Ruby sample (#1254)

* Ruby: README Overhaul (feat. examples) (#1245)

* go: use new metadata methods (#1262)

Updates googleapis/google-cloud-go#624.

metadata.FromContext and metdata.NewContext
are replaced by metadata.{New,From}{Incoming,Outgoing}Context.

Generated unit tests now verify that x-goog-api-client header
is inserted.

Additionally, clients now save a string slice containing x-goog-api-client
header value instead of the value by itself.
This is a small optimization so that we don't create a new slice every time.

* Change media body from an object to a string (#1256)

Samples fail before sending a request if the media body is an object.

* Fix NONE auth Go sample (#1261)

* Change Node.js unit test require. (#1264)

* Ruby: Allow doc gapic generation to generate tests. (#1266)

* Ruby: Remove aliasing from method samples and tests (#1253)

* Ruby: Fix broken baselines from aliasing fix (#1269)

* Remove unused code (#1270)

* Python: README overhaul. (#1263)

* Ruby: Update gemspec and add useful metadata files (#1258)

* Ruby: Update gemspec and add useful metadata files

* Specify HTTP client when constructing client (#1275)

If a HTTP client is not passed to `build`, the Google API Python client
will create a default one and attempt to authenticate it. This causes
failures in environments where ADC auth is not available (Travis).

In any case, it's not useful to access any auth code in the mock tests.
This commit removes that possibility.

* Fix JSON print in Ruby (#1274)

It turns out that `to_h` is not a method available on every object
returned by the samples at the moment. Also, there's some kind of
decoding bug showing up in certain samples where the JSON module is
unable to unparse the response.

It's troublesome to have so much boilerplate just to pretty print. This
commit removes the pretty calls in favor of the vanilla `to_json` method
implemented by the base model class in the Ruby client. In the future,
once the bugs w.r.t `pretty_generate` have been resolved, we can revert.

* NodeJS: Update version index to support partial veneers (#1267)

* NodeJS: Updates to package.json (#1268)

* Migrate import disambiguation to Python MVVM (#1243)

* Fix Node package.json (#1282)

* go: use time.UnixNano instead of testutil.UIDSpace (#1279)

Since generated code should be testable from api-client-staging repo,
we want to reduce dependency on other cloud.google.com/go packages,
especially internal ones.

Clients will still depend on testutil for ProjID and TokenSource.
This is OK, since they can be easily reimplemented in google-client-staging
repo itself.

* Update Java grpc metadata for new staging structure (#1265)

* PHP: share credentials with operations client (#1283)

* java: move CredentialProvider up to ClientSettings (#1251)

This implements the client side changes to support
googleapis/gax-java#305.

* NodeJS: generate readme. (#1240)

* NodeJS: Small additions to the package.json (#1289)

* NodeJS: Use fileheader for copyright lines. (#1293)

* NodeJS: Use correct casing for partial veneers (#1295)

* NodeJS: Small readme fix from GCN reviews (#1294)

* go: make longrunning methods use generated longrunning client (#1288)

The cloud.google.com/go/longrunning package will need to change
slightly to accomodate this change.

xGoogHeader is now gone from the generated longrunnging types,
as the header will be automatically inserted by LROClient itself.

* NodeJS: Update partial veneer surface to add api documentation. (#1296)

* NodeJS: Metadata updates. (#1298)

* Readme: Update readme templates to add api summaries. (#1299)

* Add PHP Exception tests (#951)

* Add exception tests
* Remove unnecessary checks in exception tests

* Process markdown cloud links for PHP (#1091)

* Process markdown cloud links for PHP
* Restructure comment formatting

* go: return error creating LRO client instead of panicking (#1300)
andreamlin added a commit to googleapis/gapic-generator that referenced this issue Jun 5, 2017
* merge master to Discogapic (#1304)

* Fix JSON pretty print in Ruby sample (#1254)

* Ruby: README Overhaul (feat. examples) (#1245)

* go: use new metadata methods (#1262)

Updates googleapis/google-cloud-go#624.

metadata.FromContext and metdata.NewContext
are replaced by metadata.{New,From}{Incoming,Outgoing}Context.

Generated unit tests now verify that x-goog-api-client header
is inserted.

Additionally, clients now save a string slice containing x-goog-api-client
header value instead of the value by itself.
This is a small optimization so that we don't create a new slice every time.

* Change media body from an object to a string (#1256)

Samples fail before sending a request if the media body is an object.

* Fix NONE auth Go sample (#1261)

* Change Node.js unit test require. (#1264)

* Ruby: Allow doc gapic generation to generate tests. (#1266)

* Ruby: Remove aliasing from method samples and tests (#1253)

* Ruby: Fix broken baselines from aliasing fix (#1269)

* Remove unused code (#1270)

* Python: README overhaul. (#1263)

* Ruby: Update gemspec and add useful metadata files (#1258)

* Ruby: Update gemspec and add useful metadata files

* Specify HTTP client when constructing client (#1275)

If a HTTP client is not passed to `build`, the Google API Python client
will create a default one and attempt to authenticate it. This causes
failures in environments where ADC auth is not available (Travis).

In any case, it's not useful to access any auth code in the mock tests.
This commit removes that possibility.

* Fix JSON print in Ruby (#1274)

It turns out that `to_h` is not a method available on every object
returned by the samples at the moment. Also, there's some kind of
decoding bug showing up in certain samples where the JSON module is
unable to unparse the response.

It's troublesome to have so much boilerplate just to pretty print. This
commit removes the pretty calls in favor of the vanilla `to_json` method
implemented by the base model class in the Ruby client. In the future,
once the bugs w.r.t `pretty_generate` have been resolved, we can revert.

* NodeJS: Update version index to support partial veneers (#1267)

* NodeJS: Updates to package.json (#1268)

* Migrate import disambiguation to Python MVVM (#1243)

* Fix Node package.json (#1282)

* go: use time.UnixNano instead of testutil.UIDSpace (#1279)

Since generated code should be testable from api-client-staging repo,
we want to reduce dependency on other cloud.google.com/go packages,
especially internal ones.

Clients will still depend on testutil for ProjID and TokenSource.
This is OK, since they can be easily reimplemented in google-client-staging
repo itself.

* Update Java grpc metadata for new staging structure (#1265)

* PHP: share credentials with operations client (#1283)

* java: move CredentialProvider up to ClientSettings (#1251)

This implements the client side changes to support
googleapis/gax-java#305.

* NodeJS: generate readme. (#1240)

* NodeJS: Small additions to the package.json (#1289)

* NodeJS: Use fileheader for copyright lines. (#1293)

* NodeJS: Use correct casing for partial veneers (#1295)

* NodeJS: Small readme fix from GCN reviews (#1294)

* go: make longrunning methods use generated longrunning client (#1288)

The cloud.google.com/go/longrunning package will need to change
slightly to accomodate this change.

xGoogHeader is now gone from the generated longrunnging types,
as the header will be automatically inserted by LROClient itself.

* NodeJS: Update partial veneer surface to add api documentation. (#1296)

* NodeJS: Metadata updates. (#1298)

* Readme: Update readme templates to add api summaries. (#1299)

* Add PHP Exception tests (#951)

* Add exception tests
* Remove unnecessary checks in exception tests

* Process markdown cloud links for PHP (#1091)

* Process markdown cloud links for PHP
* Restructure comment formatting

* go: return error creating LRO client instead of panicking (#1300)

* fails b/c Node.empty() uses null params

* one test passes

* all current tests pass

* tests for Node parent()

* Test

* removed Method.empty():

* reordering methods for convention

* made Node.from(Node, path) methods package private

* removed path() from Document, Schema, and Method

* removed static constructors with empty parent node
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants