From 710f14edba4491a4ac9222a7e3103b51fd30dbe0 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Sun, 20 Apr 2014 19:37:54 +0200 Subject: handler: make 'protocol' always specified as a single bit This makes the findprotocol() function work as intended so that libcurl can properly be restricted to not support HTTP while still supporting HTTPS - since the HTTPS handler previously set both the HTTP and HTTPS bits in the protocol field. This fixes --proto and --proto-redir for most SSL protocols. This is done by adding a few new convenience defines that groups HTTP and HTTPS, FTP and FTPS etc that should then be used when the code wants to check for both protocols at once. PROTO_FAMILY_[protocol] style. Bug: https://github.com/bagder/curl/pull/97 Reported-by: drizzt --- lib/transfer.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'lib/transfer.c') diff --git a/lib/transfer.c b/lib/transfer.c index 3fcc6003e..46e55fbb5 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -99,7 +99,7 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, int bytes, int *nreadp) #ifdef CURL_DOES_CONVERSIONS bool sending_http_headers = FALSE; - if(conn->handler->protocol&(CURLPROTO_HTTP|CURLPROTO_RTSP)) { + if(conn->handler->protocol&(PROTO_FAMILY_HTTP|CURLPROTO_RTSP)) { const struct HTTP *http = data->req.protop; if(http->sending == HTTPSEND_REQUEST) @@ -319,7 +319,7 @@ static int data_pending(const struct connectdata *conn) TRUE. The thing is if we read everything, then http2_recv won't be called and we cannot signal the HTTP/2 stream has closed. As a workaround, we return nonzero here to call http2_recv. */ - ((conn->handler->protocol&CURLPROTO_HTTP) && conn->httpversion == 20 && + ((conn->handler->protocol&PROTO_FAMILY_HTTP) && conn->httpversion == 20 && conn->proto.httpc.closed); #else Curl_ssl_data_pending(conn, FIRSTSOCKET); @@ -527,7 +527,7 @@ static CURLcode readwrite_data(struct SessionHandle *data, if(0 == k->bodywrites && !is_empty_data) { /* These checks are only made the first time we are about to write a piece of the body */ - if(conn->handler->protocol&(CURLPROTO_HTTP|CURLPROTO_RTSP)) { + if(conn->handler->protocol&(PROTO_FAMILY_HTTP|CURLPROTO_RTSP)) { /* HTTP-only checks */ if(data->req.newurl) { @@ -723,7 +723,7 @@ static CURLcode readwrite_data(struct SessionHandle *data, if(!k->ignorebody) { #ifndef CURL_DISABLE_POP3 - if(conn->handler->protocol&CURLPROTO_POP3) + if(conn->handler->protocol&PROTO_FAMILY_POP3) result = Curl_pop3_write(conn, k->str, nread); else #endif /* CURL_DISABLE_POP3 */ @@ -854,7 +854,7 @@ static CURLcode readwrite_upload(struct SessionHandle *data, break; } - if(conn->handler->protocol&(CURLPROTO_HTTP|CURLPROTO_RTSP)) { + if(conn->handler->protocol&(PROTO_FAMILY_HTTP|CURLPROTO_RTSP)) { if(http->sending == HTTPSEND_REQUEST) /* We're sending the HTTP request headers, not the data. Remember that so we don't change the line endings. */ @@ -892,7 +892,7 @@ static CURLcode readwrite_upload(struct SessionHandle *data, data->req.upload_present = nread; #ifndef CURL_DISABLE_SMTP - if(conn->handler->protocol & CURLPROTO_SMTP) { + if(conn->handler->protocol & PROTO_FAMILY_SMTP) { result = Curl_smtp_escape_eob(conn, nread); if(result) return result; @@ -1873,7 +1873,7 @@ CURLcode Curl_retry_request(struct connectdata *conn, /* if we're talking upload, we can't do the checks below, unless the protocol is HTTP as when uploading over HTTP we will still get a response */ if(data->set.upload && - !(conn->handler->protocol&(CURLPROTO_HTTP|CURLPROTO_RTSP))) + !(conn->handler->protocol&(PROTO_FAMILY_HTTP|CURLPROTO_RTSP))) return CURLE_OK; if(/* workaround for broken TLS servers */ data->state.ssl_connect_retry || @@ -1899,7 +1899,7 @@ CURLcode Curl_retry_request(struct connectdata *conn, transferred! */ - if(conn->handler->protocol&CURLPROTO_HTTP) { + if(conn->handler->protocol&PROTO_FAMILY_HTTP) { struct HTTP *http = data->req.protop; if(http->writebytecount) return Curl_readrewind(conn); @@ -1972,7 +1972,7 @@ Curl_setup_transfer( state info where we wait for the 100-return code */ if((data->state.expect100header) && - (conn->handler->protocol&CURLPROTO_HTTP) && + (conn->handler->protocol&PROTO_FAMILY_HTTP) && (http->sending == HTTPSEND_BODY)) { /* wait with write until we either got 100-continue or a timeout */ k->exp100 = EXP100_AWAITING_CONTINUE; -- cgit v1.2.3