diff --git a/apisix/plugins/grpc-web.lua b/apisix/plugins/grpc-web.lua index 642a0ab92c20..da059822e8a3 100644 --- a/apisix/plugins/grpc-web.lua +++ b/apisix/plugins/grpc-web.lua @@ -43,7 +43,7 @@ local schema = { properties = { cors_allow_headers = { description = - "multiple header use ',' to split. default: content-type,x-grpc-web,x-user-agent.", + "multiple header use ',' to split. default: content-type,x-grpc-web,x-user-agent.", type = "string", default = DEFAULT_CORS_ALLOW_HEADERS } @@ -134,20 +134,14 @@ function _M.access(conf, ctx) -- set context variable encoding method ctx.grpc_web_encoding = encoding - -- set grpc path - if not (ctx.curr_req_matched and ctx.curr_req_matched[":ext"]) then - core.log.error("routing configuration error, grpc-web plugin only supports ", - "`prefix matching` pattern routing") - return exit(ctx, 400) - end - local path = ctx.curr_req_matched[":ext"] - if path:byte(1) ~= core.string.byte("/") then - path = "/" .. path + if path and path ~= "" then + if path:byte(1) ~= core.string.byte("/") then + path = "/" .. path + end + req_set_uri(path) end - req_set_uri(path) - -- set grpc body local body, err = core.request.get_body() if err or not body then diff --git a/docs/en/latest/plugins/grpc-web.md b/docs/en/latest/plugins/grpc-web.md index 87391453a170..ea796b513aab 100644 --- a/docs/en/latest/plugins/grpc-web.md +++ b/docs/en/latest/plugins/grpc-web.md @@ -68,14 +68,6 @@ curl http://127.0.0.1:9180/apisix/admin/routes/1 -H "X-API-KEY: $admin_key" -X P }' ``` -:::info IMPORTANT - -While using the `grpc-web` Plugin, always use a prefix matching pattern (`/*`, `/grpc/example/*`) for matching Routes. This is because the gRPC Web client passes the package name, the service interface name, the method name and other information in the proto in the URI. For example, `/path/a6.RouteService/Insert`. - -So, when absolute matching is used, the Plugin would not be hit and the information from the proto would not be extracted. - -::: - ## Example usage Refer to [gRPC-Web Client Runtime Library](https://www.npmjs.com/package/grpc-web) or [Apache APISIX gRPC Web Test Framework](https://github.com/apache/apisix/tree/master/t/plugin/grpc-web) to learn how to setup your web client. diff --git a/t/plugin/grpc-web.t b/t/plugin/grpc-web.t index 9ba711850598..aaf444d964d8 100644 --- a/t/plugin/grpc-web.t +++ b/t/plugin/grpc-web.t @@ -137,7 +137,7 @@ request Content-Type: `application/json` invalid content_by_lua_block { local config = { - uri = "/grpc/web2/a6.RouteService/GetRoute", + uri = "/grpc/web/a6.RouteService/GetRoute", upstream = { scheme = "grpc", type = "roundrobin", @@ -168,15 +168,14 @@ passed === TEST 8: test route (absolute match) --- request -POST /grpc/web2/a6.RouteService/GetRoute +POST /grpc/web/a6.RouteService/GetRoute +hello --- more_headers Content-Type: application/grpc-web ---- error_code: 400 +--- error_code: 200 --- response_headers Access-Control-Allow-Origin: * -Content-Type: text/html ---- error_log -routing configuration error, grpc-web plugin only supports `prefix matching` pattern routing +Content-Type: application/grpc-web