diff --git a/t/plugin/grpc-web.t b/t/plugin/grpc-web.t index 1d3a3647e705..ac8f689ee9af 100644 --- a/t/plugin/grpc-web.t +++ b/t/plugin/grpc-web.t @@ -69,15 +69,14 @@ passed === TEST 2: Proxy unary request using APISIX with trailers gRPC-Web plugin +Status should be printed at most once per request, otherwise this would be out of specification. --- exec node ./t/plugin/grpc-web/client.js BIN UNARY node ./t/plugin/grpc-web/client.js TEXT UNARY --- response_body Status: { code: 0, details: '', metadata: {} } -Status: { code: 0, details: '', metadata: {} } {"name":"hello","path":"/hello"} Status: { code: 0, details: '', metadata: {} } -Status: { code: 0, details: '', metadata: {} } {"name":"hello","path":"/hello"} @@ -90,11 +89,9 @@ node ./t/plugin/grpc-web/client.js TEXT STREAM {"name":"hello","path":"/hello"} {"name":"world","path":"/world"} Status: { code: 0, details: '', metadata: {} } -Status: { code: 0, details: '', metadata: {} } {"name":"hello","path":"/hello"} {"name":"world","path":"/world"} Status: { code: 0, details: '', metadata: {} } -Status: { code: 0, details: '', metadata: {} } @@ -112,7 +109,7 @@ Access-Control-Allow-Origin: * === TEST 5: test non-options request --- request GET /grpc/web/a6.RouteService/GetRoute ---- error_code: 400 +--- error_code: 405 --- response_headers Access-Control-Allow-Origin: * --- error_log @@ -128,7 +125,7 @@ Content-Type: application/json --- error_code: 400 --- response_headers Access-Control-Allow-Origin: * -Content-Type: application/json +Content-Type: text/html --- error_log request Content-Type: `application/json` invalid @@ -177,7 +174,7 @@ Content-Type: application/grpc-web --- error_code: 400 --- response_headers Access-Control-Allow-Origin: * -Content-Type: application/grpc-web +Content-Type: text/html --- error_log routing configuration error, grpc-web plugin only supports `prefix matching` pattern routing @@ -226,33 +223,35 @@ passed === TEST 10: don't override Access-Control-Allow-Origin header in response ---- request -POST /grpc/web/a6.RouteService/GetRoute -{} ---- more_headers -Origin: http://test.com -Content-Type: application/grpc-web ---- response_headers -Access-Control-Allow-Origin: http://test.com -Content-Type: application/grpc-web +--- exec +curl -iv --location 'http://127.0.0.1:1984/grpc/web/a6.RouteService/GetRoute' \ +--header 'Origin: http://test.com' \ +--header 'Content-Type: application/grpc-web-text' \ +--data-raw 'AAAAAAcKBXdvcmxkCgo=' +--- response_body eval +qr/HTTP\/1.1 200 OK/ and qr/Access-Control-Allow-Origin: http:\/\/test.com/ === TEST 11: check for Access-Control-Expose-Headers header in response ---- request -POST /grpc/web/a6.RouteService/GetRoute -{} ---- more_headers -Origin: http://test.com -Content-Type: application/grpc-web ---- response_headers -Access-Control-Allow-Origin: http://test.com -Access-Control-Expose-Headers: grpc-message,grpc-status -Content-Type: application/grpc-web +--- exec +curl -iv --location 'http://127.0.0.1:1984/grpc/web/a6.RouteService/GetRoute' \ +--header 'Origin: http://test.com' \ +--header 'Content-Type: application/grpc-web-text' \ +--data-raw 'AAAAAAcKBXdvcmxkCgo=' +--- response_body eval +qr/Access-Control-Expose-Headers: grpc-message,grpc-status/ and qr/Access-Control-Allow-Origin: http:\/\/test.com/ === TEST 12: verify trailers in response +According to the gRPC documentation, the grpc-web proxy should not retain trailers received from upstream when +forwarding them, as the reference implementation envoy does, so the current test case is status quo rather +than "correct", which is not expected to have an impact since browsers ignore trailers. +Currently there is no API or hook point available in nginx/lua-nginx-module to remove specified trailers +on demand (grpc_hide_header can do it but it affects the grpc proxy), and some nginx patches may be needed +to allow for code-controlled removal of the trailer at runtime. +When we implement that, this use case will be removed. --- exec curl -iv --location 'http://127.0.0.1:1984/grpc/web/a6.RouteService/GetRoute' \ --header 'Content-Type: application/grpc-web+proto' \