tAllowed callback data to be passed to HTTP auth functions; improved HTTP error reporting - 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 b4729306d9495827dacb6056343b382af67c6608
(DIR) parent 62523aa3d60bd5a9ea19f35c4af2f8ce36b03f9d
(HTM) Author: Ben Webb <ben@salilab.org>
Date: Fri, 12 Oct 2001 17:34:48 +0000
Allowed callback data to be passed to HTTP auth functions; improved HTTP error reporting
Diffstat:
M src/gtk_client.c | 100 ++++++++++++++++++++++++-------
M src/network.c | 5 +++--
M src/network.h | 5 +++--
3 files changed, 83 insertions(+), 27 deletions(-)
---
(DIR) diff --git a/src/gtk_client.c b/src/gtk_client.c
t@@ -96,7 +96,8 @@ static void StartGame(void);
static void EndGame(void);
static void UpdateMenus(void);
static void AuthDialog(HttpConnection *conn,
- gboolean proxyauth,gchar *realm);
+ gboolean proxyauth,gchar *realm,
+ gpointer data);
#ifdef NETWORKING
static void GetClientMessage(gpointer data,gint socket,
t@@ -2050,12 +2051,61 @@ static void FillMetaServerList(struct StartGameStruct *widgets,
gtk_clist_thaw(GTK_CLIST(metaserv));
}
+static void SetMetaStatus(struct StartGameStruct *widgets,
+ NBStatus oldstatus,NBSocksStatus oldsocks) {
+ NBStatus status;
+ NBSocksStatus sockstat;
+ gchar *text;
+
+ status = widgets->MetaConn->NetBuf.status;
+ sockstat = widgets->MetaConn->NetBuf.sockstat;
+ if (oldstatus==status && sockstat==oldsocks) return;
+
+ switch (status) {
+ case NBS_PRECONNECT:
+ break;
+ case NBS_SOCKSCONNECT:
+ switch (sockstat) {
+ case NBSS_METHODS:
+ text=g_strdup_printf(_("Status: Connected to SOCKS server %s..."),
+ Socks.name);
+ SetStartGameStatus(widgets,text); g_free(text);
+ break;
+ case NBSS_USERPASSWD:
+ SetStartGameStatus(widgets,
+ _("Status: Authenticating with SOCKS server"));
+ break;
+ case NBSS_CONNECT:
+ text=g_strdup_printf(_("Status: Asking SOCKS for connect to %s..."),
+ MetaServer.Name);
+ SetStartGameStatus(widgets,text); g_free(text);
+ break;
+ }
+ break;
+ case NBS_CONNECTED:
+ SetStartGameStatus(widgets,
+ _("Status: Obtaining server information from metaserver..."));
+ break;
+ }
+}
+
+static void MetaDone(struct StartGameStruct *widgets) {
+ if (IsHttpError(widgets->MetaConn)) {
+ ConnectError(widgets,TRUE);
+ } else {
+ SetStartGameStatus(widgets,NULL);
+ }
+ CloseHttpConnection(widgets->MetaConn);
+ widgets->MetaConn=NULL;
+ FillMetaServerList(widgets,TRUE);
+}
+
static void HandleMetaSock(gpointer data,gint socket,
GdkInputCondition condition) {
struct StartGameStruct *widgets;
gboolean DoneOK;
- NBStatus oldstatus,newstatus;
- gchar *text;
+ NBStatus oldstatus;
+ NBSocksStatus oldsocks;
g_print("HandleMetaSock: read %d, write %d\n",
condition&GDK_INPUT_READ,
t@@ -2064,30 +2114,18 @@ g_print("HandleMetaSock: read %d, write %d\n",
if (!widgets->MetaConn) return;
oldstatus = widgets->MetaConn->NetBuf.status;
+ oldsocks = widgets->MetaConn->NetBuf.sockstat;
if (NetBufHandleNetwork(&widgets->MetaConn->NetBuf,condition&GDK_INPUT_READ,
condition&GDK_INPUT_WRITE,&DoneOK)) {
while (HandleWaitingMetaServerData(widgets->MetaConn,
&widgets->NewMetaList,&DoneOK)) {}
}
- newstatus = widgets->MetaConn->NetBuf.status;
- if (newstatus == NBS_SOCKSCONNECT && oldstatus==NBS_PRECONNECT) {
- text=g_strdup_printf(_("Status: Connected to SOCKS server %s..."),
- Socks.name);
- SetStartGameStatus(widgets,text); g_free(text);
- } else if (newstatus == NBS_CONNECTED && oldstatus!=NBS_CONNECTED) {
- SetStartGameStatus(widgets,
- _("Status: Obtaining server information from metaserver"));
- }
+
if (!DoneOK && HandleHttpCompletion(widgets->MetaConn)) {
- if (IsHttpError(widgets->MetaConn)) {
- ConnectError(widgets,TRUE);
- } else {
- SetStartGameStatus(widgets,NULL);
- }
- CloseHttpConnection(widgets->MetaConn);
- widgets->MetaConn=NULL;
- FillMetaServerList(widgets,TRUE);
+ MetaDone(widgets);
+ } else {
+ SetMetaStatus(widgets,oldstatus,oldsocks);
}
}
t@@ -2122,7 +2160,7 @@ static void UpdateMetaServerList(GtkWidget *widget,
if (OpenMetaHttpConnection(&widgets->MetaConn)) {
metaserv=widgets->metaserv;
- SetHttpAuthFunc(widgets->MetaConn,AuthDialog);
+ SetHttpAuthFunc(widgets->MetaConn,AuthDialog,(gpointer)widgets);
SetNetworkBufferCallBack(&widgets->MetaConn->NetBuf,
MetaSocketStatus,(gpointer)widgets);
} else {
t@@ -3138,36 +3176,52 @@ static void DestroyAuthDialog(GtkWidget *window,gpointer data) {
GtkWidget *userentry,*passwdentry;
gchar *username=NULL,*password=NULL;
gpointer proxy,authok;
+ struct StartGameStruct *widgets;
HttpConnection *conn;
+ NBStatus oldstatus;
+ NBSocksStatus oldsocks;
authok = gtk_object_get_data(GTK_OBJECT(window),"authok");
proxy = gtk_object_get_data(GTK_OBJECT(window),"proxy");
userentry = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(window),"username");
passwdentry = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(window),
"password");
+ widgets = (struct StartGameStruct *)gtk_object_get_data(GTK_OBJECT(window),
+ "widgets");
conn = (HttpConnection *)gtk_object_get_data(GTK_OBJECT(window),"httpconn");
- g_assert(userentry && passwdentry && conn);
+ g_assert(userentry && passwdentry && conn && widgets);
if (authok) {
username = gtk_editable_get_chars(GTK_EDITABLE(userentry),0,-1);
password = gtk_editable_get_chars(GTK_EDITABLE(passwdentry),0,-1);
}
+ oldstatus = widgets->MetaConn->NetBuf.status;
+ oldsocks = widgets->MetaConn->NetBuf.sockstat;
+
if (!SetHttpAuthentication(conn,GPOINTER_TO_INT(proxy),username,password)) {
g_print("FIXME: Connect error on setauth\n");
+ MetaDone(widgets);
+ } else {
+ SetMetaStatus(widgets,oldstatus,oldsocks);
}
g_free(username); g_free(password);
}
-void AuthDialog(HttpConnection *conn,gboolean proxy,gchar *realm) {
+void AuthDialog(HttpConnection *conn,gboolean proxy,gchar *realm,
+ gpointer data) {
GtkWidget *window,*button,*hsep,*vbox,*label,*entry,*table,*hbbox;
+ struct StartGameStruct *widgets;
+
+ widgets = (struct StartGameStruct *)data;
window=gtk_window_new(GTK_WINDOW_DIALOG);
gtk_signal_connect(GTK_OBJECT(window),"destroy",
GTK_SIGNAL_FUNC(DestroyAuthDialog),NULL);
gtk_object_set_data(GTK_OBJECT(window),"proxy",GINT_TO_POINTER(proxy));
gtk_object_set_data(GTK_OBJECT(window),"httpconn",(gpointer)conn);
+ gtk_object_set_data(GTK_OBJECT(window),"widgets",(gpointer)widgets);
if (proxy) {
gtk_window_set_title(GTK_WINDOW(window),
(DIR) diff --git a/src/network.c b/src/network.c
t@@ -1059,9 +1059,10 @@ gboolean SetHttpAuthentication(HttpConnection *conn,gboolean proxy,
else return TRUE;
}
-void SetHttpAuthFunc(HttpConnection *conn,HCAuthFunc authfunc) {
+void SetHttpAuthFunc(HttpConnection *conn,HCAuthFunc authfunc,gpointer data) {
g_assert(conn && authfunc);
conn->authfunc = authfunc;
+ conn->authdata = data;
}
static gboolean ParseHtmlLocation(gchar *uri,gchar **host,unsigned *port,
t@@ -1113,7 +1114,7 @@ static void StartHttpAuth(HttpConnection *conn,gboolean proxy,gchar *header) {
g_strncasecmp(split[1],"realm=",6)==0 && strlen(split[1])>6) {
realm = &split[1][6];
conn->waitinput=TRUE;
- (*conn->authfunc)(conn,proxy,realm);
+ (*conn->authfunc)(conn,proxy,realm,conn->authdata);
} else {
g_print("FIXME: Bad HTTP auth header\n");
}
(DIR) diff --git a/src/network.h b/src/network.h
t@@ -124,7 +124,7 @@ typedef enum {
typedef struct _HttpConnection HttpConnection;
typedef void (*HCAuthFunc)(struct _HttpConnection *conn,
- gboolean proxyauth,gchar *realm);
+ gboolean proxyauth,gchar *realm,gpointer data);
/* A structure used to keep track of an HTTP connection */
struct _HttpConnection {
t@@ -140,6 +140,7 @@ struct _HttpConnection {
gchar *RedirQuery; /* if non-NULL, the path to redirect to */
unsigned RedirPort; /* The port on the host to redirect to */
HCAuthFunc authfunc; /* Callback function for authentication */
+ gpointer authdata; /* Data to be passed to authfunc */
gboolean waitinput; /* TRUE if we're waiting for auth etc.
to be supplied */
gchar *user; /* The supplied username for HTTP auth */
t@@ -188,7 +189,7 @@ gboolean IsHttpError(HttpConnection *conn);
gchar *ReadHttpResponse(HttpConnection *conn);
gboolean SetHttpAuthentication(HttpConnection *conn,gboolean proxy,
gchar *user,gchar *password);
-void SetHttpAuthFunc(HttpConnection *conn,HCAuthFunc authfunc);
+void SetHttpAuthFunc(HttpConnection *conn,HCAuthFunc authfunc,gpointer data);
gboolean HandleHttpCompletion(HttpConnection *conn);
int CreateTCPSocket(LastError *error);