if(!CONN_SOCK_IDX_VALID(sockindex))
return FALSE;
cf = conn->cfilter[sockindex];
- return cf && cf->connected;
+ if(cf)
+ return cf->connected;
+ else if(conn->handler->flags & PROTOPT_NONETWORK)
+ return TRUE;
+ return FALSE;
}
bool Curl_conn_is_ip_connected(struct Curl_easy *data, int sockindex)
"CONNECT",
"RESOLVING",
"CONNECTING",
- "TUNNELING",
"PROTOCONNECT",
"PROTOCONNECTING",
"DO",
Curl_http, /* do_it */
Curl_http_done, /* done */
ZERO_NULL, /* do_more */
- Curl_http_connect, /* connect_it */
+ ZERO_NULL, /* connect_it */
ZERO_NULL, /* connecting */
ZERO_NULL, /* doing */
ZERO_NULL, /* proto_pollset */
Curl_http, /* do_it */
Curl_http_done, /* done */
ZERO_NULL, /* do_more */
- Curl_http_connect, /* connect_it */
+ ZERO_NULL, /* connect_it */
NULL, /* connecting */
ZERO_NULL, /* doing */
NULL, /* proto_pollset */
return FALSE; /* no match */
}
-/*
- * Curl_http_connect() performs HTTP stuff to do at connect-time, called from
- * the generic Curl_connect().
- */
-CURLcode Curl_http_connect(struct Curl_easy *data, bool *done)
-{
- return Curl_conn_connect(data, FIRSTSOCKET, FALSE, done);
-}
-
/* this returns the socket to wait for in the DO and DOING state for the multi
interface and then we are always _sending_ a request and thus we wait for
the single socket to become writable only */
struct connectdata *conn);
CURLcode Curl_http(struct Curl_easy *data, bool *done);
CURLcode Curl_http_done(struct Curl_easy *data, CURLcode, bool premature);
-CURLcode Curl_http_connect(struct Curl_easy *data, bool *done);
CURLcode Curl_http_doing_pollset(struct Curl_easy *data,
struct easy_pollset *ps);
CURLcode Curl_http_perform_pollset(struct Curl_easy *data,
Curl_init_CONNECT, /* CONNECT */
NULL, /* RESOLVING */
NULL, /* CONNECTING */
- NULL, /* TUNNELING */
NULL, /* PROTOCONNECT */
NULL, /* PROTOCONNECTING */
NULL, /* DO */
break;
case MSTATE_CONNECTING:
- case MSTATE_TUNNELING:
result = mstate_connecting_pollset(data, ps);
break;
*/
static CURLcode protocol_connect(struct Curl_easy *data, bool *protocol_done)
{
- CURLcode result = CURLE_OK;
struct connectdata *conn = data->conn;
+ CURLcode result = CURLE_OK;
+
DEBUGASSERT(conn);
DEBUGASSERT(protocol_done);
+ DEBUGASSERT(Curl_conn_is_connected(conn, FIRSTSOCKET));
*protocol_done = FALSE;
-
- if(Curl_conn_is_connected(conn, FIRSTSOCKET) && conn->bits.protoconnstart) {
- /* We already are connected, get back. This may happen when the connect
- worked fine in the first call, like when we connect to a local server
- or proxy. Note that we do not know if the protocol is actually done.
-
- Unless this protocol does not have any protocol-connect callback, as
- then we know we are done. */
- if(!conn->handler->connecting)
- *protocol_done = TRUE;
-
- return CURLE_OK;
- }
-
if(!conn->bits.protoconnstart) {
if(conn->handler->connect_it) {
- /* is there a protocol-specific connect() procedure? */
-
/* Call the protocol-specific connect function */
result = conn->handler->connect_it(data, protocol_done);
+ if(result)
+ return result;
}
- else
- *protocol_done = TRUE;
-
- /* it has started, possibly even completed but that knowledge is not stored
- in this bit! */
- if(!result)
- conn->bits.protoconnstart = TRUE;
+ conn->bits.protoconnstart = TRUE;
}
- return result; /* pass back status */
+ /* Unless this protocol does not have any protocol-connect callback, as
+ then we know we are done. */
+ if(!conn->handler->connecting)
+ *protocol_done = TRUE;
+ return CURLE_OK;
}
static void set_in_callback(struct Curl_multi *multi, bool value)
rc = state_resolving(multi, data, &stream_error, &result);
break;
-#ifndef CURL_DISABLE_HTTP
- case MSTATE_TUNNELING:
- /* this is HTTP-specific, but sending CONNECT to a proxy is HTTP... */
- DEBUGASSERT(data->conn);
- result = Curl_http_connect(data, &protocol_connected);
- if(!result) {
- rc = CURLM_CALL_MULTI_PERFORM;
- /* initiate protocol connect phase */
- multistate(data, MSTATE_PROTOCONNECT);
- }
- else
- stream_error = TRUE;
- break;
-#endif
-
case MSTATE_CONNECTING:
/* awaiting a completion of an asynch TCP connect */
DEBUGASSERT(data->conn);
*/
typedef enum {
MSTATE_INIT, /* 0 - start in this state */
- MSTATE_PENDING, /* 1 - no connections, waiting for one */
- MSTATE_SETUP, /* 2 - start a new transfer */
- MSTATE_CONNECT, /* 3 - resolve/connect has been sent off */
- MSTATE_RESOLVING, /* 4 - awaiting the resolve to finalize */
- MSTATE_CONNECTING, /* 5 - awaiting the TCP connect to finalize */
- MSTATE_TUNNELING, /* 6 - awaiting HTTPS proxy SSL initialization to
- complete and/or proxy CONNECT to finalize */
- MSTATE_PROTOCONNECT, /* 7 - initiate protocol connect procedure */
- MSTATE_PROTOCONNECTING, /* 8 - completing the protocol-specific connect
- phase */
- MSTATE_DO, /* 9 - start send off the request (part 1) */
- MSTATE_DOING, /* 10 - sending off the request (part 1) */
- MSTATE_DOING_MORE, /* 11 - send off the request (part 2) */
- MSTATE_DID, /* 12 - done sending off request */
- MSTATE_PERFORMING, /* 13 - transfer data */
- MSTATE_RATELIMITING, /* 14 - wait because limit-rate exceeded */
- MSTATE_DONE, /* 15 - post data transfer operation */
- MSTATE_COMPLETED, /* 16 - operation complete */
- MSTATE_MSGSENT, /* 17 - the operation complete message is sent */
- MSTATE_LAST /* 18 - not a true state, never use this */
+ MSTATE_PENDING, /* no connections, waiting for one */
+ MSTATE_SETUP, /* start a new transfer */
+ MSTATE_CONNECT, /* resolve/connect has been sent off */
+ MSTATE_RESOLVING, /* awaiting the resolve to finalize */
+ MSTATE_CONNECTING, /* awaiting the TCP connect to finalize */
+ MSTATE_PROTOCONNECT, /* initiate protocol connect procedure */
+ MSTATE_PROTOCONNECTING, /* completing the protocol-specific connect phase */
+ MSTATE_DO, /* start send off the request (part 1) */
+ MSTATE_DOING, /* sending off the request (part 1) */
+ MSTATE_DOING_MORE, /* send off the request (part 2) */
+ MSTATE_DID, /* done sending off request */
+ MSTATE_PERFORMING, /* transfer data */
+ MSTATE_RATELIMITING, /* wait because limit-rate exceeded */
+ MSTATE_DONE, /* post data transfer operation */
+ MSTATE_COMPLETED, /* operation complete */
+ MSTATE_MSGSENT, /* the operation complete message is sent */
+ MSTATE_LAST /* not a true state, never use this */
} CURLMstate;
#define CURLPIPE_ANY (CURLPIPE_MULTIPLEX)
{
struct rtsp_conn *rtspc =
Curl_conn_meta_get(data->conn, CURL_META_RTSP_CONN);
- CURLcode httpStatus;
if(!rtspc)
return CURLE_FAILED_INIT;
- httpStatus = Curl_http_connect(data, done);
-
/* Initialize the CSeq if not already done */
if(data->state.rtsp_next_client_CSeq == 0)
data->state.rtsp_next_client_CSeq = 1;
data->state.rtsp_next_server_CSeq = 1;
rtspc->rtp_channel = -1;
-
- return httpStatus;
+ *done = TRUE;
+ return CURLE_OK;
}
static CURLcode rtsp_done(struct Curl_easy *data,
Curl_http, /* do_it */
Curl_http_done, /* done */
ZERO_NULL, /* do_more */
- Curl_http_connect, /* connect_it */
+ ZERO_NULL, /* connect_it */
ZERO_NULL, /* connecting */
ZERO_NULL, /* doing */
ZERO_NULL, /* proto_pollset */
Curl_http, /* do_it */
Curl_http_done, /* done */
ZERO_NULL, /* do_more */
- Curl_http_connect, /* connect_it */
+ ZERO_NULL, /* connect_it */
NULL, /* connecting */
ZERO_NULL, /* doing */
NULL, /* proto_pollset */