I am using an official example of a gRPC server:
https://grpc.io/docs/languages/python/quickstart/Based on
grpcurl:
% grpcurl -import-path ../../protos -proto helloworld.proto -plaintext -d '{"name": "niko"}' -H 'Content-Type: application/grpc+json' localhost:50051 helloworld.Greeter/SayHello
{
"message": "Hello, niko!"
}
Based on
nghttp:
# json_data = '{"name": "niko"}'
# compressed_flag = 00
# message_length = 00000010
# message_binary = 7b226e616d65223a20226e696b6f227d
echo -n '00000000107b226e616d65223a20226e696b6f227d' | xxd -r -p - frame.bin% nghttp -H ":method: POST" -H "Content-Type: application/grpc+json" -H "TE: trailers" --data=frame.bin http://localhost:50051/helloworld.Greeter/SayHello --verbose
[ 0.004] Connected
[ 0.004] recv SETTINGS frame <length=24, flags=0x00, stream_id=0>
(niv=4)
[SETTINGS_INITIAL_WINDOW_SIZE(0x04):4194304]
[SETTINGS_MAX_FRAME_SIZE(0x05):4194304]
[SETTINGS_MAX_HEADER_LIST_SIZE(0x06):8192]
[UNKNOWN(0xfe03):1]
[ 0.004] recv WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0>
(window_size_increment=4128769)
[ 0.004] send SETTINGS frame <length=12, flags=0x00, stream_id=0>
(niv=2)
[SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
[SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
[ 0.004] send SETTINGS frame <length=0, flags=0x01, stream_id=0>
; ACK
(niv=0)
[ 0.004] send PRIORITY frame <length=5, flags=0x00, stream_id=3>
(dep_stream_id=0, weight=201, exclusive=0)
[ 0.004] send PRIORITY frame <length=5, flags=0x00, stream_id=5>
(dep_stream_id=0, weight=101, exclusive=0)
[ 0.004] send PRIORITY frame <length=5, flags=0x00, stream_id=7>
(dep_stream_id=0, weight=1, exclusive=0)
[ 0.004] send PRIORITY frame <length=5, flags=0x00, stream_id=9>
(dep_stream_id=7, weight=1, exclusive=0)
[ 0.004] send PRIORITY frame <length=5, flags=0x00, stream_id=11>
(dep_stream_id=3, weight=1, exclusive=0)
[ 0.004] send HEADERS frame <length=95, flags=0x24, stream_id=13>
; END_HEADERS | PRIORITY
(padlen=0, dep_stream_id=11, weight=16, exclusive=0)
; Open new stream
:method: POST
:path: /helloworld.Greeter/SayHello
:scheme: http
:authority: localhost:50051
accept: */*
accept-encoding: gzip, deflate
user-agent: nghttp2/1.52.0
content-length: 21
content-type: application/grpc+json
te: trailers
[ 0.004] send DATA frame <length=21, flags=0x01, stream_id=13>
; END_STREAM
[ 0.005] recv SETTINGS frame <length=0, flags=0x01, stream_id=0>
; ACK
(niv=0)
[ 0.005] recv WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0>
(window_size_increment=21)
[ 0.005] recv PING frame <length=8, flags=0x00, stream_id=0>
(opaque_data=0000000000000000)
[ 0.005] send PING frame <length=8, flags=0x01, stream_id=0>
; ACK
(opaque_data=0000000000000000)
[ 0.006] recv (stream_id=13) :status: 200
[ 0.006] recv (stream_id=13) content-type: application/grpc
[ 0.006] recv (stream_id=13) grpc-status: 13
[ 0.006] recv (stream_id=13) grpc-message: Exception deserializing request![ 0.006] recv HEADERS frame <length=95, flags=0x05, stream_id=13>
; END_STREAM | END_HEADERS
(padlen=0)
; First response header
[ 0.006] send GOAWAY frame <length=8, flags=0x00, stream_id=0>
(last_stream_id=0, error_code=NO_ERROR(0x00), opaque_data(0)=[])
The
server complains in the same way:
% python3 greeter_server.pyServer started, listening on 50051
ERROR:grpc._common:Exception deserializing message!
Traceback (most recent call last):
File "/Library/Python/3.9/site-packages/grpc/_common.py", line 90, in _transform
return transformer(message)
google.protobuf.message.DecodeError: Error parsing messageWould you be so kind to help me out and advise what I am doing wrong?