[
https://issues.apache.org/jira/browse/TS-3049?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14115666#comment-14115666
]
Sudheer Vinukonda commented on TS-3049:
---------------------------------------
After further debugging and discussions with [~amc], I think we understand the
problem now. The root cause is basically due to FetchSM not handling a response
with header "Connection:Close" correctly. Basically, FetchSM assumes that
there's no response body left if neither of Content-Length or Transfer-Encoding
(Chunked) headers is received. It doesn't handle the case where the response
may indicate "Connection: Close".
In our specific production, we have "chunked encoding" disabled for the origin
and so, when the origin sends chunked response, tunnel dechunks it and passes
it onto FetchSM, with header "connection:close" - FetchSM reads whatever data
is available and since neither of chunked encoding/content-length headers is
received sends BODY DONE event down to SPDY which basically closes the
connection. For example, for the same asset, see below difference in the status
codes and sizes of response for a spdy (12614 bytes) vs non-spdy (51851 bytes)
connection.
{code}
1409336152.807 285 209.131.62.116 TCP_MISS/200 51851 GET https://xxxxxxxx.js -
DIRECT/xxxxxxx.js "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2)
AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/537.75.14"
1409336191.291 207 209.131.62.116 ERR_CLIENT_ABORT/200 12614 GET
https://xxxxxx.js - DIRECT/xxxxxxxx.js "Mozilla/5.0 (Macintosh; Intel Mac OS X
10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94
Safari/537.36"
{code}
I will update the ticket shortly with a fix I verified to fix the above issue.
The fix which also addresses another related issue of duplicating body (which
should have been done only for headers, to allow parse_resp to consume them).
> SPDY requests returning 200 OK with empty body..
> ------------------------------------------------
>
> Key: TS-3049
> URL: https://issues.apache.org/jira/browse/TS-3049
> Project: Traffic Server
> Issue Type: Bug
> Components: SPDY
> Affects Versions: 5.0.1
> Reporter: Sudheer Vinukonda
> Assignee: Brian Geffon
> Priority: Blocker
> Fix For: 5.1.0
>
> Attachments: ts3049.pcap
>
>
> Ran into another issue in our production, where some SPDY requests were
> returning a valid response (200 OK), but, with no data (empty body).
> Below is a sample response:
> {code}
> t=688758 [st= 1] SPDY_SESSION_SYN_STREAM
> --> fin = true
> --> :host: ********
> :method: GET
> :path: /********.js
> :scheme: https
> :version: HTTP/1.1
> accept:
> text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
> accept-encoding: gzip,deflate
> accept-language: en-US,en;q=0.8
> cache-control: max-age=0
> cookie: [215 bytes were stripped]
> user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS
> X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94
> Safari/537.36
> --> spdy_priority = 0
> --> stream_id = 1
> --> unidirectional = false
> t=688941 [st= 184] SPDY_SESSION_SYN_REPLY
> --> fin = false
> --> :status: 200 OK
> :version: HTTP/1.1
> accept-ranges: bytes
> age: 2
> cache-control: max-age=536112000
> content-encoding: gzip
> content-type: application/javascript
> date: Wed, 27 Aug 2014 23:39:53 GMT
> etag: "************************"
> expires: Sat, 05 Sep 2026 00:00:00 GMT
> last-modified: Wed, 27 Aug 2014 20:09:00 GMT
> server: ATS
> vary: Accept-Encoding
> via: HTTP/1.1 ********** (ApacheTrafficServer)
> x-ysws-request-id: **********
> x-ysws-visited-replicas: *********
> --> stream_id = 1
> t=688941 [st= 184] SPDY_SESSION_RECV_DATA
> --> fin = true
> --> size = 0
> --> stream_id = 1
> {code}
> Investigating further, it seems that the issue occurs, when the response from
> the origin is chunked. Debugging further, it looks like there's a bug in
> FetchSM - check_body_done() is broken for chunked encoding case.
> {code}
> bool
> FetchSM::check_body_done()
> {
> if (!check_chunked()) {
> if (resp_content_length == resp_recived_body_len +
> resp_reader->read_avail())
> return true;
> return false;
> }
> //
> // TODO: check whether the chunked body is done
> //
> return true;
> }
> {code}
--
This message was sent by Atlassian JIRA
(v6.2#6252)