Skip to content

API returns a stream stops streaming after 8 seconds when accessed through grpc-gateway using HTTP #204

@sloppycoder

Description

@sloppycoder

I'm stumped by this problem, please help.

I used grapi to create a server skeleton, then implemented an API that returns a stream.

# proto file
rpc GetTopAccounts (GetTopAccountRequest) returns (stream Account) {

# implementation
for {
for _, acc := range accounts {
		err = svr.Send(acc)
		if err != nil {
			log.Printf("error streaming %+v", err)
			return nil
		}
	}

	log.Printf("iteration %d", i)
	time.Sleep(1000 * time.Millisecond)
}

When calling this API with golang gRPC client, things work fine. However, if I use curl to access the same API using HTTP, the response will stop streaming after exactly 8 seconds.

Here is my code repo
To run it:

go run ./cmd/server

#open another window

curl http://localhost:3100/top/10
...
{"result":{"account_id":"123"}}
{"result":{"account_id":"123"}}
{"result":{"account_id":"123"}}
# after exactly 8 seconds
curl: (18) transfer closed with outstanding read data remaining

the server prints this in console
2019/10/09 21:41:11 iteration 19
2019/10/09 21:41:11 error streaming rpc error: code = Canceled desc = context canceled

Meanwhile, running the gRPC client calling the same API can does not exhibit this problem

go run ./cmd/client
...
streams forever
...

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions