<div dir="ltr">I would like to validate my theory over a weird issue I had with Varnish 3.<br><br>So we have an endpoint on the server using Digest Authentication and I send a POST request to that endpoint without including the auth header:<br><br>    curl --data-urlencode foobar@/home/foo/bar.txt <a href="https://www.example.com/foobar/">https://www.example.com/foobar/</a><br><br>Varnish is set up to pass all the requests going to that endpoint. By default POST requests are passed too, and I didn't change that behaviour. So we can assume Varnish is not trying to cache anything here.<br><br>I would expect to get the response 401 UNAUTHORIZED from the server, but instead I get a 503 coming from Varnish. This is the log in Varnish for that request:<br><br>    SessionOpen  c 127.0.0.1 34005 localhost:6081<br>    ReqStart     c 127.0.0.1 34005 1873165756<br>    RxRequest    c POST<br>    RxURL        c /foobar/<br>    RxProtocol   c HTTP/1.0<br>    RxHeader     c Host: <a href="http://www.example.com">www.example.com</a><br>    RxHeader     c X-Real-IP: 123.123.123.123<br>    RxHeader     c X-Forwarded-For: 123.123.123.123<br>    RxHeader     c X-Forwarded-Protocol: https<br>    RxHeader     c X-SSL-Protocol: TLSv1.2<br>    RxHeader     c X-Forwarded-Proto: https<br>    RxHeader     c X-Url-Scheme: https<br>    RxHeader     c Connection: close<br>    RxHeader     c Content-Length: 7811<br>    RxHeader     c User-Agent: foobar<br>    RxHeader     c Accept: */*<br>    RxHeader     c Content-Type: application/x-www-form-urlencoded<br>    VCL_call     c recv pass<br>    VCL_call     c hash<br>    Hash         c /foobar/<br>    Hash         c <a href="http://www.example.com">www.example.com</a><br>    VCL_return   c hash<br>    VCL_call     c pass pass<br>    Backend      c 17 default default<br>    TTL          c 1873165756 RFC -1 -1 -1 1526037072 0 1526037072 0 0<br>    VCL_call     c fetch<br>    TTL          c 1873165756 VCL -1 3600 -1 1526037072 -0<br>    TTL          c 1873165756 VCL 120 3600 -1 1526037072 -0<br>    VCL_return   c hit_for_pass<br>    ObjProtocol  c HTTP/1.1<br>    ObjResponse  c UNAUTHORIZED<br>    ObjHeader    c Server: foobar<br>    ObjHeader    c Date: Fri, 11 May 2018 11:11:12 GMT<br>    ObjHeader    c Content-Type: text/html; charset=utf-8<br>    ObjHeader    c WWW-Authenticate: Digest nonce="1526677072.03:1636:cb98ghghgh49495f1174226f25a2f02c79", realm="foobar", algorithm="MD5", opaque="9cbc87eb65454ff85bff73b2b38c06c34343e8", qop="auth", stale="false"<br>    ObjHeader    c Content-Language: en-us<br>    ObjHeader    c Vary: Accept-Encoding, Cookie, User-Agent<br>    VCL_call     c error deliver<br>    VCL_call     c deliver deliver<br>    TxProtocol   c HTTP/1.1<br>    TxStatus     c 503<br>    TxResponse   c Service Unavailable<br>    TxHeader     c Server: Varnish<br>    TxHeader     c Content-Type: text/html; charset=utf-8<br>    TxHeader     c Retry-After: 5<br>    TxHeader     c Content-Length: 419<br>    TxHeader     c Accept-Ranges: bytes<br>    TxHeader     c Date: Fri, 11 May 2018 11:11:12 GMT<br>    TxHeader     c X-Varnish: 1873165756<br>    TxHeader     c Age: 0<br>    TxHeader     c Via: 1.1 varnish<br>    TxHeader     c Connection: close<br>    Length       c 419<br>    ReqEnd       c 1873165756 1526037072.059784174 1526037072.061955214 0.000038624 0.002078533 0.000092506<br><br>But reducing the size of the payload a little bit, it works:<br><br>    SessionOpen  c 127.0.0.1 36019 localhost:6081<br>    ReqStart     c 127.0.0.1 36019 1873166315<br>    RxRequest    c POST<br>    RxURL        c /foobar/<br>    RxProtocol   c HTTP/1.0<br>    RxHeader     c Host: <a href="http://www.example.com">www.example.com</a><br>    RxHeader     c X-Real-IP: 123.123.123.123<br>    RxHeader     c X-Forwarded-For: 123.123.123.123<br>    RxHeader     c X-Forwarded-Protocol: https<br>    RxHeader     c X-SSL-Protocol: TLSv1.2<br>    RxHeader     c X-Forwarded-Proto: https<br>    RxHeader     c X-Url-Scheme: https<br>    RxHeader     c Connection: close<br>    RxHeader     c Content-Length: 7261<br>    RxHeader     c User-Agent: foobar<br>    RxHeader     c Accept: */*<br>    RxHeader     c Content-Type: application/x-www-form-urlencoded<br>    VCL_call     c recv pass<br>    VCL_call     c hash<br>    Hash         c /foobar/<br>    Hash         c <a href="http://www.example.com">www.example.com</a><br>    VCL_return   c hash<br>    VCL_call     c pass pass<br>    Backend      c 17 default default<br>    TTL          c 1873166315 RFC -1 -1 -1 1526037112 0 1526037112 0 0<br>    VCL_call     c fetch<br>    TTL          c 1873166315 VCL -1 3600 -1 1526037112 -0<br>    TTL          c 1873166315 VCL 120 3600 -1 1526037112 -0<br>    VCL_return   c hit_for_pass<br>    ObjProtocol  c HTTP/1.1<br>    ObjResponse  c UNAUTHORIZED<br>    ObjHeader    c Server: gunicorn/19.0.0<br>    ObjHeader    c Date: Fri, 11 May 2018 11:11:52 GMT<br>    ObjHeader    c Content-Type: text/html; charset=utf-8<br>    ObjHeader    c WWW-Authenticate: Digest nonce="15260334112.14:3917:d3d558ed34342e8e723d8219bf3b20fc38", realm="foobar", algorithm="MD5", opaque="b32cd3f7b82213212397ded88c00ea06f111a29c", qop="auth", stale="false"<br>    ObjHeader    c Content-Language: en-us<br>    ObjHeader    c Vary: Accept-Encoding, Cookie, User-Agent<br>    VCL_call     c deliver deliver<br>    TxProtocol   c HTTP/1.1<br>    TxStatus     c 401<br>    TxResponse   c UNAUTHORIZED<br>    TxHeader     c Server: gunicorn/19.0.0<br>    TxHeader     c Content-Type: text/html; charset=utf-8<br>    TxHeader     c WWW-Authenticate: Digest nonce="15260334112.14:3917:d3d558ed34342e8e723d8219bf3b20fc38", realm="foobar", algorithm="MD5", opaque="b32cd3f7b82213212397ded88c00ea06f111a29c", qop="auth", stale="false"<br>    TxHeader     c Content-Language: en-us<br>    TxHeader     c Vary: Accept-Encoding, Cookie, User-Agent<br>    TxHeader     c Content-Length: 0<br>    TxHeader     c Accept-Ranges: bytes<br>    TxHeader     c Date: Fri, 11 May 2018 11:11:52 GMT<br>    TxHeader     c X-Varnish: 1873166315<br>    TxHeader     c Age: 0<br>    TxHeader     c Via: 1.1 varnish<br>    TxHeader     c Connection: close<br>    Length       c 0<br>    ReqEnd       c 1873166315 1526037112.192578554 1526037112.194519758 0.000039816 0.001864910 0.000076294<br><br>Why is that happening? Well, I have my own theory and this is what I would like to validate here. I think it's because there is some sort of limit set in Varnish for the size of the objects to keep in memory, so when the request size (headers + payload) is bigger than a threshold, and the request can not be delivered to the backend, it fails with 503. But if the request is smaller, Varnish keeps the object in memory and just sends to the client the response from the backend.<br><br>Anyone here that could help me understand this weird behaviour?<br><br>Thanks!<br></div>