aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/http.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/lib/http.c b/lib/http.c
index 795a6f79c..42668b398 100644
--- a/lib/http.c
+++ b/lib/http.c
@@ -128,8 +128,10 @@ static
CURLcode add_buffer_send(int sockfd, struct connectdata *conn, send_buffer *in,
long *bytes_written)
{
- size_t amount;
- CURLcode result;
+ ssize_t amount;
+ CURLcode res;
+ char *ptr;
+ int size;
if(conn->data->set.verbose) {
fputs("> ", conn->data->set.err);
@@ -137,7 +139,25 @@ CURLcode add_buffer_send(int sockfd, struct connectdata *conn, send_buffer *in,
fwrite(in->buffer, in->size_used, 1, conn->data->set.err);
}
- result = Curl_write(conn, sockfd, in->buffer, in->size_used, &amount);
+ /* The looping below is required since we use non-blocking sockets, but due
+ to the circumstances we will just loop and try again and again etc */
+
+ ptr = in->buffer;
+ size = in->size_used;
+ do {
+ res = Curl_write(conn, sockfd, ptr, size, &amount);
+
+ if(CURLE_OK != res)
+ break;
+
+ if(amount != size) {
+ size += amount;
+ ptr += amount;
+ }
+ else
+ break;
+
+ } while(1);
if(in->buffer)
free(in->buffer);
@@ -145,7 +165,7 @@ CURLcode add_buffer_send(int sockfd, struct connectdata *conn, send_buffer *in,
*bytes_written = amount;
- return result;
+ return res;
}