curl_socket_t fdsave;
ssize_t nwritten;
-#ifdef USE_RECV_BEFORE_SEND_WORKAROUND
- /* WinSock will destroy unread received data if send() is
- failed.
- To avoid lossage of received data, recv() must be
- performed before every send() if any incoming data is
- available. */
- if(ctx->buffer_recv && !Curl_bufq_is_full(&ctx->recvbuf)) {
- nwritten = Curl_bufq_slurp(&ctx->recvbuf, nw_in_read, &rctx, err);
- if(nwritten < 0 && *err != CURLE_AGAIN) {
- return -1;
- }
- }
-#endif
-
*err = CURLE_OK;
fdsave = cf->conn->sock[cf->sockindex];
cf->conn->sock[cf->sockindex] = ctx->sock;
conn_set_primary_ip(cf, data);
set_local_ip(cf, data);
Curl_persistconninfo(data, cf->conn, ctx->l_ip, ctx->l_port);
- /* We buffer only for TCP transfers that do not install their own read
- * function. Those may still have expectations about socket behaviours from
- * the past.
- *
- * Note buffering is currently disabled by default because we have stalls
+ /* buffering is currently disabled by default because we have stalls
* in parallel transfers where not all buffered data is consumed and no
* socket events happen.
*/
-#ifdef USE_RECV_BEFORE_SEND_WORKAROUND
- ctx->buffer_recv = (ctx->transport == TRNSPRT_TCP &&
- (cf->conn->recv[cf->sockindex] == Curl_conn_recv));
-#else
ctx->buffer_recv = FALSE;
-#endif
}
ctx->active = TRUE;
}
#define FOPEN_APPENDTEXT "a"
#endif
-/* Windows workaround to recv before every send, because apparently Winsock
- * destroys destroys recv() buffer when send() failed.
- * This workaround is now disabled by default since it caused hard to fix bugs.
- * Define USE_RECV_BEFORE_SEND_WORKAROUND to enable it.
- * https://github.com/curl/curl/issues/657
- * https://github.com/curl/curl/pull/10409
- */
-#if !defined(DONT_USE_RECV_BEFORE_SEND_WORKAROUND)
-# if defined(WIN32) || defined(__CYGWIN__)
-/* # define USE_RECV_BEFORE_SEND_WORKAROUND */
-# endif
-#else /* DONT_USE_RECV_BEFORE_SEND_WORKAROUND */
-# ifdef USE_RECV_BEFORE_SEND_WORKAROUND
-# undef USE_RECV_BEFORE_SEND_WORKAROUND
-# endif
-#endif /* DONT_USE_RECV_BEFORE_SEND_WORKAROUND */
-
/* for systems that don't detect this in configure */
#ifndef CURL_SA_FAMILY_T
# if defined(HAVE_SA_FAMILY_T)
#
# 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).
+# natively. On Windows there were reported problems and a workaround via
+# define USE_RECV_BEFORE_SEND_WORKAROUND was added.
+# This proved problematic in other cases and was removed again.
#
# Server-side
<reply>
respdata = open(curl.response_file(i)).readlines()
assert respdata == exp_data
+ # issue #10591
+ @pytest.mark.parametrize("proto", ['http/1.1', 'h2', 'h3'])
+ def test_07_32_issue_10591(self, env: Env, httpd, nghttpx, repeat, proto):
+ if proto == 'h3' and not env.have_h3():
+ pytest.skip("h3 not supported")
+ if proto == 'h3' and env.curl_uses_lib('msh3'):
+ pytest.skip("msh3 fails here")
+ fdata = os.path.join(env.gen_dir, 'data-10m')
+ count = 1
+ curl = CurlClient(env=env)
+ url = f'https://{env.authority_for(env.domain1, proto)}/curltest/put?id=[0-{count-1}]'
+ r = curl.http_put(urls=[url], fdata=fdata, alpn_proto=proto)
+ r.check_response(count=count, http_status=200)
+ r.check_response(count=count, http_status=200)
+
def check_download(self, count, srcfile, curl):
for i in range(count):
dfile = curl.download_file(i)
struct WriteThis pooh;
if(!strcmp(URL, "check")) {
-#if (defined(WIN32) || defined(__CYGWIN__)) && \
- !defined(USE_RECV_BEFORE_SEND_WORKAROUND)
- printf("test requires recv-before-send workaround on Windows\n");
+#if (defined(WIN32) || defined(__CYGWIN__))
+ printf("Windows TCP does not deliver response data but reports "
+ "CONNABORTED\n");
return 1; /* skip since test will fail on Windows without workaround */
#else
return 0; /* sure, run this! */