aboutsummaryrefslogtreecommitdiff
path: root/lib/http.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/http.c')
-rw-r--r--lib/http.c142
1 files changed, 76 insertions, 66 deletions
diff --git a/lib/http.c b/lib/http.c
index 4e3471b36..7e2089496 100644
--- a/lib/http.c
+++ b/lib/http.c
@@ -340,35 +340,41 @@ CURLcode http(struct connectdata *conn)
http->p_accept = "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\n";
do {
+ send_buffer *req_buffer;
struct curl_slist *headers=data->headers;
- sendf(data->firstsocket, data,
- "%s " /* GET/HEAD/POST/PUT */
- "%s HTTP/1.0\r\n" /* path */
- "%s" /* proxyuserpwd */
- "%s" /* userpwd */
- "%s" /* range */
- "%s" /* user agent */
- "%s" /* cookie */
- "%s" /* host */
- "%s" /* pragma */
- "%s" /* accept */
- "%s", /* referer */
-
- data->customrequest?data->customrequest:
- (data->bits.no_body?"HEAD":
- (data->bits.http_post || data->bits.http_formpost)?"POST":
- (data->bits.http_put)?"PUT":"GET"),
- ppath,
- (data->bits.proxy_user_passwd && data->ptr_proxyuserpwd)?data->ptr_proxyuserpwd:"",
- (data->bits.user_passwd && data->ptr_userpwd)?data->ptr_userpwd:"",
- (data->bits.set_range && data->ptr_rangeline)?data->ptr_rangeline:"",
- (data->useragent && *data->useragent && data->ptr_uagent)?data->ptr_uagent:"",
- (data->ptr_cookie?data->ptr_cookie:""), /* Cookie: <data> */
- (data->ptr_host?data->ptr_host:""), /* Host: host */
- http->p_pragma?http->p_pragma:"",
- http->p_accept?http->p_accept:"",
- (data->bits.http_set_referer && data->ptr_ref)?data->ptr_ref:"" /* Referer: <data> <CRLF> */
- );
+
+ /* initialize a dynamic send-buffer */
+ req_buffer = add_buffer_init();
+
+ /* add the main request stuff */
+ add_bufferf(req_buffer,
+ "%s " /* GET/HEAD/POST/PUT */
+ "%s HTTP/1.0\r\n" /* path */
+ "%s" /* proxyuserpwd */
+ "%s" /* userpwd */
+ "%s" /* range */
+ "%s" /* user agent */
+ "%s" /* cookie */
+ "%s" /* host */
+ "%s" /* pragma */
+ "%s" /* accept */
+ "%s", /* referer */
+
+ data->customrequest?data->customrequest:
+ (data->bits.no_body?"HEAD":
+ (data->bits.http_post || data->bits.http_formpost)?"POST":
+ (data->bits.http_put)?"PUT":"GET"),
+ ppath,
+ (data->bits.proxy_user_passwd && data->ptr_proxyuserpwd)?data->ptr_proxyuserpwd:"",
+ (data->bits.user_passwd && data->ptr_userpwd)?data->ptr_userpwd:"",
+ (data->bits.set_range && data->ptr_rangeline)?data->ptr_rangeline:"",
+ (data->useragent && *data->useragent && data->ptr_uagent)?data->ptr_uagent:"",
+ (data->ptr_cookie?data->ptr_cookie:""), /* Cookie: <data> */
+ (data->ptr_host?data->ptr_host:""), /* Host: host */
+ http->p_pragma?http->p_pragma:"",
+ http->p_accept?http->p_accept:"",
+ (data->bits.http_set_referer && data->ptr_ref)?data->ptr_ref:"" /* Referer: <data> <CRLF> */
+ );
if(co) {
int count=0;
@@ -376,19 +382,16 @@ CURLcode http(struct connectdata *conn)
while(co) {
if(co->value && strlen(co->value)) {
if(0 == count) {
- sendf(data->firstsocket, data,
- "Cookie:");
+ add_bufferf(req_buffer, "Cookie:");
}
- sendf(data->firstsocket, data,
- "%s%s=%s", count?"; ":"", co->name,
- co->value);
+ add_bufferf(req_buffer,
+ "%s%s=%s", count?"; ":"", co->name, co->value);
count++;
}
co = co->next; /* next cookie please */
}
if(count) {
- sendf(data->firstsocket, data,
- "\r\n");
+ add_buffer(req_buffer, "\r\n", 2);
}
cookie_freelist(co); /* free the cookie list */
co=NULL;
@@ -419,16 +422,16 @@ CURLcode http(struct connectdata *conn)
switch(data->timecondition) {
case TIMECOND_IFMODSINCE:
default:
- sendf(data->firstsocket, data,
- "If-Modified-Since: %s\r\n", buf);
+ add_bufferf(req_buffer,
+ "If-Modified-Since: %s\r\n", buf);
break;
case TIMECOND_IFUNMODSINCE:
- sendf(data->firstsocket, data,
- "If-Unmodified-Since: %s\r\n", buf);
+ add_bufferf(req_buffer,
+ "If-Unmodified-Since: %s\r\n", buf);
break;
case TIMECOND_LASTMOD:
- sendf(data->firstsocket, data,
- "Last-Modified: %s\r\n", buf);
+ add_bufferf(req_buffer,
+ "Last-Modified: %s\r\n", buf);
break;
}
}
@@ -445,9 +448,7 @@ CURLcode http(struct connectdata *conn)
if(*ptr) {
/* only send this if the contents was non-blank */
- sendf(data->firstsocket, data,
- "%s\015\012",
- headers->data);
+ add_bufferf(req_buffer, "%s\r\n", headers->data);
}
}
headers = headers->next;
@@ -468,12 +469,13 @@ CURLcode http(struct connectdata *conn)
generated form data */
data->in = (FILE *)&http->form;
- sendf(data->firstsocket, data,
- "Content-Length: %d\r\n",
- http->postsize-2);
+ add_bufferf(req_buffer,
+ "Content-Length: %d\r\n", http->postsize-2);
+ /* set upload size to the progress meter */
pgrsSetUploadSize(data, http->postsize);
+ add_buffer_send(data->firstsocket, conn, req_buffer);
result = Transfer(conn, data->firstsocket, -1, TRUE,
&http->readbytecount,
data->firstsocket,
@@ -487,16 +489,20 @@ CURLcode http(struct connectdata *conn)
/* Let's PUT the data to the server! */
if(data->infilesize>0) {
- sendf(data->firstsocket, data,
- "Content-Length: %d\r\n\r\n", /* file size */
- data->infilesize );
+ add_bufferf(req_buffer,
+ "Content-Length: %d\r\n\r\n", /* file size */
+ data->infilesize );
}
else
- sendf(data->firstsocket, data,
- "\015\012");
+ add_bufferf(req_buffer, "\015\012");
+ /* set the upload size to the progress meter */
pgrsSetUploadSize(data, data->infilesize);
+ /* this sends the buffer and frees all the buffer resources */
+ add_buffer_send(data->firstsocket, conn, req_buffer);
+
+ /* prepare for transfer */
result = Transfer(conn, data->firstsocket, -1, TRUE,
&http->readbytecount,
data->firstsocket,
@@ -512,30 +518,34 @@ CURLcode http(struct connectdata *conn)
if(!checkheaders(data, "Content-Length:"))
/* we allow replacing this header, although it isn't very wise to
actually set your own */
- sendf(data->firstsocket, data,
- "Content-Length: %d\r\n",
- (data->postfieldsize?data->postfieldsize:
- strlen(data->postfields)) );
+ add_bufferf(req_buffer,
+ "Content-Length: %d\r\n",
+ (data->postfieldsize?data->postfieldsize:
+ strlen(data->postfields)) );
if(!checkheaders(data, "Content-Type:"))
- sendf(data->firstsocket, data,
- "Content-Type: application/x-www-form-urlencoded\r\n");
+ add_bufferf(req_buffer,
+ "Content-Type: application/x-www-form-urlencoded\r\n");
/* and here comes the actual data */
if(data->postfieldsize) {
- ssend(data->firstsocket, conn, "\r\n", 2);
- ssend(data->firstsocket, conn, data->postfields, data->postfieldsize);
- ssend(data->firstsocket, conn, "\r\n", 2);
+ add_buffer(req_buffer, "\r\n", 2);
+ add_buffer(req_buffer, data->postfields,
+ data->postfieldsize);
+ add_buffer(req_buffer, "\r\n", 2);
+ }
+ else {
+ add_bufferf(req_buffer,
+ "\r\n"
+ "%s\r\n",
+ data->postfields );
}
- sendf(data->firstsocket, data,
- "\r\n"
- "%s\r\n",
- data->postfields );
}
else
- sendf(data->firstsocket, data, "\r\n");
+ add_buffer(req_buffer, "\r\n", 2);
/* HTTP GET/HEAD download: */
+ add_buffer_send(data->firstsocket, conn, req_buffer);
result = Transfer(conn, data->firstsocket, -1, TRUE, bytecount,
-1, NULL); /* nothing to upload */
}