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)) {