aboutsummaryrefslogtreecommitdiff
path: root/lib/transfer.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2004-06-21 14:07:38 +0000
committerDaniel Stenberg <daniel@haxx.se>2004-06-21 14:07:38 +0000
commit8e287210577223b7d6dfb66034eca77c24a58b7f (patch)
tree14d43435fcba77259af99ff53e102a65af11ee88 /lib/transfer.c
parent8d2120566ec88eb01f1eb5b4e50115cff1e0b2e5 (diff)
The read callback can now return CURL_READFUNC_ABORT to stop a transfer.
Diffstat (limited to 'lib/transfer.c')
-rw-r--r--lib/transfer.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/lib/transfer.c b/lib/transfer.c
index 9ce78c552..1da2cc9c1 100644
--- a/lib/transfer.c
+++ b/lib/transfer.c
@@ -125,8 +125,9 @@ static struct timeval notimeout={0,0};
* This function will call the read callback to fill our buffer with data
* to upload.
*/
-int Curl_fillreadbuffer(struct connectdata *conn, int bytes)
+CURLcode Curl_fillreadbuffer(struct connectdata *conn, int bytes, int *nreadp)
{
+ struct SessionHandle *data = conn->data;
int buffersize = bytes;
int nread;
@@ -139,6 +140,11 @@ int Curl_fillreadbuffer(struct connectdata *conn, int bytes)
nread = conn->fread(conn->upload_fromhere, 1,
buffersize, conn->fread_in);
+ if(nread == CURL_READFUNC_ABORT) {
+ failf(data, "operation aborted by callback\n");
+ return CURLE_ABORTED_BY_CALLBACK;
+ }
+
if(!conn->bits.forbidchunk && conn->bits.upload_chunky) {
/* if chunked Transfer-Encoding */
char hexbuffer[11];
@@ -161,7 +167,10 @@ int Curl_fillreadbuffer(struct connectdata *conn, int bytes)
nread+=2; /* for the added CRLF */
}
- return nread;
+
+ *nreadp = nread;
+
+ return CURLE_OK;
}
/*
@@ -1131,7 +1140,9 @@ CURLcode Curl_readwrite(struct connectdata *conn,
break;
}
- nread = Curl_fillreadbuffer(conn, BUFSIZE);
+ result = Curl_fillreadbuffer(conn, BUFSIZE, &nread);
+ if(result)
+ return result;
}
else
nread = 0; /* we're done uploading/reading */