aboutsummaryrefslogtreecommitdiff
path: root/lib/url.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2002-01-03 15:01:22 +0000
committerDaniel Stenberg <daniel@haxx.se>2002-01-03 15:01:22 +0000
commit8b6314ccfbe48bba2cd560812dd1841425f3bd79 (patch)
tree17ca2bf182593acbbc583d224e0af674e9fd8964 /lib/url.c
parent6de7dc5879b3605a180dafa05f792f132eafdcaa (diff)
merged the multi-dev branch back into MAIN again
Diffstat (limited to 'lib/url.c')
-rw-r--r--lib/url.c57
1 files changed, 43 insertions, 14 deletions
diff --git a/lib/url.c b/lib/url.c
index 5a477a26d..3973902ef 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -1214,8 +1214,7 @@ static CURLcode ConnectPlease(struct connectdata *conn)
}
static CURLcode CreateConnection(struct SessionHandle *data,
- struct connectdata **in_connect,
- bool allow_port) /* allow set.use_port? */
+ struct connectdata **in_connect)
{
char *tmp;
char *buf;
@@ -1614,7 +1613,8 @@ static CURLcode CreateConnection(struct SessionHandle *data,
*************************************************************/
if (strequal(conn->protostr, "HTTP")) {
- conn->port = (data->set.use_port && allow_port)?data->set.use_port:PORT_HTTP;
+ conn->port = (data->set.use_port && data->state.allow_port)?
+ data->set.use_port:PORT_HTTP;
conn->remote_port = PORT_HTTP;
conn->protocol |= PROT_HTTP;
conn->curl_do = Curl_http;
@@ -1624,7 +1624,8 @@ static CURLcode CreateConnection(struct SessionHandle *data,
else if (strequal(conn->protostr, "HTTPS")) {
#ifdef USE_SSLEAY
- conn->port = (data->set.use_port && allow_port)?data->set.use_port:PORT_HTTPS;
+ conn->port = (data->set.use_port && data->state.allow_port)?
+ data->set.use_port:PORT_HTTPS;
conn->remote_port = PORT_HTTPS;
conn->protocol |= PROT_HTTP|PROT_HTTPS|PROT_SSL;
@@ -1639,7 +1640,8 @@ static CURLcode CreateConnection(struct SessionHandle *data,
#endif /* !USE_SSLEAY */
}
else if (strequal(conn->protostr, "GOPHER")) {
- conn->port = (data->set.use_port && allow_port)?data->set.use_port:PORT_GOPHER;
+ conn->port = (data->set.use_port && data->state.allow_port)?
+ data->set.use_port:PORT_GOPHER;
conn->remote_port = PORT_GOPHER;
/* Skip /<item-type>/ in path if present */
if (isdigit((int)conn->path[1])) {
@@ -1665,7 +1667,8 @@ static CURLcode CreateConnection(struct SessionHandle *data,
#endif /* !USE_SSLEAY */
}
- conn->port = (data->set.use_port && allow_port)?data->set.use_port:PORT_FTP;
+ conn->port = (data->set.use_port && data->state.allow_port)?
+ data->set.use_port:PORT_FTP;
conn->remote_port = PORT_FTP;
conn->protocol |= PROT_FTP;
@@ -1720,21 +1723,24 @@ static CURLcode CreateConnection(struct SessionHandle *data,
/* telnet testing factory */
conn->protocol |= PROT_TELNET;
- conn->port = (data->set.use_port && allow_port)?data->set.use_port: PORT_TELNET;
+ conn->port = (data->set.use_port && data->state.allow_port)?
+ data->set.use_port: PORT_TELNET;
conn->remote_port = PORT_TELNET;
conn->curl_do = Curl_telnet;
conn->curl_done = Curl_telnet_done;
}
else if (strequal(conn->protostr, "DICT")) {
conn->protocol |= PROT_DICT;
- conn->port = (data->set.use_port && allow_port)?data->set.use_port:PORT_DICT;
+ conn->port = (data->set.use_port && data->state.allow_port)?
+ data->set.use_port:PORT_DICT;
conn->remote_port = PORT_DICT;
conn->curl_do = Curl_dict;
conn->curl_done = NULL; /* no DICT-specific done */
}
else if (strequal(conn->protostr, "LDAP")) {
conn->protocol |= PROT_LDAP;
- conn->port = (data->set.use_port && allow_port)?data->set.use_port:PORT_LDAP;
+ conn->port = (data->set.use_port && data->state.allow_port)?
+ data->set.use_port:PORT_LDAP;
conn->remote_port = PORT_LDAP;
conn->curl_do = Curl_ldap;
conn->curl_done = NULL; /* no LDAP-specific done */
@@ -2228,14 +2234,13 @@ static CURLcode CreateConnection(struct SessionHandle *data,
}
CURLcode Curl_connect(struct SessionHandle *data,
- struct connectdata **in_connect,
- bool allow_port)
+ struct connectdata **in_connect)
{
CURLcode code;
struct connectdata *conn;
/* call the stuff that needs to be called */
- code = CreateConnection(data, in_connect, allow_port);
+ code = CreateConnection(data, in_connect);
if(CURLE_OK != code) {
/* We're not allowed to return failure with memory left allocated
@@ -2291,14 +2296,38 @@ CURLcode Curl_done(struct connectdata *conn)
return result;
}
-CURLcode Curl_do(struct connectdata *conn)
+CURLcode Curl_do(struct connectdata **connp)
{
CURLcode result=CURLE_OK;
+ struct connectdata *conn = *connp;
+ struct SessionHandle *data=conn->data;
- if(conn->curl_do)
+ if(conn->curl_do) {
/* generic protocol-specific function pointer set in curl_connect() */
result = conn->curl_do(conn);
+ /* This was formerly done in transfer.c, but we better do it here */
+
+ if((CURLE_WRITE_ERROR == result) && conn->bits.reuse) {
+ /* This was a re-use of a connection and we got a write error in the
+ * DO-phase. Then we DISCONNECT this connection and have another attempt
+ * to CONNECT and then DO again! The retry cannot possibly find another
+ * connection to re-use, since we only keep one possible connection for
+ * each. */
+
+ infof(data, "Re-used connection seems dead, get a new one\n");
+
+ conn->bits.close = TRUE; /* enforce close of this connetion */
+ result = Curl_done(conn); /* we are so done with this */
+ if(CURLE_OK == result) {
+ /* Now, redo the connect and get a new connection */
+ result = Curl_connect(data, connp);
+ if(CURLE_OK == result)
+ /* ... finally back to actually retry the DO phase */
+ result = conn->curl_do(*connp);
+ }
+ }
+ }
return result;
}