mirror of
https://github.com/curl/curl.git
synced 2025-02-05 14:30:10 +08:00
Prior to this change a workaround for Windows to recv before every send was enabled by default. The way it works is a recv is called before every send and saves the received data, in case send fails because in Windows apparently that can wipe out the socket's internal received data buffer. This feature has led to several bugs because the way libcurl operates it waits on a socket to read or to write, and may not at all times check for buffered receive data. Two recent significant bugs this workaround caused: - Broken Schannel TLS 1.3 connections (#9431) - HTTP/2 arbitrary hangs (#10253) The actual code remains though it is disabled by default. Though future changes to connection filter buffering could improve the situation IMO it's just not tenable to manage this workaround. Ref: https://github.com/curl/curl/issues/657 Ref: https://github.com/curl/curl/pull/668 Ref: https://github.com/curl/curl/pull/720 Ref: https://github.com/curl/curl/issues/9431 Ref: https://github.com/curl/curl/issues/10253 Closes https://github.com/curl/curl/pull/10409
79 lines
1.6 KiB
Plaintext
79 lines
1.6 KiB
Plaintext
<testcase>
|
|
<info>
|
|
<keywords>
|
|
HTTP
|
|
POST
|
|
POST callback
|
|
slow callback
|
|
early response
|
|
</keywords>
|
|
</info>
|
|
#
|
|
# This test checks to make sure curl can call recv() without failing after a
|
|
# send() fails on the same socket (#657). Most OSes should support this
|
|
# natively but on Windows curl must be built with a workaround (#668) for the
|
|
# test to succeed. The precheck will skip this test on Windows if curl was
|
|
# built without the workaround (USE_RECV_BEFORE_SEND_WORKAROUND isn't defined).
|
|
#
|
|
# Server-side
|
|
<reply>
|
|
# Force server reply right after request headers, not waiting for request body
|
|
<servercmd>
|
|
skip: 45
|
|
</servercmd>
|
|
<data>
|
|
HTTP/1.1 500 Internal Server Error
|
|
Date: Thu, 17 Mar 2016 14:41:00 GMT
|
|
Server: test-server/fake
|
|
Content-Type: text/plain; charset=US-ASCII
|
|
X-Special: swsclose
|
|
Content-Length: 55
|
|
Connection: close
|
|
|
|
This is a virtual description of server virtual error.
|
|
</data>
|
|
</reply>
|
|
|
|
# Client-side
|
|
<client>
|
|
<server>
|
|
http
|
|
</server>
|
|
# tool is what to use instead of 'curl'
|
|
<tool>
|
|
lib%TESTNUMBER
|
|
</tool>
|
|
# precheck is a command line to run before the test, to see if we can execute
|
|
# the test or not
|
|
<precheck>
|
|
./libtest/lib%TESTNUMBER check
|
|
</precheck>
|
|
|
|
<name>
|
|
HTTP POST, server responds before completed send
|
|
</name>
|
|
<command>
|
|
http://%HOSTIP:%HTTPPORT/%TESTNUMBER
|
|
</command>
|
|
</client>
|
|
|
|
#
|
|
# Verify data after the test has been "shot"
|
|
<verify>
|
|
<strippart>
|
|
s/^(this is what we post to the silly web server)(\r)?\n//
|
|
</strippart>
|
|
<protocol>
|
|
POST /%TESTNUMBER HTTP/1.1
|
|
Host: %HOSTIP:%HTTPPORT
|
|
Accept: */*
|
|
Content-Length: 45
|
|
Content-Type: application/x-www-form-urlencoded
|
|
|
|
</protocol>
|
|
<errorcode>
|
|
0
|
|
</errorcode>
|
|
</verify>
|
|
</testcase>
|