annotate libpurple/protocols/jabber/bosh.c @ 25669:828640306e31

Don't track a cb-per-POST and remove the PurpleHTTPResponse structure. The only callback ever used is http_received_cb and the ordering of responses from the server is not guaranteed to match the order of our requests, so the metaphor of matching them doesn't make sense. Instead of that, just track the number of requests (to ensure there is always a request outstanding). Additionally, pass the data const-ified instead of copying it. It's just fed to an XML parser anyway.
author Paul Aurich <paul@darkrain42.org>
date Wed, 21 Jan 2009 00:19:33 +0000
parents 8c58f31f41eb
children c11c14dde641
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25038
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
1 /*
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
2 * purple - Jabber Protocol Plugin
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
3 *
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
4 * Copyright (C) 2008, Tobias Markmann <tmarkmann@googlemail.com>
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
5 *
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
6 * This program is free software; you can redistribute it and/or modify
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
7 * it under the terms of the GNU General Public License as published by
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
9 * (at your option) any later version.
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
10 *
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
11 * This program is distributed in the hope that it will be useful,
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
14 * GNU General Public License for more details.
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
15 *
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
17 * along with this program; if not, write to the Free Software
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
19 *
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
20 */
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
21 #include "internal.h"
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
22 #include "core.h"
25038
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
23 #include "cipher.h"
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
24 #include "debug.h"
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
25 #include "prpl.h"
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
26 #include "util.h"
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
27 #include "xmlnode.h"
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
28
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
29 #include "bosh.h"
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
30
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
31 typedef struct _PurpleHTTPRequest PurpleHTTPRequest;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
32 typedef struct _PurpleHTTPConnection PurpleHTTPConnection;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
33
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
34 typedef void (*PurpleHTTPConnectionConnectFunction)(PurpleHTTPConnection *conn);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
35 typedef void (*PurpleHTTPConnectionDisconnectFunction)(PurpleHTTPConnection *conn);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
36 typedef void (*PurpleBOSHConnectionConnectFunction)(PurpleBOSHConnection *conn);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
37 typedef void (*PurpleBOSHConnectionReceiveFunction)(PurpleBOSHConnection *conn, xmlnode *node);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
38
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
39 static char *bosh_useragent = NULL;
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
40
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
41 struct _PurpleBOSHConnection {
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
42 /* decoded URL */
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
43 char *host;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
44 int port;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
45 char *path;
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
46
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
47 /* Must be big enough to hold 2^53 - 1 */
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
48 guint64 rid;
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
49 char *sid;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
50 int wait;
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
51
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
52 JabberStream *js;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
53 gboolean pipelining;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
54 PurpleHTTPConnection *conn_a;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
55 PurpleHTTPConnection *conn_b;
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
56
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
57 gboolean ready;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
58 PurpleBOSHConnectionConnectFunction connect_cb;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
59 PurpleBOSHConnectionReceiveFunction receive_cb;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
60 };
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
61
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
62 struct _PurpleHTTPConnection {
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
63 int fd;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
64 char *host;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
65 int port;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
66 int ie_handle;
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
67 int requests; /* number of outstanding HTTP requests */
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
68
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
69 GString *buf;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
70 gboolean headers_done;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
71 gsize handled_len;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
72 gsize body_len;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
73
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
74 int pih; /* what? */
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
75 PurpleHTTPConnectionConnectFunction connect_cb;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
76 PurpleHTTPConnectionConnectFunction disconnect_cb;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
77 void *userdata;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
78 };
25038
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
79
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
80 struct _PurpleHTTPRequest {
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
81 const char *path;
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
82 char *data;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
83 int data_len;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
84 void *userdata;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
85 };
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
86
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
87 static void jabber_bosh_connection_stream_restart(PurpleBOSHConnection *conn);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
88 static gboolean jabber_bosh_connection_error_check(PurpleBOSHConnection *conn, xmlnode *node);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
89 static void jabber_bosh_connection_received(PurpleBOSHConnection *conn, xmlnode *node);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
90 static void jabber_bosh_connection_send_native(PurpleBOSHConnection *conn, xmlnode *node);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
91
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
92 static void jabber_bosh_http_connection_connect(PurpleHTTPConnection *conn);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
93 static void jabber_bosh_http_connection_send_request(PurpleHTTPConnection *conn, PurpleHTTPRequest *req);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
94
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
95 void jabber_bosh_init(void)
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
96 {
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
97 GHashTable *ui_info = purple_core_get_ui_info();
25668
8c58f31f41eb The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <paul@darkrain42.org>
parents: 25667
diff changeset
98 const char *ui_name = NULL;
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
99 const char *ui_version = NULL;
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
100
25668
8c58f31f41eb The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <paul@darkrain42.org>
parents: 25667
diff changeset
101 if (ui_info) {
8c58f31f41eb The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <paul@darkrain42.org>
parents: 25667
diff changeset
102 ui_name = g_hash_table_lookup(ui_info, "name");
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
103 ui_version = g_hash_table_lookup(ui_info, "version");
25668
8c58f31f41eb The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <paul@darkrain42.org>
parents: 25667
diff changeset
104 }
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
105
25668
8c58f31f41eb The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <paul@darkrain42.org>
parents: 25667
diff changeset
106 if (ui_name)
8c58f31f41eb The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <paul@darkrain42.org>
parents: 25667
diff changeset
107 bosh_useragent = g_strdup_printf("%s%s%s (libpurple " VERSION ")",
8c58f31f41eb The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <paul@darkrain42.org>
parents: 25667
diff changeset
108 ui_name, ui_version ? " " : "",
8c58f31f41eb The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <paul@darkrain42.org>
parents: 25667
diff changeset
109 ui_version ? ui_version : "");
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
110 else
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
111 bosh_useragent = g_strdup("libpurple " VERSION);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
112 }
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
113
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
114 void jabber_bosh_uninit(void)
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
115 {
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
116 g_free(bosh_useragent);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
117 bosh_useragent = NULL;
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
118 }
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
119
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
120 static void
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
121 jabber_bosh_http_request_destroy(PurpleHTTPRequest *req)
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
122 {
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
123 g_free(req->data);
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
124 g_free(req);
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
125 }
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
126
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
127 static PurpleHTTPConnection*
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
128 jabber_bosh_http_connection_init(const char *host, int port)
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
129 {
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
130 PurpleHTTPConnection *conn = g_new0(PurpleHTTPConnection, 1);
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
131 conn->host = g_strdup(host);
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
132 conn->port = port;
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
133 conn->fd = -1;
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
134
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
135 return conn;
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
136 }
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
137
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
138 static void
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
139 jabber_bosh_http_connection_destroy(PurpleHTTPConnection *conn)
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
140 {
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
141 g_free(conn->host);
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
142
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
143 if (conn->buf)
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
144 g_string_free(conn->buf, TRUE);
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
145
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
146 if (conn->ie_handle)
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
147 purple_input_remove(conn->ie_handle);
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
148 if (conn->fd >= 0)
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
149 close(conn->fd);
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
150
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
151 g_free(conn);
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
152 }
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
153
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
154 PurpleBOSHConnection*
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
155 jabber_bosh_connection_init(JabberStream *js, const char *url)
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
156 {
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
157 PurpleBOSHConnection *conn;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
158 char *host, *path, *user, *passwd;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
159 int port;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
160
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
161 if (!purple_url_parse(url, &host, &port, &path, &user, &passwd)) {
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
162 purple_debug_info("jabber", "Unable to parse given URL.\n");
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
163 return NULL;
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
164 }
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
165
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
166 conn = g_new0(PurpleBOSHConnection, 1);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
167 conn->host = host;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
168 conn->port = port;
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
169 conn->path = g_strdup_printf("/%s", path);
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
170 g_free(path);
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
171 conn->pipelining = TRUE;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
172
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
173 if ((user && user[0] != '\0') || (passwd && passwd[0] != '\0')) {
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
174 purple_debug_info("jabber", "Ignoring unexpected username and password "
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
175 "in BOSH URL.\n");
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
176 }
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
177
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
178 g_free(user);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
179 g_free(passwd);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
180
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
181 conn->js = js;
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
182 /* FIXME: This doesn't seem very random */
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
183 conn->rid = rand() % 100000 + 1728679472;
25052
0a8484372312 * sending empty <body> requests if there are not othere requests to be answered to keep a CM -> client channel open
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25051
diff changeset
184 conn->ready = FALSE;
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
185 conn->conn_a = jabber_bosh_http_connection_init(conn->host, conn->port);
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
186 conn->conn_a->userdata = conn;
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
187
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
188 return conn;
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
189 }
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
190
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
191 void
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
192 jabber_bosh_connection_destroy(PurpleBOSHConnection *conn)
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
193 {
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
194 g_free(conn->host);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
195 g_free(conn->path);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
196
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
197 if (conn->conn_a)
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
198 jabber_bosh_http_connection_destroy(conn->conn_a);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
199 if (conn->conn_b)
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
200 jabber_bosh_http_connection_destroy(conn->conn_b);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
201
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
202 g_free(conn);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
203 }
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
204
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
205 void jabber_bosh_connection_close(PurpleBOSHConnection *conn)
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
206 {
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
207 xmlnode *packet = xmlnode_new("body");
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
208 /* XEP-0124: The rid must not exceed 16 characters */
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
209 char rid[17];
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
210 g_snprintf(rid, sizeof(rid), "%" G_GUINT64_FORMAT, ++conn->rid);
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
211 xmlnode_set_attrib(packet, "type", "terminate");
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
212 xmlnode_set_attrib(packet, "xmlns", "http://jabber.org/protocol/httpbind");
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
213 xmlnode_set_attrib(packet, "sid", conn->sid);
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
214 xmlnode_set_attrib(packet, "rid", rid);
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
215
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
216 jabber_bosh_connection_send_native(conn, packet);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
217 xmlnode_free(packet);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
218 }
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
219
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
220 static void jabber_bosh_connection_stream_restart(PurpleBOSHConnection *conn) {
25050
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
221 xmlnode *restart = xmlnode_new("body");
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
222 /* XEP-0124: The rid must not exceed 16 characters */
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
223 char rid[17];
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
224 g_snprintf(rid, sizeof(rid), "%" G_GUINT64_FORMAT, ++conn->rid);
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
225 xmlnode_set_attrib(restart, "rid", rid);
25050
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
226 xmlnode_set_attrib(restart, "sid", conn->sid);
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
227 xmlnode_set_attrib(restart, "to", conn->js->user->domain);
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
228 xmlnode_set_attrib(restart, "xml:lang", "en");
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
229 xmlnode_set_attrib(restart, "xmpp:restart", "true");
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
230 xmlnode_set_attrib(restart, "xmlns", "http://jabber.org/protocol/httpbind");
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
231 xmlnode_set_attrib(restart, "xmlns:xmpp", "urn:xmpp:xbosh");
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
232
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
233 jabber_bosh_connection_send_native(conn, restart);
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
234 xmlnode_free(restart);
25050
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
235 }
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
236
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
237 static gboolean jabber_bosh_connection_error_check(PurpleBOSHConnection *conn, xmlnode *node) {
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
238 const char *type;
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
239
25054
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
240 type = xmlnode_get_attrib(node, "type");
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
241
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
242 if (type != NULL && !strcmp(type, "terminate")) {
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
243 conn->ready = FALSE;
25055
480736bfcf45 * removing some comment with XML example
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25054
diff changeset
244 purple_connection_error_reason (conn->js->gc,
480736bfcf45 * removing some comment with XML example
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25054
diff changeset
245 PURPLE_CONNECTION_ERROR_OTHER_ERROR,
480736bfcf45 * removing some comment with XML example
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25054
diff changeset
246 _("The BOSH conncetion manager suggested to terminate your session."));
25054
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
247 return TRUE;
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
248 }
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
249 return FALSE;
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
250 }
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
251
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
252 static void jabber_bosh_connection_received(PurpleBOSHConnection *conn, xmlnode *node) {
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
253 xmlnode *child;
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
254 JabberStream *js = conn->js;
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
255
25666
7856dccb02fb BOSH: Another g_return_if_fail that is backward
Paul Aurich <paul@darkrain42.org>
parents: 25665
diff changeset
256 g_return_if_fail(node != NULL);
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
257 if (jabber_bosh_connection_error_check(conn, node))
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
258 return;
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
259
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
260 child = node->child;
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
261 while (child != NULL) {
25195
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
262 /* jabber_process_packet might free child */
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
263 xmlnode *next = child->next;
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
264 if (child->type == XMLNODE_TYPE_TAG) {
25195
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
265 if (!strcmp(child->name, "iq")) {
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
266 if (xmlnode_get_child(child, "session"))
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
267 conn->ready = TRUE;
25054
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
268 }
25195
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
269
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
270 jabber_process_packet(js, &child);
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
271 }
25195
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
272
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
273 child = next;
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
274 }
25050
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
275 }
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
276
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
277 static void auth_response_cb(PurpleBOSHConnection *conn, xmlnode *node) {
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
278 xmlnode *child;
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
279
25195
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
280 g_return_if_fail(node != NULL);
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
281 if (jabber_bosh_connection_error_check(conn, node))
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
282 return;
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
283
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
284 child = node->child;
25050
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
285 while(child != NULL && child->type != XMLNODE_TYPE_TAG) {
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
286 child = child->next;
25050
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
287 }
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
288
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
289 /* We're only expecting one XML node here, so only process the first one */
25050
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
290 if (child != NULL && child->type == XMLNODE_TYPE_TAG) {
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
291 JabberStream *js = conn->js;
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
292 if (!strcmp(child->name, "success")) {
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
293 jabber_bosh_connection_stream_restart(conn);
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
294 jabber_process_packet(js, &child);
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
295 conn->receive_cb = jabber_bosh_connection_received;
25050
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
296 } else {
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
297 js->state = JABBER_STREAM_AUTHENTICATING;
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
298 jabber_process_packet(js, &child);
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
299 }
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
300 } else {
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
301 purple_debug_warning("jabber", "Received unexepcted empty BOSH packet.\n");
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
302 }
25049
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
303 }
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
304
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
305 static void boot_response_cb(PurpleBOSHConnection *conn, xmlnode *node) {
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
306 const char *sid, *version;
25194
b78c8ab5de2b Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <paul@darkrain42.org>
parents: 25193
diff changeset
307 xmlnode *packet;
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
308
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
309 g_return_if_fail(node != NULL);
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
310 if (jabber_bosh_connection_error_check(conn, node))
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
311 return;
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
312
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
313 sid = xmlnode_get_attrib(node, "sid");
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
314 version = xmlnode_get_attrib(node, "ver");
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
315
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
316 if (sid) {
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
317 conn->sid = g_strdup(sid);
25049
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
318 } else {
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
319 purple_connection_error_reason(conn->js->gc,
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
320 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
321 _("No session ID given"));
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
322 return;
25049
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
323 }
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
324
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
325 if (version) {
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
326 const char *dot = strstr(version, ".");
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
327 int major = atoi(version);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
328 int minor = atoi(dot + 1);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
329
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
330 purple_debug_info("jabber", "BOSH connection manager version %s\n", version);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
331
25194
b78c8ab5de2b Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <paul@darkrain42.org>
parents: 25193
diff changeset
332 if (major != 1 || minor < 6) {
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
333 purple_connection_error_reason(conn->js->gc,
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
334 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
335 _("Unsupported version of BOSH protocol"));
25194
b78c8ab5de2b Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <paul@darkrain42.org>
parents: 25193
diff changeset
336 return;
25049
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
337 }
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
338 } else {
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
339 purple_debug_info("jabber", "Missing version in BOSH initiation\n");
25049
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
340 }
25194
b78c8ab5de2b Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <paul@darkrain42.org>
parents: 25193
diff changeset
341
b78c8ab5de2b Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <paul@darkrain42.org>
parents: 25193
diff changeset
342 /* FIXME: Depending on receiving features might break with some hosts */
b78c8ab5de2b Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <paul@darkrain42.org>
parents: 25193
diff changeset
343 packet = xmlnode_get_child(node, "features");
b78c8ab5de2b Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <paul@darkrain42.org>
parents: 25193
diff changeset
344 conn->js->use_bosh = TRUE;
b78c8ab5de2b Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <paul@darkrain42.org>
parents: 25193
diff changeset
345 conn->receive_cb = auth_response_cb;
b78c8ab5de2b Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <paul@darkrain42.org>
parents: 25193
diff changeset
346 jabber_stream_features_parse(conn->js, packet);
25047
f747c682a0d9 * calling PurpleBOSHConnection's receive_cb
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25046
diff changeset
347 }
f747c682a0d9 * calling PurpleBOSHConnection's receive_cb
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25046
diff changeset
348
25043
15d9825a5621 * adding receive callback; preparing receiving and boot code
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25042
diff changeset
349 static void jabber_bosh_connection_boot(PurpleBOSHConnection *conn) {
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
350 xmlnode *init = xmlnode_new("body");
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
351 /* XEP-0124: The rid must not exceed 16 characters */
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
352 char rid[17];
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
353 g_snprintf(rid, sizeof(rid), "%" G_GUINT64_FORMAT, ++conn->rid);
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
354 xmlnode_set_attrib(init, "content", "text/xml; charset=utf-8");
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
355 xmlnode_set_attrib(init, "secure", "true");
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
356 /*
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
357 xmlnode_set_attrib(init, "route", tmp = g_strdup_printf("xmpp:%s:5222", conn->js->user->domain));
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
358 g_free(tmp);
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
359 */
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
360 xmlnode_set_attrib(init, "to", conn->js->user->domain);
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
361 xmlnode_set_attrib(init, "xml:lang", "en");
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
362 xmlnode_set_attrib(init, "xmpp:version", "1.0");
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
363 xmlnode_set_attrib(init, "ver", "1.6");
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
364 xmlnode_set_attrib(init, "xmlns:xmpp", "urn:xmpp:xbosh");
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
365 xmlnode_set_attrib(init, "rid", rid);
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
366 xmlnode_set_attrib(init, "wait", "60"); /* this should be adjusted automatically according to real time network behavior */
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
367 xmlnode_set_attrib(init, "xmlns", "http://jabber.org/protocol/httpbind");
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
368 xmlnode_set_attrib(init, "hold", "1");
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
369
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
370 conn->receive_cb = boot_response_cb;
25049
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
371 jabber_bosh_connection_send_native(conn, init);
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
372 xmlnode_free(init);
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
373 }
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
374
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
375 static void
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
376 http_received_cb(const char *data, int len, void *userdata)
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
377 {
25047
f747c682a0d9 * calling PurpleBOSHConnection's receive_cb
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25046
diff changeset
378 PurpleBOSHConnection *conn = userdata;
f747c682a0d9 * calling PurpleBOSHConnection's receive_cb
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25046
diff changeset
379 if (conn->receive_cb) {
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
380 xmlnode *node = xmlnode_from_str(data, len);
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
381 if (node) {
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
382 char *txt = xmlnode_to_formatted_str(node, NULL);
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
383 printf("\nhttp_received_cb\n%s\n", txt);
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
384 g_free(txt);
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
385 conn->receive_cb(conn, node);
25056
94ccccab4e98 * free xmlnodes after bosh receive callback is called
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25055
diff changeset
386 xmlnode_free(node);
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
387 } else {
25667
bf7338765863 BOSH: Fix an off-by-one g_memdup that was missing the null terminator.
Paul Aurich <paul@darkrain42.org>
parents: 25666
diff changeset
388 purple_debug_warning("jabber", "BOSH: Received invalid XML\n");
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
389 }
25667
bf7338765863 BOSH: Fix an off-by-one g_memdup that was missing the null terminator.
Paul Aurich <paul@darkrain42.org>
parents: 25666
diff changeset
390 } else {
bf7338765863 BOSH: Fix an off-by-one g_memdup that was missing the null terminator.
Paul Aurich <paul@darkrain42.org>
parents: 25666
diff changeset
391 g_return_if_reached();
bf7338765863 BOSH: Fix an off-by-one g_memdup that was missing the null terminator.
Paul Aurich <paul@darkrain42.org>
parents: 25666
diff changeset
392 }
25043
15d9825a5621 * adding receive callback; preparing receiving and boot code
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25042
diff changeset
393 }
15d9825a5621 * adding receive callback; preparing receiving and boot code
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25042
diff changeset
394
15d9825a5621 * adding receive callback; preparing receiving and boot code
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25042
diff changeset
395 void jabber_bosh_connection_send(PurpleBOSHConnection *conn, xmlnode *node) {
25049
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
396 xmlnode *packet = xmlnode_new("body");
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
397 /* XEP-0124: The rid must not exceed 16 characters */
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
398 char rid[17];
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
399 g_snprintf(rid, sizeof(rid), "%" G_GUINT64_FORMAT, ++conn->rid);
25049
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
400 xmlnode_set_attrib(packet, "xmlns", "http://jabber.org/protocol/httpbind");
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
401 xmlnode_set_attrib(packet, "sid", conn->sid);
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
402 xmlnode_set_attrib(packet, "rid", rid);
25049
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
403
25054
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
404 if (node) {
25195
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
405 xmlnode *copy = xmlnode_copy(node);
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
406 xmlnode_insert_child(packet, copy);
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
407 if (conn->ready == TRUE)
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
408 xmlnode_set_attrib(copy, "xmlns", "jabber:client");
25054
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
409 }
25049
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
410 jabber_bosh_connection_send_native(conn, packet);
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
411 xmlnode_free(packet);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
412 }
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
413
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
414 void jabber_bosh_connection_send_raw(PurpleBOSHConnection *conn,
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
415 const char *data, int len)
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
416 {
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
417 xmlnode *node = xmlnode_from_str(data, len);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
418 if (node) {
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
419 jabber_bosh_connection_send(conn, node);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
420 xmlnode_free(node);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
421 } else {
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
422 /*
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
423 * This best emulates what a normal XMPP server would do
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
424 * if you send bad XML.
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
425 */
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
426 purple_connection_error_reason(conn->js->gc,
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
427 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
428 _("Cannot send malformed XML"));
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
429 }
25049
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
430 }
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
431
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
432 static void jabber_bosh_connection_send_native(PurpleBOSHConnection *conn, xmlnode *node) {
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
433 PurpleHTTPRequest *request;
25049
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
434
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
435 request = g_new0(PurpleHTTPRequest, 1);
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
436 request->path = conn->path;
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
437 request->userdata = conn;
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
438
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
439 request->data = xmlnode_to_str(node, &(request->data_len));
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
440
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
441 jabber_bosh_http_connection_send_request(conn->conn_a, request);
25043
15d9825a5621 * adding receive callback; preparing receiving and boot code
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25042
diff changeset
442 }
15d9825a5621 * adding receive callback; preparing receiving and boot code
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25042
diff changeset
443
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
444 static void jabber_bosh_connection_connected(PurpleHTTPConnection *conn) {
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
445 PurpleBOSHConnection *bosh_conn = conn->userdata;
25052
0a8484372312 * sending empty <body> requests if there are not othere requests to be answered to keep a CM -> client channel open
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25051
diff changeset
446 if (bosh_conn->ready == TRUE && bosh_conn->connect_cb) {
0a8484372312 * sending empty <body> requests if there are not othere requests to be answered to keep a CM -> client channel open
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25051
diff changeset
447 purple_debug_info("jabber", "BOSH session already exists. Trying to reuse it.\n");
0a8484372312 * sending empty <body> requests if there are not othere requests to be answered to keep a CM -> client channel open
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25051
diff changeset
448 bosh_conn->receive_cb = jabber_bosh_connection_received;
0a8484372312 * sending empty <body> requests if there are not othere requests to be answered to keep a CM -> client channel open
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25051
diff changeset
449 bosh_conn->connect_cb(bosh_conn);
0a8484372312 * sending empty <body> requests if there are not othere requests to be answered to keep a CM -> client channel open
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25051
diff changeset
450 } else jabber_bosh_connection_boot(bosh_conn);
0a8484372312 * sending empty <body> requests if there are not othere requests to be answered to keep a CM -> client channel open
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25051
diff changeset
451 }
0a8484372312 * sending empty <body> requests if there are not othere requests to be answered to keep a CM -> client channel open
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25051
diff changeset
452
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
453 void jabber_bosh_connection_refresh(PurpleBOSHConnection *conn)
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
454 {
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
455 jabber_bosh_connection_send(conn, NULL);
25052
0a8484372312 * sending empty <body> requests if there are not othere requests to be answered to keep a CM -> client channel open
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25051
diff changeset
456 }
0a8484372312 * sending empty <body> requests if there are not othere requests to be answered to keep a CM -> client channel open
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25051
diff changeset
457
0a8484372312 * sending empty <body> requests if there are not othere requests to be answered to keep a CM -> client channel open
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25051
diff changeset
458 static void jabber_bosh_http_connection_disconnected(PurpleHTTPConnection *conn) {
0a8484372312 * sending empty <body> requests if there are not othere requests to be answered to keep a CM -> client channel open
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25051
diff changeset
459 PurpleBOSHConnection *bosh_conn = conn->userdata;
0a8484372312 * sending empty <body> requests if there are not othere requests to be answered to keep a CM -> client channel open
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25051
diff changeset
460 bosh_conn->conn_a->connect_cb = jabber_bosh_connection_connected;
0a8484372312 * sending empty <body> requests if there are not othere requests to be answered to keep a CM -> client channel open
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25051
diff changeset
461 jabber_bosh_http_connection_connect(bosh_conn->conn_a);
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
462 }
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
463
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
464 void jabber_bosh_connection_connect(PurpleBOSHConnection *conn) {
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
465 conn->conn_a->connect_cb = jabber_bosh_connection_connected;
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
466 jabber_bosh_http_connection_connect(conn->conn_a);
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
467 }
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
468
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
469 static void
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
470 jabber_bosh_http_connection_process(PurpleHTTPConnection *conn)
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
471 {
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
472 PurpleBOSHConnection *bosh_conn = conn->userdata;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
473 const char *cursor;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
474
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
475 cursor = conn->buf->str + conn->handled_len;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
476
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
477 if (!conn->headers_done) {
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
478 const char *content_length = purple_strcasestr(cursor, "\r\nContent-Length");
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
479 const char *end_of_headers = purple_strcasestr(cursor, "\r\n\r\n");
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
480
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
481 /* Make sure Content-Length is in headers, not body */
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
482 if (content_length && content_length < end_of_headers) {
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
483 char *sep = strstr(content_length, ": ");
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
484 int len = atoi(sep + 2);
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
485 if (len == 0)
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
486 purple_debug_warning("jabber", "Found mangled Content-Length header.\n");
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
487
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
488 conn->body_len = len;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
489 }
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
490
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
491 if (end_of_headers) {
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
492 conn->headers_done = TRUE;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
493 conn->handled_len = end_of_headers - conn->buf->str + 4;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
494 cursor = end_of_headers + 4;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
495 } else {
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
496 conn->handled_len = conn->buf->len;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
497 return;
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
498 }
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
499 }
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
500
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
501 /* Have we handled everything in the buffer? */
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
502 if (conn->handled_len >= conn->buf->len)
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
503 return;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
504
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
505 /* Have we read all that the Content-Length promised us? */
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
506 if (conn->buf->len - conn->handled_len < conn->body_len)
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
507 return;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
508
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
509 --conn->requests;
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
510
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
511 #warning For a pure HTTP 1.1 stack, this would need to be handled elsewhere.
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
512 if (bosh_conn->ready && conn->requests == 0) {
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
513 jabber_bosh_connection_send(bosh_conn, NULL);
25667
bf7338765863 BOSH: Fix an off-by-one g_memdup that was missing the null terminator.
Paul Aurich <paul@darkrain42.org>
parents: 25666
diff changeset
514 purple_debug_misc("jabber", "BOSH: Sending an empty request\n");
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
515 }
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
516
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
517 http_received_cb(conn->buf->str + conn->handled_len, conn->body_len,
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
518 conn->userdata);
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
519
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
520 g_string_free(conn->buf, TRUE);
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
521 conn->buf = NULL;
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
522 conn->headers_done = FALSE;
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
523 conn->handled_len = conn->body_len = 0;
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
524 }
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
525
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
526 static void
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
527 jabber_bosh_http_connection_read(gpointer data, gint fd,
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
528 PurpleInputCondition condition)
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
529 {
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
530 PurpleHTTPConnection *conn = data;
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
531 char buffer[1025];
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
532 int perrno;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
533 int cnt, count = 0;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
534
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
535 purple_debug_info("jabber", "jabber_bosh_http_connection_read\n");
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
536
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
537 if (conn->buf == NULL)
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
538 conn->buf = g_string_new("");
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
539
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
540 while ((cnt = read(fd, buffer, sizeof(buffer))) > 0) {
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
541 purple_debug_info("jabber", "bosh read %d bytes\n", cnt);
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
542 count += cnt;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
543 g_string_append_len(conn->buf, buffer, cnt);
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
544 }
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
545
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
546 perrno = errno;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
547 if (cnt == 0 && count) {
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
548 /* TODO: process should know this response ended with a closed socket
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
549 * and throw an error if it's not a complete response. */
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
550 jabber_bosh_http_connection_process(conn);
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
551 }
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
552
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
553 if (cnt == 0 || (cnt < 0 && perrno != EAGAIN)) {
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
554 if (cnt < 0)
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
555 purple_debug_info("jabber", "bosh read: %d\n", cnt);
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
556 else
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
557 purple_debug_info("jabber", "bosh socket closed\n");
25046
e28f1711f402 * parsing HTTP response and emitting HTTP request callback
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25045
diff changeset
558
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
559 purple_input_remove(conn->ie_handle);
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
560 conn->ie_handle = 0;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
561
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
562 if (conn->disconnect_cb)
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
563 conn->disconnect_cb(conn);
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
564
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
565 return;
25045
24b97b8359ff * preparing handling of multiple requests for pipelining support
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25044
diff changeset
566 }
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
567
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
568 jabber_bosh_http_connection_process(conn);
25043
15d9825a5621 * adding receive callback; preparing receiving and boot code
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25042
diff changeset
569 }
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
570
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
571 static void jabber_bosh_http_connection_callback(gpointer data, gint source, const gchar *error)
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
572 {
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
573 PurpleHTTPConnection *conn = data;
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
574 PurpleBOSHConnection *bosh_conn = conn->userdata;
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
575 PurpleConnection *gc = bosh_conn->js->gc;
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
576
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
577 if (source < 0) {
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
578 gchar *tmp;
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
579 tmp = g_strdup_printf(_("Could not establish a connection with the server:\n%s"),
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
580 error);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
581 purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
582 g_free(tmp);
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
583 return;
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
584 }
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
585
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
586 conn->fd = source;
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
587
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
588 if (conn->connect_cb)
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
589 conn->connect_cb(conn);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
590
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
591 conn->ie_handle = purple_input_add(conn->fd, PURPLE_INPUT_READ,
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
592 jabber_bosh_http_connection_read, conn);
25040
b238da95f39a * some refactoring
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25038
diff changeset
593 }
b238da95f39a * some refactoring
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25038
diff changeset
594
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
595 static void jabber_bosh_http_connection_connect(PurpleHTTPConnection *conn)
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
596 {
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
597 PurpleBOSHConnection *bosh_conn = conn->userdata;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
598 PurpleConnection *gc = bosh_conn->js->gc;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
599 PurpleAccount *account = purple_connection_get_account(gc);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
600
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
601 if ((purple_proxy_connect(conn, account, conn->host, conn->port, jabber_bosh_http_connection_callback, conn)) == NULL) {
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
602 purple_connection_error_reason(gc,
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
603 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
604 _("Unable to create socket"));
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
605 }
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
606 }
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
607
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
608 static void
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
609 jabber_bosh_http_connection_send_request(PurpleHTTPConnection *conn,
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
610 PurpleHTTPRequest *req)
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
611 {
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
612 PurpleBOSHConnection *bosh_conn = conn->userdata;
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
613 GString *packet = g_string_new("");
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
614 int ret;
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
615
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
616 /* TODO: Should we lie about this HTTP/1.1 support? */
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
617 g_string_append_printf(packet, "POST %s HTTP/1.1\r\n"
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
618 "Host: %s\r\n"
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
619 "User-Agent: %s\r\n"
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
620 "Content-Encoding: text/xml; charset=utf-8\r\n"
25664
26259ee81c5b BOSH: Fix the HTTP Post to include the actual payload.
Paul Aurich <paul@darkrain42.org>
parents: 25195
diff changeset
621 "Content-Length: %d\r\n\r\n",
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
622 req->path, conn->host, bosh_useragent, req->data_len);
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
623
25664
26259ee81c5b BOSH: Fix the HTTP Post to include the actual payload.
Paul Aurich <paul@darkrain42.org>
parents: 25195
diff changeset
624 packet = g_string_append(packet, req->data);
26259ee81c5b BOSH: Fix the HTTP Post to include the actual payload.
Paul Aurich <paul@darkrain42.org>
parents: 25195
diff changeset
625
25667
bf7338765863 BOSH: Fix an off-by-one g_memdup that was missing the null terminator.
Paul Aurich <paul@darkrain42.org>
parents: 25666
diff changeset
626 purple_debug_misc("jabber", "BOSH out: %s\n", packet->str);
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
627 /* TODO: Better error handling, circbuffer or possible integration with
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
628 * low-level code in jabber.c */
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
629 ret = write(conn->fd, packet->str, packet->len);
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
630
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
631 ++conn->requests;
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
632 g_string_free(packet, TRUE);
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
633 jabber_bosh_http_request_destroy(req);
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
634
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
635 if (ret < 0 && errno == EAGAIN)
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
636 purple_debug_warning("jabber", "BOSH write would have blocked\n");
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
637
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
638 if (ret <= 0) {
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
639 purple_connection_error_reason(bosh_conn->js->gc,
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
640 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
641 _("Write error"));
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
642 return;
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
643 }
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
644 }
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
645