Closed chobits closed 9 years ago
This may not work because fd is shared by multiple streams. It would work if only one stream is involved. But once several streams are going active, then read will interleaved and the outgoing data will be corrupted.
If serveral streams are going active and reading POST data from /dev/stdin POST data, it should add a buffer to save data from /dev/stdin in file_read_callback().
It's my understanding that spdycat will use one session with only one stream via following command:
$ cat some_post_data_file | spdycat -2 -d - https://localhost:443/test_post
Is it right?
it should add a buffer to save data from /dev/stdin in file_read_callback().
Yes, but current code does not do this.
It's my understanding that spdycat will use one session with only one stream via following command:
Yes, but spdycat offers options to create multiple streams in one session. For example, using -m20
creates 20 streams.
This issue was fixed via 6c17426a9b4b0676fbde64271f6ebac1ad1ebb33
@tatsuhiro-t I have tested https://github.com/tatsuhiro-t/spdylay/commit/6c17426a9b4b0676fbde64271f6ebac1ad1ebb33. It works as expected.
Reproduce: $ echo hello | spdycat -2 -v -d - https://localhost:443/test_post ... [ 0.006] send RST_STREAM frame
(stream_id=1, status_code=6)
...
Error occurs when spdycat reads post data from /dev/stdin, in which case spdycat will send RST_STREAM(status_code=6(internal error)) to server.
Reason: In spdycat.cc, file_read_callback() use pread() to read post data. If post data file is /dev/stdin (pipe, socket or FIFO), pread() will returns -1 and set errno to ESPIPE. pread() is based on lseek(), but lseek() cannot works with pipe, socket or FIFO file.