fullstorydev / grpcurl

Like cURL, but for gRPC: Command-line tool for interacting with gRPC servers
MIT License
10.35k stars 497 forks source link

Unix Domain Socket connection should use `localhost` authority header convention by default #442

Closed kriswuollett closed 5 months ago

kriswuollett commented 5 months ago

The grpcurl client fails to work with the Rust tonic-based server on a Unix domain socket because the server expects an authority header.

% grpcurl -vv -d @ -plaintext -unix -protoset REDACTED/descriptor.bin  REDACTED/service.socket REDACTED/Reverse <<EOM
{ "text": "Hello, world!" }
EOM

Resolved method descriptor:
rpc Reverse ( .REDACTED.ReverseRequest ) returns ( .REDACTED.ReverseResponse );

Request metadata to send:
(empty)

Response headers received:
(empty)

Response trailers received:
(empty)
Sent 1 request and received 0 responses
ERROR:
  Code: Internal
  Message: stream terminated by RST_STREAM with error code: PROTOCOL_ERROR

For example, I'm able to use the Swift gRPC client fine since it sets authority.

Both tonic/h2 and kubernetes use localhost as the authority when using Unix domain sockets. The grpcurl client should as well.

The workaround, however inconvenient, is to manually specify the authority as localhost:

% grpcurl -vv -d @ -plaintext -unix -protoset REDACTED/descriptor.bin -authority "localhost"  REDACTED/service.socket REDACTED/Reverse <<EOM
{ "text": "Hello, world!" }
EOM

Resolved method descriptor:
rpc Reverse ( .REDACTED.ReverseRequest ) returns ( .REDACTED.ReverseResponse );

Request metadata to send:
(empty)

Response headers received:
content-type: application/grpc
date: Fri, 26 Jan 2024 02:46:38 GMT

Estimated response size: 15 bytes

Response contents:
{
  "text": "!dlrow ,olleH"
}

Response trailers received:
(empty)
Sent 1 request and received 1 response
dragonsinth commented 5 months ago

Seems reasonable. Maybe a patch to default authority to localhost for unix sockets if not otherwise specified?

kriswuollett commented 5 months ago

Yes, something simple like that. I can take a look at doing that tomorrow.