tBug fixes for HTTP via. SOCKS, and better handling of metaserver errors - 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 cf398e69218df2ba898ed0bb7db97b76b71028e5
(DIR) parent f8dc591b26deac71c0a9bb30898186158bf1864f
(HTM) Author: Ben Webb <ben@salilab.org>
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(-)
---
(DIR) diff --git a/src/curses_client.c b/src/curses_client.c
t@@ -261,7 +261,7 @@ static gboolean SelectServerFromMetaServer(Player *Play,GString *errstr) {
#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)) {
(DIR) diff --git a/src/gtk_client.c b/src/gtk_client.c
t@@ -1933,6 +1933,10 @@ static gboolean GetStartGamePlayerName(struct StartGameStruct *widgets,
}
#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,gboolean meta) {
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 Read,gboolean Write) {
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
(DIR) 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,GSList **listpt) {
/* 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 {
(DIR) 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 */
(DIR) 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 *HostName,
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)) {