tBug fixes for HTTP via. SOCKS, and better handling of metaserver errors - vacc… | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit cf398e69218df2ba898ed0bb7db97b76b71028e5 | |
parent f8dc591b26deac71c0a9bb30898186158bf1864f | |
Author: Ben Webb <[email protected]> | |
Date: Tue, 9 Oct 2001 20:23:07 +0000 | |
Bug fixes for HTTP via. SOCKS, and better handling of metaserver errors | |
Diffstat: | |
M src/curses_client.c | 2 +- | |
M src/gtk_client.c | 32 +++++++++++++++++++++++++----… | |
M src/message.c | 14 ++++++++++++-- | |
M src/message.h | 3 ++- | |
M src/network.c | 7 ++++++- | |
5 files changed, 47 insertions(+), 11 deletions(-) | |
--- | |
diff --git a/src/curses_client.c b/src/curses_client.c | |
t@@ -261,7 +261,7 @@ static gboolean SelectServerFromMetaServer(Player *Play,GS… | |
#endif | |
} | |
if (RespondToSelect(&MetaConn->NetBuf,&readfds,&writefds,NULL,&DoneOK)) { | |
- while (HandleWaitingMetaServerData(MetaConn,&ServerList)) {} | |
+ while (HandleWaitingMetaServerData(MetaConn,&ServerList,&DoneOK)) {} | |
} | |
if (!DoneOK && HandleHttpCompletion(MetaConn)) { | |
if (IsHttpError(MetaConn)) { | |
diff --git a/src/gtk_client.c b/src/gtk_client.c | |
t@@ -1933,6 +1933,10 @@ static gboolean GetStartGamePlayerName(struct StartGame… | |
} | |
#ifdef NETWORKING | |
+static void SetStartGameStatus(struct StartGameStruct *widgets,gchar *msg) { | |
+ gtk_label_set_text(GTK_LABEL(widgets->status),msg); | |
+} | |
+ | |
static void ConnectError(struct StartGameStruct *widgets,gboolean meta) { | |
GString *neterr; | |
gchar *text; | |
t@@ -1955,8 +1959,7 @@ static void ConnectError(struct StartGameStruct *widgets… | |
text=g_strdup_printf(_("Status: Could not connect (%s)"),neterr->str); | |
} | |
- gtk_label_set_text(GTK_LABEL(widgets->status),text); | |
- g_free(text); | |
+ SetStartGameStatus(widgets,text); g_free(text); | |
g_string_free(neterr,TRUE); | |
} | |
t@@ -1974,7 +1977,13 @@ static void DoConnect(struct StartGameStruct *widgets) { | |
gchar *text; | |
/* Message displayed during the attempted connect to a dopewars server */ | |
text=g_strdup_printf(_("Status: Attempting to contact %s..."),ServerName); | |
- gtk_label_set_text(GTK_LABEL(widgets->status),text); g_free(text); | |
+ SetStartGameStatus(widgets,text); g_free(text); | |
+ | |
+/* Terminate any existing connection attempts */ | |
+ ShutdownNetworkBuffer(&ClientData.Play->NetBuf); | |
+ if (widgets->MetaConn) { | |
+ CloseHttpConnection(widgets->MetaConn); widgets->MetaConn=NULL; | |
+ } | |
if (StartNetworkBufferConnect(&ClientData.Play->NetBuf,ServerName,Port)) { | |
SetNetworkBufferCallBack(&ClientData.Play->NetBuf,SocketStatus, | |
t@@ -2050,7 +2059,7 @@ static void HandleMetaSock(gpointer data,gint socket, | |
if (NetBufHandleNetwork(&widgets->MetaConn->NetBuf,condition&GDK_INPUT_READ, | |
condition&GDK_INPUT_WRITE,&DoneOK)) { | |
while (HandleWaitingMetaServerData(widgets->MetaConn, | |
- &widgets->NewMetaList)) {} | |
+ &widgets->NewMetaList,&DoneOK)) {} | |
} | |
if (!DoneOK && HandleHttpCompletion(widgets->MetaConn)) { | |
ConnectError(widgets,TRUE); | |
t@@ -2074,11 +2083,21 @@ void MetaSocketStatus(NetworkBuffer *NetBuf,gboolean R… | |
static void UpdateMetaServerList(GtkWidget *widget, | |
struct StartGameStruct *widgets) { | |
GtkWidget *metaserv; | |
+ gchar *text; | |
+ | |
+/* Terminate any existing connection attempts */ | |
+ ShutdownNetworkBuffer(&ClientData.Play->NetBuf); | |
if (widgets->MetaConn) { | |
CloseHttpConnection(widgets->MetaConn); widgets->MetaConn=NULL; | |
} | |
+ | |
ClearServerList(&widgets->NewMetaList); | |
+/* Message displayed during the attempted connect to the metaserver */ | |
+ text=g_strdup_printf(_("Status: Attempting to contact %s..."), | |
+ MetaServer.Name); | |
+ SetStartGameStatus(widgets,text); g_free(text); | |
+ | |
if (OpenMetaHttpConnection(&widgets->MetaConn)) { | |
metaserv=widgets->metaserv; | |
SetHttpAuthFunc(widgets->MetaConn,AuthDialog); | |
t@@ -2123,9 +2142,10 @@ static void StartSinglePlayer(GtkWidget *widget, | |
static void CloseNewGameDia(GtkWidget *widget, | |
struct StartGameStruct *widgets) { | |
#ifdef NETWORKING | |
+/* Terminate any existing connection attempts */ | |
+ ShutdownNetworkBuffer(&ClientData.Play->NetBuf); | |
if (widgets->MetaConn) { | |
- CloseHttpConnection(widgets->MetaConn); | |
- widgets->MetaConn=NULL; | |
+ CloseHttpConnection(widgets->MetaConn); widgets->MetaConn=NULL; | |
} | |
ClearServerList(&widgets->NewMetaList); | |
#endif | |
diff --git a/src/message.c b/src/message.c | |
t@@ -317,9 +317,11 @@ gboolean OpenMetaHttpConnection(HttpConnection **conn) { | |
return retval; | |
} | |
-gboolean HandleWaitingMetaServerData(HttpConnection *conn,GSList **listpt) { | |
+gboolean HandleWaitingMetaServerData(HttpConnection *conn,GSList **listpt, | |
+ gboolean *doneOK) { | |
gchar *msg; | |
ServerData *NewServer; | |
+ g_assert(conn && listpt && doneOK); | |
/* If we're done reading the headers, only read if the data for a whole | |
server is available (8 lines) N.B. "Status" is from the _last_ read */ | |
t@@ -346,8 +348,16 @@ gboolean HandleWaitingMetaServerData(HttpConnection *conn… | |
/* This should be the first line of the body, the "MetaServer:" line */ | |
msg=ReadHttpResponse(conn); | |
if (!msg) return FALSE; | |
- if (strncmp(msg,"MetaServer:",11)!=0) { | |
+ if (strlen(msg)>=14 && strncmp(msg,"FATAL ERROR:",12)==0) { | |
+ g_warning("Metaserver error: %s",&msg[13]); | |
+ g_free(msg); | |
+ *doneOK=FALSE; | |
+ return FALSE; | |
+ } else if (strncmp(msg,"MetaServer:",11)!=0) { | |
g_warning("Bad reply from metaserver: %s",msg); | |
+ g_free(msg); | |
+ *doneOK=FALSE; | |
+ return FALSE; | |
} | |
g_free(msg); | |
} else { | |
diff --git a/src/message.h b/src/message.h | |
t@@ -82,7 +82,8 @@ gboolean WritePlayerDataToWire(Player *Play); | |
gchar *GetWaitingPlayerMessage(Player *Play); | |
gboolean OpenMetaHttpConnection(HttpConnection **conn); | |
-gboolean HandleWaitingMetaServerData(HttpConnection *conn,GSList **listpt); | |
+gboolean HandleWaitingMetaServerData(HttpConnection *conn,GSList **listpt, | |
+ gboolean *doneOK); | |
void ClearServerList(GSList **listpt); | |
#endif /* NETWORKING */ | |
diff --git a/src/network.c b/src/network.c | |
t@@ -460,6 +460,7 @@ g_print("FIXME: SOCKS5 connect reply\n"); | |
g_print("FIXME: SOCKS5 sucessful connect\n"); | |
NetBuf->status = NBS_CONNECTED; | |
g_free(data); | |
+ NetBufCallBack(NetBuf); /* status has changed */ | |
} | |
} | |
} | |
t@@ -475,6 +476,7 @@ g_print("FIXME: SOCKS5 connect reply\n"); | |
} else { | |
if (data[1]==90) { | |
NetBuf->status = NBS_CONNECTED; | |
+ NetBufCallBack(NetBuf); /* status has changed */ | |
retval=TRUE; | |
} else if (data[1]>=SEC_REJECT && data[1]<=SEC_IDMISMATCH) { | |
SetError(&NetBuf->error,&ETSocks,data[1]); | |
t@@ -592,6 +594,8 @@ gint CountWaitingMessages(NetworkBuffer *NetBuf) { | |
ConnBuf *conn; | |
gint i,msgs=0; | |
+ if (NetBuf->status!=NBS_CONNECTED) return 0; | |
+ | |
conn=&NetBuf->ReadBuf; | |
if (conn->Data) for (i=0;i<conn->DataPresent;i++) { | |
t@@ -633,7 +637,7 @@ gchar *GetWaitingMessage(NetworkBuffer *NetBuf) { | |
char *SepPt; | |
gchar *NewMessage; | |
conn=&NetBuf->ReadBuf; | |
- if (!conn->Data || !conn->DataPresent/* || NetBuf->status!=NBS_CONNECTED*/)… | |
+ if (!conn->Data || !conn->DataPresent || NetBuf->status!=NBS_CONNECTED) { | |
return NULL; | |
} | |
SepPt=memchr(conn->Data,NetBuf->Terminator,conn->DataPresent); | |
t@@ -953,6 +957,7 @@ gboolean OpenHttpConnection(HttpConnection **connpt,gchar … | |
if (Body && Body[0]) conn->Body=g_strdup(Body); | |
conn->Port = Port; | |
conn->ProxyPort = ProxyPort; | |
+ conn->user = conn->password = NULL; | |
*connpt = conn; | |
if (StartHttpConnect(conn)) { |