tHTTP connection error and status reporting improved - vaccinewars - be a doctor and try to vaccinate the world
(HTM) git clone git://src.adamsgaard.dk/vaccinewars
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit a09e6292bf62e8174a499e147c5d9f276ed2b466
(DIR) parent b4729306d9495827dacb6056343b382af67c6608
(HTM) Author: Ben Webb <ben@salilab.org>
Date: Fri, 12 Oct 2001 18:20:55 +0000
HTTP connection error and status reporting improved
Diffstat:
M src/gtk_client.c | 9 +++++----
M src/network.c | 89 ++++++++++++++++++++++++-------
2 files changed, 75 insertions(+), 23 deletions(-)
---
(DIR) diff --git a/src/gtk_client.c b/src/gtk_client.c
t@@ -2051,8 +2051,9 @@ static void FillMetaServerList(struct StartGameStruct *widgets,
gtk_clist_thaw(GTK_CLIST(metaserv));
}
-static void SetMetaStatus(struct StartGameStruct *widgets,
- NBStatus oldstatus,NBSocksStatus oldsocks) {
+static void DisplayConnectStatus(struct StartGameStruct *widgets,
+ gboolean meta,
+ NBStatus oldstatus,NBSocksStatus oldsocks) {
NBStatus status;
NBSocksStatus sockstat;
gchar *text;
t@@ -2125,7 +2126,7 @@ g_print("HandleMetaSock: read %d, write %d\n",
if (!DoneOK && HandleHttpCompletion(widgets->MetaConn)) {
MetaDone(widgets);
} else {
- SetMetaStatus(widgets,oldstatus,oldsocks);
+ DisplayConnectStatus(widgets,TRUE,oldstatus,oldsocks);
}
}
t@@ -3203,7 +3204,7 @@ static void DestroyAuthDialog(GtkWidget *window,gpointer data) {
g_print("FIXME: Connect error on setauth\n");
MetaDone(widgets);
} else {
- SetMetaStatus(widgets,oldstatus,oldsocks);
+ DisplayConnectStatus(widgets,TRUE,oldstatus,oldsocks);
}
g_free(username); g_free(password);
(DIR) diff --git a/src/network.c b/src/network.c
t@@ -331,6 +331,56 @@ static void SocksAppendError(GString *str,LastError *error) {
static ErrorType ETSocks = { SocksAppendError };
+typedef enum {
+ HEC_TRIESEX = 1,
+ HEC_OK = 200,
+ HEC_REDIRECT = 300,
+ HEC_MOVEPERM = 301,
+ HEC_MOVETEMP = 302,
+ HEC_CLIENTERR = 400,
+ HEC_AUTHREQ = 401,
+ HEC_PROXYAUTH = 407,
+ HEC_FORBIDDEN = 403,
+ HEC_NOTFOUND = 404,
+ HEC_SERVERERR = 500
+} HTTPErrorCode;
+
+static void HTTPAppendError(GString *str,LastError *error) {
+ switch (error->code) {
+ case HEC_TRIESEX:
+ g_string_append(str,_("Number of tries exceeded"));
+ break;
+ case HEC_FORBIDDEN:
+ g_string_append(str,_("403: forbidden"));
+ break;
+ case HEC_NOTFOUND:
+ g_string_append(str,_("404: page not found"));
+ break;
+ case HEC_AUTHREQ:
+ g_string_append(str,_("401: HTTP authentication failed"));
+ break;
+ case HEC_PROXYAUTH:
+ g_string_append(str,_("407: HTTP proxy authentication failed"));
+ break;
+ case HEC_MOVETEMP: case HEC_MOVEPERM:
+ g_string_append(str,_("Bad redirect message from server"));
+ break;
+ default:
+ if (error->code<HEC_REDIRECT || error->code>=600) {
+ g_string_sprintfa(str,_("Unknown HTTP error %d"),error->code);
+ } else if (error->code<HEC_CLIENTERR) {
+ g_string_sprintfa(str,_("%d: redirect error"),error->code);
+ } else if (error->code<HEC_SERVERERR) {
+ g_string_sprintfa(str,_("%d: HTTP client error"),error->code);
+ } else {
+ g_string_sprintfa(str,_("%d: HTTP server error"),error->code);
+ }
+ break;
+ }
+}
+
+static ErrorType ETHTTP = { HTTPAppendError };
+
static gboolean Socks5UserPasswd(NetworkBuffer *NetBuf) {
if (!NetBuf->userpasswd) {
SetError(&NetBuf->error,&ETSocks,SEC_NOMETHODS);
t@@ -358,7 +408,8 @@ gboolean SendSocks5UserPasswd(NetworkBuffer *NetBuf,gchar *user,
addlen = 3 + strlen(user) + strlen(password);
addpt = ExpandWriteBuffer(conn,addlen);
if (!addpt || strlen(user)>255 || strlen(password)>255) {
- g_print("FIXME: buffer size exceeded\n"); return FALSE;
+ SetError(&NetBuf->error,ET_CUSTOM,E_FULLBUF);
+ return FALSE;
}
addpt[0] = 1; /* Subnegotiation version code */
addpt[1] = strlen(user);
t@@ -393,7 +444,8 @@ static gboolean Socks5Connect(NetworkBuffer *NetBuf) {
addlen = hostlen + 7;
addpt = ExpandWriteBuffer(conn,addlen);
if (!addpt) {
- g_print("FIXME: buffer size exceeded\n"); return FALSE;
+ SetError(&NetBuf->error,ET_CUSTOM,E_FULLBUF);
+ return FALSE;
}
addpt[0] = 5; /* SOCKS version 5 */
addpt[1] = 1; /* CONNECT */
t@@ -492,12 +544,10 @@ g_print("FIXME: SOCKS5 connect reply\n");
data = GetWaitingData(NetBuf,8);
if (data) {
retval=FALSE;
- g_print("FIXME: Reply from SOCKS4 server: %d %d\n",data[0],data[1]);
if (data[0]!=0) {
SetError(&NetBuf->error,&ETSocks,SEC_REPLYVERSION);
} else {
if (data[1]==90) {
- g_print("FIXME: SOCKS4 sucessful connect\n");
NetBuf->status = NBS_CONNECTED;
NetBufCallBack(NetBuf); /* status has changed */
retval=TRUE;
t@@ -800,7 +850,8 @@ gboolean StartSocksNegotiation(NetworkBuffer *NetBuf,gchar *RemoteHost,
addlen=2+num_methods;
addpt = ExpandWriteBuffer(conn,addlen);
if (!addpt) {
- g_print("FIXME: buffer size exceeded\n"); return FALSE;
+ SetError(&NetBuf->error,ET_CUSTOM,E_FULLBUF);
+ return FALSE;
}
addpt[0] = 5; /* SOCKS version 5 */
addpt[1] = num_methods;
t@@ -856,7 +907,8 @@ g_print("username %s\n",pwd->pw_name);
addpt = ExpandWriteBuffer(conn,addlen);
if (!addpt) {
- g_print("FIXME: buffer size exceeded\n"); return FALSE;
+ SetError(&NetBuf->error,ET_CUSTOM,E_FULLBUF);
+ return FALSE;
}
addpt[0] = 4; /* SOCKS version */
t@@ -871,8 +923,6 @@ g_print("username %s\n",pwd->pw_name);
#endif
addpt[addlen-1] = '\0';
- g_print("FIXME: SOCKS4 CONNECT request sent\n");
-
conn->DataPresent+=addlen;
/* If the buffer was empty before, we may need to tell the owner to check
t@@ -1129,7 +1179,7 @@ static void ParseHtmlHeader(gchar *line,HttpConnection *conn) {
split=g_strsplit(line," ",1);
if (split[0] && split[1]) {
if (g_strcasecmp(split[0],"Location:")==0 &&
- (conn->StatusCode==302 || conn->StatusCode==301)) {
+ (conn->StatusCode==HEC_MOVETEMP || conn->StatusCode==HEC_MOVEPERM)) {
if (ParseHtmlLocation(split[1],&host,&port,&query)) {
g_print("Redirect to %s:%u%s\n",host,port,query);
g_free(conn->RedirHost); g_free(conn->RedirQuery);
t@@ -1139,13 +1189,13 @@ static void ParseHtmlHeader(gchar *line,HttpConnection *conn) {
g_print("FIXME: Bad redirect\n");
}
} else if (g_strcasecmp(split[0],"WWW-Authenticate:")==0 &&
- conn->StatusCode==401) {
+ conn->StatusCode==HEC_AUTHREQ) {
g_print("FIXME: Authentication %s required\n",split[1]);
StartHttpAuth(conn,FALSE,split[1]);
/* Proxy-Authenticate is, strictly speaking, an HTTP/1.1 thing, but some
HTTP/1.0 proxies seem to support it anyway */
} else if (g_strcasecmp(split[0],"Proxy-Authenticate:")==0 &&
- conn->StatusCode==407) {
+ conn->StatusCode==HEC_PROXYAUTH) {
g_print("FIXME: Proxy authentication %s required\n",split[1]);
StartHttpAuth(conn,TRUE,split[1]);
}
t@@ -1163,7 +1213,6 @@ gchar *ReadHttpResponse(HttpConnection *conn) {
split=g_strsplit(msg," ",2);
if (split[0] && split[1]) {
conn->StatusCode=atoi(split[1]);
- g_print("HTTP status code %d returned\n",conn->StatusCode);
} else g_warning("Invalid HTTP status line %s",msg);
g_strfreev(split);
break;
t@@ -1188,6 +1237,9 @@ gboolean HandleHttpCompletion(HttpConnection *conn) {
gpointer CallBackData;
NBUserPasswd userpasswd;
gboolean retry=FALSE;
+ LastError *error;
+
+ error=&conn->NetBuf.error;
/* If we're still waiting for authentication etc., then signal that the
connection shouldn't be closed yet, and go into the "WAITCOMPLETE" state */
t@@ -1197,7 +1249,7 @@ gboolean HandleHttpCompletion(HttpConnection *conn) {
}
if (conn->Tries>=5) {
- g_print("FIXME: Number of tries exceeded\n");
+ SetError(error,ÐTTP,HEC_TRIESEX);
return TRUE;
}
t@@ -1210,11 +1262,12 @@ gboolean HandleHttpCompletion(HttpConnection *conn) {
conn->RedirHost = conn->RedirQuery = NULL;
retry = TRUE;
}
- if (conn->StatusCode==401 && conn->user && conn->password) {
+ if (conn->StatusCode==HEC_AUTHREQ && conn->user && conn->password) {
g_print("Trying again with authentication\n");
retry = TRUE;
}
- if (conn->StatusCode==407 && conn->proxyuser && conn->proxypassword) {
+ if (conn->StatusCode==HEC_PROXYAUTH && conn->proxyuser &&
+ conn->proxypassword) {
g_print("Trying again with proxy authentication\n");
retry = TRUE;
}
t@@ -1230,10 +1283,8 @@ gboolean HandleHttpCompletion(HttpConnection *conn) {
SetNetworkBufferUserPasswdFunc(&conn->NetBuf,userpasswd);
return FALSE;
}
- } else {
- if (conn->StatusCode>=300) {
- g_print("FIXME: Connection failed, code %d\n",conn->StatusCode);
- }
+ } else if (conn->StatusCode>=300) {
+ SetError(error,ÐTTP,conn->StatusCode);
}
return TRUE;
}