libpurple/protocols/jabber/bosh.c

Mon, 10 Jan 2011 01:28:31 +0000

author
Paul Aurich <darkrain42@pidgin.im>
date
Mon, 10 Jan 2011 01:28:31 +0000
changeset 31347
ae5f84d20061
parent 30626
bec413ce77c7
child 31348
7ee26fce6440
permissions
-rw-r--r--

jabber: Improved BOSH logging some. Refs #13008

23607
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
1 /*
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
2 * purple - Jabber Protocol Plugin
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
3 *
28322
ac8fec1d2234 Remove specific copyright lines from the XMPP prpl.
Paul Aurich <darkrain42@pidgin.im>
parents: 28079
diff changeset
4 * Purple is the legal property of its developers, whose names are too numerous
ac8fec1d2234 Remove specific copyright lines from the XMPP prpl.
Paul Aurich <darkrain42@pidgin.im>
parents: 28079
diff changeset
5 * to list here. Please refer to the COPYRIGHT file distributed with this
ac8fec1d2234 Remove specific copyright lines from the XMPP prpl.
Paul Aurich <darkrain42@pidgin.im>
parents: 28079
diff changeset
6 * source distribution.
23607
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
7 *
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
11 * (at your option) any later version.
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
12 *
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
16 * GNU General Public License for more details.
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
17 *
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
21 *
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
22 */
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
23 #include "internal.h"
26084
5e8895515af0 Use a PurpleCircBuffer for the queued stanzas
Paul Aurich <darkrain42@pidgin.im>
parents: 26083
diff changeset
24 #include "circbuffer.h"
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
25 #include "core.h"
23607
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
26 #include "cipher.h"
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
27 #include "debug.h"
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
28 #include "prpl.h"
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
29 #include "util.h"
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
30 #include "xmlnode.h"
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
31
24872
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
32 #include "bosh.h"
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
33
28079
69fc36a9cbe3 jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <darkrain42@pidgin.im>
parents: 28072
diff changeset
34 /* The number of HTTP connections to use. This MUST be at least 2. */
69fc36a9cbe3 jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <darkrain42@pidgin.im>
parents: 28072
diff changeset
35 #define NUM_HTTP_CONNECTIONS 2
69fc36a9cbe3 jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <darkrain42@pidgin.im>
parents: 28072
diff changeset
36 /* How many failed connection attempts before it becomes a fatal error */
26534
20a970cad8e2 Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <darkrain42@pidgin.im>
parents: 26533
diff changeset
37 #define MAX_FAILED_CONNECTIONS 3
28079
69fc36a9cbe3 jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <darkrain42@pidgin.im>
parents: 28072
diff changeset
38 /* How long in seconds to queue up outgoing messages */
28072
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
39 #define BUFFER_SEND_IN_SECS 1
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
40
24872
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
41 typedef struct _PurpleHTTPConnection PurpleHTTPConnection;
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
42
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
43 typedef void (*PurpleBOSHConnectionConnectFunction)(PurpleBOSHConnection *conn);
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
44 typedef void (*PurpleBOSHConnectionReceiveFunction)(PurpleBOSHConnection *conn, xmlnode *node);
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
45
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
46 static char *bosh_useragent = NULL;
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
47
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
48 typedef enum {
28072
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
49 PACKET_NORMAL,
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
50 PACKET_TERMINATE,
28072
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
51 PACKET_FLUSH,
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
52 } PurpleBOSHPacketType;
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
53
24872
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
54 struct _PurpleBOSHConnection {
26083
e716012de66e Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <darkrain42@pidgin.im>
parents: 26082
diff changeset
55 JabberStream *js;
28079
69fc36a9cbe3 jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <darkrain42@pidgin.im>
parents: 28072
diff changeset
56 PurpleHTTPConnection *connections[NUM_HTTP_CONNECTIONS];
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
57
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
58 PurpleCircBuffer *pending;
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
59 PurpleBOSHConnectionConnectFunction connect_cb;
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
60 PurpleBOSHConnectionReceiveFunction receive_cb;
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
61
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
62 /* Must be big enough to hold 2^53 - 1 */
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
63 char *sid;
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
64 guint64 rid;
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
65
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
66 /* decoded URL */
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
67 char *host;
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
68 char *path;
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
69 guint16 port;
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
70
26083
e716012de66e Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <darkrain42@pidgin.im>
parents: 26082
diff changeset
71 gboolean pipelining;
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
72 gboolean ssl;
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
73
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
74 enum {
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
75 BOSH_CONN_OFFLINE,
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
76 BOSH_CONN_BOOTING,
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
77 BOSH_CONN_ONLINE
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
78 } state;
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
79 guint8 failed_connections;
26083
e716012de66e Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <darkrain42@pidgin.im>
parents: 26082
diff changeset
80
e716012de66e Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <darkrain42@pidgin.im>
parents: 26082
diff changeset
81 int wait;
e716012de66e Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <darkrain42@pidgin.im>
parents: 26082
diff changeset
82
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
83 int max_requests;
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
84 int requests;
24875
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
85
28072
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
86 guint send_timer;
24872
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
87 };
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
88
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
89 struct _PurpleHTTPConnection {
26083
e716012de66e Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <darkrain42@pidgin.im>
parents: 26082
diff changeset
90 PurpleBOSHConnection *bosh;
26085
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
91 PurpleSslConnection *psc;
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
92
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
93 PurpleCircBuffer *write_buf;
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
94 GString *read_buf;
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
95
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
96 gsize handled_len;
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
97 gsize body_len;
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
98
26083
e716012de66e Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <darkrain42@pidgin.im>
parents: 26082
diff changeset
99 int fd;
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
100 guint readh;
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
101 guint writeh;
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
102
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
103 enum {
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
104 HTTP_CONN_OFFLINE,
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
105 HTTP_CONN_CONNECTING,
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
106 HTTP_CONN_CONNECTED
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
107 } state;
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
108 int requests; /* number of outstanding HTTP requests */
25488
acdb4dbab299 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <darkrain42@pidgin.im>
parents: 25487
diff changeset
109
26083
e716012de66e Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <darkrain42@pidgin.im>
parents: 26082
diff changeset
110 gboolean headers_done;
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
111
24872
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
112 };
23607
bc82598d3798 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
113
26078
3526ac955ce3 Rename a few functions and drop some data members.
Paul Aurich <darkrain42@pidgin.im>
parents: 26076
diff changeset
114 static void http_connection_connect(PurpleHTTPConnection *conn);
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
115 static void http_connection_send_request(PurpleHTTPConnection *conn,
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
116 const GString *req);
28072
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
117 static gboolean send_timer_cb(gpointer data);
24872
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
118
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
119 void jabber_bosh_init(void)
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
120 {
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
121 GHashTable *ui_info = purple_core_get_ui_info();
25487
00e94f044205 The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <darkrain42@pidgin.im>
parents: 25486
diff changeset
122 const char *ui_name = NULL;
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
123 const char *ui_version = NULL;
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
124
25487
00e94f044205 The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <darkrain42@pidgin.im>
parents: 25486
diff changeset
125 if (ui_info) {
00e94f044205 The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <darkrain42@pidgin.im>
parents: 25486
diff changeset
126 ui_name = g_hash_table_lookup(ui_info, "name");
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
127 ui_version = g_hash_table_lookup(ui_info, "version");
25487
00e94f044205 The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <darkrain42@pidgin.im>
parents: 25486
diff changeset
128 }
24872
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
129
25487
00e94f044205 The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <darkrain42@pidgin.im>
parents: 25486
diff changeset
130 if (ui_name)
00e94f044205 The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <darkrain42@pidgin.im>
parents: 25486
diff changeset
131 bosh_useragent = g_strdup_printf("%s%s%s (libpurple " VERSION ")",
00e94f044205 The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <darkrain42@pidgin.im>
parents: 25486
diff changeset
132 ui_name, ui_version ? " " : "",
00e94f044205 The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <darkrain42@pidgin.im>
parents: 25486
diff changeset
133 ui_version ? ui_version : "");
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
134 else
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
135 bosh_useragent = g_strdup("libpurple " VERSION);
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
136 }
24872
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
137
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
138 void jabber_bosh_uninit(void)
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
139 {
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
140 g_free(bosh_useragent);
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
141 bosh_useragent = NULL;
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
142 }
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
143
24874
33902e1daba1 Reorder some functions to eliminate prototypes and
Paul Aurich <darkrain42@pidgin.im>
parents: 24873
diff changeset
144 static PurpleHTTPConnection*
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
145 jabber_bosh_http_connection_init(PurpleBOSHConnection *bosh)
24874
33902e1daba1 Reorder some functions to eliminate prototypes and
Paul Aurich <darkrain42@pidgin.im>
parents: 24873
diff changeset
146 {
33902e1daba1 Reorder some functions to eliminate prototypes and
Paul Aurich <darkrain42@pidgin.im>
parents: 24873
diff changeset
147 PurpleHTTPConnection *conn = g_new0(PurpleHTTPConnection, 1);
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
148 conn->bosh = bosh;
24874
33902e1daba1 Reorder some functions to eliminate prototypes and
Paul Aurich <darkrain42@pidgin.im>
parents: 24873
diff changeset
149 conn->fd = -1;
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
150 conn->state = HTTP_CONN_OFFLINE;
24874
33902e1daba1 Reorder some functions to eliminate prototypes and
Paul Aurich <darkrain42@pidgin.im>
parents: 24873
diff changeset
151
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
152 conn->write_buf = purple_circ_buffer_new(0 /* default grow size */);
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
153
24874
33902e1daba1 Reorder some functions to eliminate prototypes and
Paul Aurich <darkrain42@pidgin.im>
parents: 24873
diff changeset
154 return conn;
33902e1daba1 Reorder some functions to eliminate prototypes and
Paul Aurich <darkrain42@pidgin.im>
parents: 24873
diff changeset
155 }
33902e1daba1 Reorder some functions to eliminate prototypes and
Paul Aurich <darkrain42@pidgin.im>
parents: 24873
diff changeset
156
33902e1daba1 Reorder some functions to eliminate prototypes and
Paul Aurich <darkrain42@pidgin.im>
parents: 24873
diff changeset
157 static void
33902e1daba1 Reorder some functions to eliminate prototypes and
Paul Aurich <darkrain42@pidgin.im>
parents: 24873
diff changeset
158 jabber_bosh_http_connection_destroy(PurpleHTTPConnection *conn)
33902e1daba1 Reorder some functions to eliminate prototypes and
Paul Aurich <darkrain42@pidgin.im>
parents: 24873
diff changeset
159 {
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
160 if (conn->read_buf)
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
161 g_string_free(conn->read_buf, TRUE);
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
162
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
163 if (conn->write_buf)
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
164 purple_circ_buffer_destroy(conn->write_buf);
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
165 if (conn->readh)
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
166 purple_input_remove(conn->readh);
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
167 if (conn->writeh)
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
168 purple_input_remove(conn->writeh);
26085
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
169 if (conn->psc)
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
170 purple_ssl_close(conn->psc);
25488
acdb4dbab299 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <darkrain42@pidgin.im>
parents: 25487
diff changeset
171 if (conn->fd >= 0)
24874
33902e1daba1 Reorder some functions to eliminate prototypes and
Paul Aurich <darkrain42@pidgin.im>
parents: 24873
diff changeset
172 close(conn->fd);
33902e1daba1 Reorder some functions to eliminate prototypes and
Paul Aurich <darkrain42@pidgin.im>
parents: 24873
diff changeset
173
26079
4d75323e1e6b Close a small race with disconnecting while establishing a connection and
Paul Aurich <darkrain42@pidgin.im>
parents: 26078
diff changeset
174 purple_proxy_connect_cancel_with_handle(conn);
4d75323e1e6b Close a small race with disconnecting while establishing a connection and
Paul Aurich <darkrain42@pidgin.im>
parents: 26078
diff changeset
175
24874
33902e1daba1 Reorder some functions to eliminate prototypes and
Paul Aurich <darkrain42@pidgin.im>
parents: 24873
diff changeset
176 g_free(conn);
33902e1daba1 Reorder some functions to eliminate prototypes and
Paul Aurich <darkrain42@pidgin.im>
parents: 24873
diff changeset
177 }
33902e1daba1 Reorder some functions to eliminate prototypes and
Paul Aurich <darkrain42@pidgin.im>
parents: 24873
diff changeset
178
33902e1daba1 Reorder some functions to eliminate prototypes and
Paul Aurich <darkrain42@pidgin.im>
parents: 24873
diff changeset
179 PurpleBOSHConnection*
33902e1daba1 Reorder some functions to eliminate prototypes and
Paul Aurich <darkrain42@pidgin.im>
parents: 24873
diff changeset
180 jabber_bosh_connection_init(JabberStream *js, const char *url)
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
181 {
24872
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
182 PurpleBOSHConnection *conn;
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
183 char *host, *path, *user, *passwd;
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
184 int port;
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
185
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
186 if (!purple_url_parse(url, &host, &port, &path, &user, &passwd)) {
23611
d811757e19b5 * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23609
diff changeset
187 purple_debug_info("jabber", "Unable to parse given URL.\n");
24872
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
188 return NULL;
23611
d811757e19b5 * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23609
diff changeset
189 }
24872
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
190
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
191 conn = g_new0(PurpleBOSHConnection, 1);
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
192 conn->host = host;
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
193 conn->port = port;
24883
c283f8737645 Jabber BOSH: Store less for each Request/Response
Paul Aurich <darkrain42@pidgin.im>
parents: 24875
diff changeset
194 conn->path = g_strdup_printf("/%s", path);
c283f8737645 Jabber BOSH: Store less for each Request/Response
Paul Aurich <darkrain42@pidgin.im>
parents: 24875
diff changeset
195 g_free(path);
24872
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
196 conn->pipelining = TRUE;
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
197
30506
109364037830 jabber: Set js->serverFQDN when connecting via BOSH. Fixes #12289
Paul Aurich <darkrain42@pidgin.im>
parents: 30056
diff changeset
198 if (purple_ip_address_is_valid(host))
109364037830 jabber: Set js->serverFQDN when connecting via BOSH. Fixes #12289
Paul Aurich <darkrain42@pidgin.im>
parents: 30056
diff changeset
199 js->serverFQDN = g_strdup(js->user->domain);
109364037830 jabber: Set js->serverFQDN when connecting via BOSH. Fixes #12289
Paul Aurich <darkrain42@pidgin.im>
parents: 30056
diff changeset
200 else
109364037830 jabber: Set js->serverFQDN when connecting via BOSH. Fixes #12289
Paul Aurich <darkrain42@pidgin.im>
parents: 30056
diff changeset
201 js->serverFQDN = g_strdup(host);
109364037830 jabber: Set js->serverFQDN when connecting via BOSH. Fixes #12289
Paul Aurich <darkrain42@pidgin.im>
parents: 30056
diff changeset
202
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
203 if ((user && user[0] != '\0') || (passwd && passwd[0] != '\0')) {
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
204 purple_debug_info("jabber", "Ignoring unexpected username and password "
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
205 "in BOSH URL.\n");
23611
d811757e19b5 * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23609
diff changeset
206 }
24872
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
207
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
208 g_free(user);
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
209 g_free(passwd);
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
210
23613
1da7c5cbcc54 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23612
diff changeset
211 conn->js = js;
26672
d424e92111b5 A better random number for the rid in the range [0, 2**52).
Paul Aurich <darkrain42@pidgin.im>
parents: 26664
diff changeset
212
d424e92111b5 A better random number for the rid in the range [0, 2**52).
Paul Aurich <darkrain42@pidgin.im>
parents: 26664
diff changeset
213 /*
d424e92111b5 A better random number for the rid in the range [0, 2**52).
Paul Aurich <darkrain42@pidgin.im>
parents: 26664
diff changeset
214 * Random 64-bit integer masked off by 2^52 - 1.
d424e92111b5 A better random number for the rid in the range [0, 2**52).
Paul Aurich <darkrain42@pidgin.im>
parents: 26664
diff changeset
215 *
d424e92111b5 A better random number for the rid in the range [0, 2**52).
Paul Aurich <darkrain42@pidgin.im>
parents: 26664
diff changeset
216 * This should produce a random integer in the range [0, 2^52). It's
d424e92111b5 A better random number for the rid in the range [0, 2**52).
Paul Aurich <darkrain42@pidgin.im>
parents: 26664
diff changeset
217 * unlikely we'll send enough packets in one session to overflow the rid.
d424e92111b5 A better random number for the rid in the range [0, 2**52).
Paul Aurich <darkrain42@pidgin.im>
parents: 26664
diff changeset
218 */
d424e92111b5 A better random number for the rid in the range [0, 2**52).
Paul Aurich <darkrain42@pidgin.im>
parents: 26664
diff changeset
219 conn->rid = ((guint64)g_random_int() << 32) | g_random_int();
26967
b52a6393cc13 Windows compilation complains (probably because it's 32-bit)
Paul Aurich <darkrain42@pidgin.im>
parents: 26673
diff changeset
220 conn->rid &= 0xFFFFFFFFFFFFFLL;
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
221
26084
5e8895515af0 Use a PurpleCircBuffer for the queued stanzas
Paul Aurich <darkrain42@pidgin.im>
parents: 26083
diff changeset
222 conn->pending = purple_circ_buffer_new(0 /* default grow size */);
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
223
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
224 conn->state = BOSH_CONN_OFFLINE;
26085
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
225 if (purple_strcasestr(url, "https://") != NULL)
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
226 conn->ssl = TRUE;
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
227 else
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
228 conn->ssl = FALSE;
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
229
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
230 conn->connections[0] = jabber_bosh_http_connection_init(conn);
24872
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
231
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
232 return conn;
23611
d811757e19b5 * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23609
diff changeset
233 }
d811757e19b5 * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23609
diff changeset
234
24874
33902e1daba1 Reorder some functions to eliminate prototypes and
Paul Aurich <darkrain42@pidgin.im>
parents: 24873
diff changeset
235 void
33902e1daba1 Reorder some functions to eliminate prototypes and
Paul Aurich <darkrain42@pidgin.im>
parents: 24873
diff changeset
236 jabber_bosh_connection_destroy(PurpleBOSHConnection *conn)
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
237 {
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
238 int i;
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
239
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
240 g_free(conn->host);
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
241 g_free(conn->path);
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
242
28072
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
243 if (conn->send_timer)
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
244 purple_timeout_remove(conn->send_timer);
26082
7e3952f2713d Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <darkrain42@pidgin.im>
parents: 26081
diff changeset
245
26084
5e8895515af0 Use a PurpleCircBuffer for the queued stanzas
Paul Aurich <darkrain42@pidgin.im>
parents: 26083
diff changeset
246 purple_circ_buffer_destroy(conn->pending);
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
247
28079
69fc36a9cbe3 jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <darkrain42@pidgin.im>
parents: 28072
diff changeset
248 for (i = 0; i < NUM_HTTP_CONNECTIONS; ++i) {
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
249 if (conn->connections[i])
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
250 jabber_bosh_http_connection_destroy(conn->connections[i]);
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
251 }
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
252
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
253 g_free(conn);
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
254 }
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
255
26533
5c74696c34d1 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <darkrain42@pidgin.im>
parents: 26085
diff changeset
256 gboolean jabber_bosh_connection_is_ssl(PurpleBOSHConnection *conn)
5c74696c34d1 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <darkrain42@pidgin.im>
parents: 26085
diff changeset
257 {
5c74696c34d1 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <darkrain42@pidgin.im>
parents: 26085
diff changeset
258 return conn->ssl;
5c74696c34d1 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <darkrain42@pidgin.im>
parents: 26085
diff changeset
259 }
5c74696c34d1 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <darkrain42@pidgin.im>
parents: 26085
diff changeset
260
26664
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
261 static PurpleHTTPConnection *
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
262 find_available_http_connection(PurpleBOSHConnection *conn)
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
263 {
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
264 int i;
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
265
28066
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
266 if (purple_debug_is_verbose()) {
28079
69fc36a9cbe3 jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <darkrain42@pidgin.im>
parents: 28072
diff changeset
267 for (i = 0; i < NUM_HTTP_CONNECTIONS; ++i) {
28066
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
268 PurpleHTTPConnection *httpconn = conn->connections[i];
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
269 if (httpconn == NULL)
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
270 purple_debug_misc("jabber", "BOSH %p->connections[%d] = (nil)\n",
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
271 conn, i);
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
272 else
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
273 purple_debug_misc("jabber", "BOSH %p->connections[%d] = %p, state = %d"
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
274 ", requests = %d\n", conn, i, httpconn,
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
275 httpconn->state, httpconn->requests);
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
276 }
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
277 }
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
278
26664
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
279 /* Easy solution: Does everyone involved support pipelining? Hooray! Just use
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
280 * one TCP connection! */
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
281 if (conn->pipelining)
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
282 return conn->connections[0]->state == HTTP_CONN_CONNECTED ?
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
283 conn->connections[0] : NULL;
26664
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
284
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
285 /* First loop, look for a connection that's ready */
28079
69fc36a9cbe3 jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <darkrain42@pidgin.im>
parents: 28072
diff changeset
286 for (i = 0; i < NUM_HTTP_CONNECTIONS; ++i) {
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
287 if (conn->connections[i] &&
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
288 conn->connections[i]->state == HTTP_CONN_CONNECTED &&
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
289 conn->connections[i]->requests == 0)
26664
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
290 return conn->connections[i];
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
291 }
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
292
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
293 /* Second loop, is something currently connecting? If so, just queue up. */
28079
69fc36a9cbe3 jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <darkrain42@pidgin.im>
parents: 28072
diff changeset
294 for (i = 0; i < NUM_HTTP_CONNECTIONS; ++i) {
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
295 if (conn->connections[i] &&
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
296 conn->connections[i]->state == HTTP_CONN_CONNECTING)
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
297 return NULL;
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
298 }
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
299
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
300 /* Third loop, look for one that's NULL and create a new connection */
28079
69fc36a9cbe3 jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <darkrain42@pidgin.im>
parents: 28072
diff changeset
301 for (i = 0; i < NUM_HTTP_CONNECTIONS; ++i) {
26664
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
302 if (!conn->connections[i]) {
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
303 conn->connections[i] = jabber_bosh_http_connection_init(conn);
31347
ae5f84d20061 jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <darkrain42@pidgin.im>
parents: 30626
diff changeset
304 purple_debug_info("jabber", "bosh: Creating and connecting new httpconn "
ae5f84d20061 jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <darkrain42@pidgin.im>
parents: 30626
diff changeset
305 "(%i, %p)\n", i, conn->connections[i]);
26664
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
306
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
307 http_connection_connect(conn->connections[i]);
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
308 return NULL;
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
309 }
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
310 }
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
311
28066
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
312 purple_debug_warning("jabber", "Could not find a HTTP connection!\n");
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
313
26664
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
314 /* None available. */
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
315 return NULL;
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
316 }
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
317
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
318 static void
27398
198703a03461 Don't try to write when the BOSH connection isn't ready.
Paul Aurich <darkrain42@pidgin.im>
parents: 27155
diff changeset
319 jabber_bosh_connection_send(PurpleBOSHConnection *conn,
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
320 const PurpleBOSHPacketType type, const char *data)
26664
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
321 {
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
322 PurpleHTTPConnection *chosen;
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
323 GString *packet = NULL;
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
324
28072
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
325 if (type != PACKET_FLUSH && type != PACKET_TERMINATE) {
26664
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
326 /*
28072
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
327 * Unless this is a flush (or session terminate, which needs to be
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
328 * sent immediately), queue up the data and start a timer to flush
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
329 * the buffer.
26664
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
330 */
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
331 if (data) {
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
332 int len = data ? strlen(data) : 0;
27155
53502d71efdd Remove trailing whitespace that has snuck in.
Paul Aurich <darkrain42@pidgin.im>
parents: 27154
diff changeset
333 purple_circ_buffer_append(conn->pending, data, len);
26664
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
334 }
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
335
28066
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
336 if (purple_debug_is_verbose())
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
337 purple_debug_misc("jabber", "bosh: %p has %" G_GSIZE_FORMAT " bytes in "
28072
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
338 "the buffer.\n", conn, conn->pending->bufused);
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
339 if (conn->send_timer == 0)
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
340 conn->send_timer = purple_timeout_add_seconds(BUFFER_SEND_IN_SECS,
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
341 send_timer_cb, conn);
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
342 return;
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
343 }
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
344
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
345 chosen = find_available_http_connection(conn);
28066
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
346
28072
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
347 if (!chosen) {
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
348 /*
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
349 * For non-ordinary traffic, we can't 'buffer' it, so use the
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
350 * first connection.
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
351 */
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
352 chosen = conn->connections[0];
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
353
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
354 if (chosen->state != HTTP_CONN_CONNECTED) {
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
355 purple_debug_warning("jabber", "Unable to find a ready BOSH "
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
356 "connection. Ignoring send of type 0x%02x.\n", type);
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
357 return;
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
358 }
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
359 }
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
360
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
361 /* We're flushing the send buffer, so remove the send timer */
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
362 if (conn->send_timer != 0) {
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
363 purple_timeout_remove(conn->send_timer);
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
364 conn->send_timer = 0;
26664
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
365 }
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
366
27152
fc1d8106f7e1 Don't try to process BOSH packet if there's no data (avoid a purple_strcasestr assertion).
Paul Aurich <darkrain42@pidgin.im>
parents: 26967
diff changeset
367 packet = g_string_new(NULL);
26664
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
368
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
369 g_string_printf(packet, "<body "
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
370 "rid='%" G_GUINT64_FORMAT "' "
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
371 "sid='%s' "
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
372 "to='%s' "
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
373 "xml:lang='en' "
28997
5a05ac02bf3a jabber: Here's a good reason for the namespace defines. Fix a typo 'urn:xmpp:bosh'.
Paul Aurich <darkrain42@pidgin.im>
parents: 28599
diff changeset
374 "xmlns='" NS_BOSH "' "
5a05ac02bf3a jabber: Here's a good reason for the namespace defines. Fix a typo 'urn:xmpp:bosh'.
Paul Aurich <darkrain42@pidgin.im>
parents: 28599
diff changeset
375 "xmlns:xmpp='" NS_XMPP_BOSH "'",
26664
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
376 ++conn->rid,
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
377 conn->sid,
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
378 conn->js->user->domain);
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
379
28379
df144a809a92 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <darkrain42@pidgin.im>
parents: 28322
diff changeset
380 if (conn->js->reinit) {
26664
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
381 packet = g_string_append(packet, " xmpp:restart='true'/>");
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
382 /* TODO: Do we need to wait for a response? */
28379
df144a809a92 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <darkrain42@pidgin.im>
parents: 28322
diff changeset
383 conn->js->reinit = FALSE;
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
384 } else {
26664
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
385 gsize read_amt;
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
386 if (type == PACKET_TERMINATE)
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
387 packet = g_string_append(packet, " type='terminate'");
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
388
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
389 packet = g_string_append_c(packet, '>');
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
390
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
391 while ((read_amt = purple_circ_buffer_get_max_read(conn->pending)) > 0) {
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
392 packet = g_string_append_len(packet, conn->pending->outptr, read_amt);
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
393 purple_circ_buffer_mark_read(conn->pending, read_amt);
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
394 }
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
395
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
396 if (data)
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
397 packet = g_string_append(packet, data);
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
398 packet = g_string_append(packet, "</body>");
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
399 }
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
400
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
401 http_connection_send_request(chosen, packet);
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
402 }
a42da6facb80 Reorder functions to remove prototypes
Paul Aurich <darkrain42@pidgin.im>
parents: 26661
diff changeset
403
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
404 void jabber_bosh_connection_close(PurpleBOSHConnection *conn)
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
405 {
28599
ed5b761ca6e9 jabber: Don't crash when disconnecting if there's been no response from the server.
Paul Aurich <darkrain42@pidgin.im>
parents: 28379
diff changeset
406 if (conn->state == BOSH_CONN_ONLINE)
ed5b761ca6e9 jabber: Don't crash when disconnecting if there's been no response from the server.
Paul Aurich <darkrain42@pidgin.im>
parents: 28379
diff changeset
407 jabber_bosh_connection_send(conn, PACKET_TERMINATE, NULL);
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
408 }
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
409
24872
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
410 static gboolean jabber_bosh_connection_error_check(PurpleBOSHConnection *conn, xmlnode *node) {
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
411 const char *type;
24875
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
412
23623
b7b226b72971 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23621
diff changeset
413 type = xmlnode_get_attrib(node, "type");
27155
53502d71efdd Remove trailing whitespace that has snuck in.
Paul Aurich <darkrain42@pidgin.im>
parents: 27154
diff changeset
414
23623
b7b226b72971 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23621
diff changeset
415 if (type != NULL && !strcmp(type, "terminate")) {
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
416 conn->state = BOSH_CONN_OFFLINE;
27635
0cd19038c417 More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents: 27398
diff changeset
417 purple_connection_error_reason(conn->js->gc,
23624
84b42375e411 * removing some comment with XML example
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23623
diff changeset
418 PURPLE_CONNECTION_ERROR_OTHER_ERROR,
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
419 _("The BOSH connection manager terminated your session."));
23623
b7b226b72971 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23621
diff changeset
420 return TRUE;
b7b226b72971 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23621
diff changeset
421 }
b7b226b72971 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23621
diff changeset
422 return FALSE;
b7b226b72971 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23621
diff changeset
423 }
b7b226b72971 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23621
diff changeset
424
26082
7e3952f2713d Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <darkrain42@pidgin.im>
parents: 26081
diff changeset
425 static gboolean
28072
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
426 send_timer_cb(gpointer data)
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
427 {
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
428 PurpleBOSHConnection *bosh;
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
429
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
430 bosh = data;
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
431 bosh->send_timer = 0;
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
432
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
433 jabber_bosh_connection_send(bosh, PACKET_FLUSH, NULL);
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
434
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
435 return FALSE;
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
436 }
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
437
30056
24dcb476e62b jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <darkrain42@pidgin.im>
parents: 29849
diff changeset
438 void
24dcb476e62b jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <darkrain42@pidgin.im>
parents: 29849
diff changeset
439 jabber_bosh_connection_send_keepalive(PurpleBOSHConnection *bosh)
26082
7e3952f2713d Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <darkrain42@pidgin.im>
parents: 26081
diff changeset
440 {
28072
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
441 if (bosh->send_timer != 0)
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
442 purple_timeout_remove(bosh->send_timer);
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
443
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
444 /* clears bosh->send_timer */
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
445 send_timer_cb(bosh);
28065
f9b9e38c98f4 jabber: Better inactivity timer logic.
Paul Aurich <darkrain42@pidgin.im>
parents: 28064
diff changeset
446 }
f9b9e38c98f4 jabber: Better inactivity timer logic.
Paul Aurich <darkrain42@pidgin.im>
parents: 28064
diff changeset
447
24872
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
448 static void jabber_bosh_connection_received(PurpleBOSHConnection *conn, xmlnode *node) {
23620
e306af5178d7 * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23619
diff changeset
449 xmlnode *child;
e306af5178d7 * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23619
diff changeset
450 JabberStream *js = conn->js;
24875
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
451
25485
cb56bf5684c1 BOSH: Another g_return_if_fail that is backward
Paul Aurich <darkrain42@pidgin.im>
parents: 25484
diff changeset
452 g_return_if_fail(node != NULL);
24875
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
453 if (jabber_bosh_connection_error_check(conn, node))
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
454 return;
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
455
23620
e306af5178d7 * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23619
diff changeset
456 child = node->child;
24875
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
457 while (child != NULL) {
24886
de0388948ac8 Jabber BOSH: memory management fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 24885
diff changeset
458 /* jabber_process_packet might free child */
de0388948ac8 Jabber BOSH: memory management fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 24885
diff changeset
459 xmlnode *next = child->next;
23620
e306af5178d7 * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23619
diff changeset
460 if (child->type == XMLNODE_TYPE_TAG) {
29339
225f4eda36a9 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <darkrain42@pidgin.im>
parents: 28997
diff changeset
461 const char *xmlns = xmlnode_get_namespace(child);
225f4eda36a9 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <darkrain42@pidgin.im>
parents: 28997
diff changeset
462 /*
225f4eda36a9 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <darkrain42@pidgin.im>
parents: 28997
diff changeset
463 * Workaround for non-compliant servers that don't stamp
225f4eda36a9 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <darkrain42@pidgin.im>
parents: 28997
diff changeset
464 * the right xmlns on these packets. See #11315.
225f4eda36a9 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <darkrain42@pidgin.im>
parents: 28997
diff changeset
465 */
225f4eda36a9 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <darkrain42@pidgin.im>
parents: 28997
diff changeset
466 if ((xmlns == NULL /* shouldn't happen, but is equally wrong */ ||
225f4eda36a9 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <darkrain42@pidgin.im>
parents: 28997
diff changeset
467 g_str_equal(xmlns, NS_BOSH)) &&
225f4eda36a9 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <darkrain42@pidgin.im>
parents: 28997
diff changeset
468 (g_str_equal(child->name, "iq") ||
225f4eda36a9 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <darkrain42@pidgin.im>
parents: 28997
diff changeset
469 g_str_equal(child->name, "message") ||
225f4eda36a9 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <darkrain42@pidgin.im>
parents: 28997
diff changeset
470 g_str_equal(child->name, "presence"))) {
225f4eda36a9 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <darkrain42@pidgin.im>
parents: 28997
diff changeset
471 xmlnode_set_namespace(child, NS_XMPP_CLIENT);
225f4eda36a9 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <darkrain42@pidgin.im>
parents: 28997
diff changeset
472 }
23620
e306af5178d7 * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23619
diff changeset
473 jabber_process_packet(js, &child);
e306af5178d7 * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23619
diff changeset
474 }
24886
de0388948ac8 Jabber BOSH: memory management fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 24885
diff changeset
475
de0388948ac8 Jabber BOSH: memory management fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 24885
diff changeset
476 child = next;
23620
e306af5178d7 * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23619
diff changeset
477 }
23619
5c215ab46f1e * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23618
diff changeset
478 }
5c215ab46f1e * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23618
diff changeset
479
24875
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
480 static void boot_response_cb(PurpleBOSHConnection *conn, xmlnode *node) {
28379
df144a809a92 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <darkrain42@pidgin.im>
parents: 28322
diff changeset
481 JabberStream *js = conn->js;
24875
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
482 const char *sid, *version;
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
483 const char *inactivity, *requests;
24885
353c663c8110 Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <darkrain42@pidgin.im>
parents: 24884
diff changeset
484 xmlnode *packet;
24875
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
485
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
486 g_return_if_fail(node != NULL);
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
487 if (jabber_bosh_connection_error_check(conn, node))
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
488 return;
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
489
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
490 sid = xmlnode_get_attrib(node, "sid");
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
491 version = xmlnode_get_attrib(node, "ver");
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
492
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
493 inactivity = xmlnode_get_attrib(node, "inactivity");
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
494 requests = xmlnode_get_attrib(node, "requests");
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
495
24875
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
496 if (sid) {
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
497 conn->sid = g_strdup(sid);
23618
8497c2f5e62d * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23617
diff changeset
498 } else {
28379
df144a809a92 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <darkrain42@pidgin.im>
parents: 28322
diff changeset
499 purple_connection_error_reason(js->gc,
24875
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
500 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
501 _("No session ID given"));
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
502 return;
23618
8497c2f5e62d * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23617
diff changeset
503 }
24872
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
504
24875
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
505 if (version) {
29849
d7b910200dc5 jabber: Treat the version properly.
Paul Aurich <darkrain42@pidgin.im>
parents: 29339
diff changeset
506 const char *dot = strchr(version, '.');
27154
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
507 int major, minor = 0;
24872
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
508
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
509 purple_debug_info("jabber", "BOSH connection manager version %s\n", version);
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
510
27154
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
511 major = atoi(version);
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
512 if (dot)
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
513 minor = atoi(dot + 1);
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
514
24885
353c663c8110 Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <darkrain42@pidgin.im>
parents: 24884
diff changeset
515 if (major != 1 || minor < 6) {
28379
df144a809a92 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <darkrain42@pidgin.im>
parents: 28322
diff changeset
516 purple_connection_error_reason(js->gc,
24875
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
517 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
518 _("Unsupported version of BOSH protocol"));
24885
353c663c8110 Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <darkrain42@pidgin.im>
parents: 24884
diff changeset
519 return;
23618
8497c2f5e62d * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23617
diff changeset
520 }
8497c2f5e62d * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23617
diff changeset
521 } else {
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
522 purple_debug_info("jabber", "Missing version in BOSH initiation\n");
23618
8497c2f5e62d * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23617
diff changeset
523 }
24885
353c663c8110 Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <darkrain42@pidgin.im>
parents: 24884
diff changeset
524
26082
7e3952f2713d Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <darkrain42@pidgin.im>
parents: 26081
diff changeset
525 if (inactivity) {
30056
24dcb476e62b jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <darkrain42@pidgin.im>
parents: 29849
diff changeset
526 js->max_inactivity = atoi(inactivity);
24dcb476e62b jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <darkrain42@pidgin.im>
parents: 29849
diff changeset
527 if (js->max_inactivity <= 5) {
26082
7e3952f2713d Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <darkrain42@pidgin.im>
parents: 26081
diff changeset
528 purple_debug_warning("jabber", "Ignoring bogusly small inactivity: %s\n",
7e3952f2713d Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <darkrain42@pidgin.im>
parents: 26081
diff changeset
529 inactivity);
30056
24dcb476e62b jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <darkrain42@pidgin.im>
parents: 29849
diff changeset
530 /* Leave it at the default */
26082
7e3952f2713d Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <darkrain42@pidgin.im>
parents: 26081
diff changeset
531 } else {
28065
f9b9e38c98f4 jabber: Better inactivity timer logic.
Paul Aurich <darkrain42@pidgin.im>
parents: 28064
diff changeset
532 /* TODO: Can this check fail? It shouldn't */
30056
24dcb476e62b jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <darkrain42@pidgin.im>
parents: 29849
diff changeset
533 js->max_inactivity -= 5; /* rounding */
24dcb476e62b jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <darkrain42@pidgin.im>
parents: 29849
diff changeset
534
24dcb476e62b jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <darkrain42@pidgin.im>
parents: 29849
diff changeset
535 if (js->inactivity_timer == 0) {
28065
f9b9e38c98f4 jabber: Better inactivity timer logic.
Paul Aurich <darkrain42@pidgin.im>
parents: 28064
diff changeset
536 purple_debug_misc("jabber", "Starting BOSH inactivity timer "
f9b9e38c98f4 jabber: Better inactivity timer logic.
Paul Aurich <darkrain42@pidgin.im>
parents: 28064
diff changeset
537 "for %d secs (compensating for rounding)\n",
30056
24dcb476e62b jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <darkrain42@pidgin.im>
parents: 29849
diff changeset
538 js->max_inactivity);
24dcb476e62b jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <darkrain42@pidgin.im>
parents: 29849
diff changeset
539 jabber_stream_restart_inactivity_timer(js);
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
540 }
26082
7e3952f2713d Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <darkrain42@pidgin.im>
parents: 26081
diff changeset
541 }
7e3952f2713d Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <darkrain42@pidgin.im>
parents: 26081
diff changeset
542 }
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
543
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
544 if (requests)
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
545 conn->max_requests = atoi(requests);
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
546
28379
df144a809a92 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <darkrain42@pidgin.im>
parents: 28322
diff changeset
547 jabber_stream_set_state(js, JABBER_STREAM_AUTHENTICATING);
df144a809a92 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <darkrain42@pidgin.im>
parents: 28322
diff changeset
548
24885
353c663c8110 Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <darkrain42@pidgin.im>
parents: 24884
diff changeset
549 /* FIXME: Depending on receiving features might break with some hosts */
353c663c8110 Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <darkrain42@pidgin.im>
parents: 24884
diff changeset
550 packet = xmlnode_get_child(node, "features");
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
551 conn->state = BOSH_CONN_ONLINE;
28379
df144a809a92 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <darkrain42@pidgin.im>
parents: 28322
diff changeset
552 conn->receive_cb = jabber_bosh_connection_received;
df144a809a92 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <darkrain42@pidgin.im>
parents: 28322
diff changeset
553 jabber_stream_features_parse(js, packet);
23616
5e5d6a440ee6 * calling PurpleBOSHConnection's receive_cb
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23615
diff changeset
554 }
5e5d6a440ee6 * calling PurpleBOSHConnection's receive_cb
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23615
diff changeset
555
23612
0d8cc9f7f223 * adding receive callback; preparing receiving and boot code
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23611
diff changeset
556 static void jabber_bosh_connection_boot(PurpleBOSHConnection *conn) {
27152
fc1d8106f7e1 Don't try to process BOSH packet if there's no data (avoid a purple_strcasestr assertion).
Paul Aurich <darkrain42@pidgin.im>
parents: 26967
diff changeset
557 GString *buf = g_string_new(NULL);
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
558
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
559 g_string_printf(buf, "<body content='text/xml; charset=utf-8' "
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
560 "secure='true' "
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
561 "to='%s' "
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
562 "xml:lang='en' "
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
563 "xmpp:version='1.0' "
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
564 "ver='1.6' "
28997
5a05ac02bf3a jabber: Here's a good reason for the namespace defines. Fix a typo 'urn:xmpp:bosh'.
Paul Aurich <darkrain42@pidgin.im>
parents: 28599
diff changeset
565 "xmlns:xmpp='" NS_XMPP_BOSH "' "
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
566 "rid='%" G_GUINT64_FORMAT "' "
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
567 /* TODO: This should be adjusted/adjustable automatically according to
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
568 * realtime network behavior */
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
569 "wait='60' "
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
570 "hold='1' "
28997
5a05ac02bf3a jabber: Here's a good reason for the namespace defines. Fix a typo 'urn:xmpp:bosh'.
Paul Aurich <darkrain42@pidgin.im>
parents: 28599
diff changeset
571 "xmlns='" NS_BOSH "'/>",
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
572 conn->js->user->domain,
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
573 ++conn->rid);
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
574
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
575 purple_debug_misc("jabber", "SendBOSH Boot %s(%" G_GSIZE_FORMAT "): %s\n",
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
576 conn->ssl ? "(ssl)" : "", buf->len, buf->str);
24875
0fa0cf6ea28e Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <darkrain42@pidgin.im>
parents: 24874
diff changeset
577 conn->receive_cb = boot_response_cb;
26078
3526ac955ce3 Rename a few functions and drop some data members.
Paul Aurich <darkrain42@pidgin.im>
parents: 26076
diff changeset
578 http_connection_send_request(conn->connections[0], buf);
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
579 g_string_free(buf, TRUE);
23613
1da7c5cbcc54 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23612
diff changeset
580 }
1da7c5cbcc54 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23612
diff changeset
581
25488
acdb4dbab299 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <darkrain42@pidgin.im>
parents: 25487
diff changeset
582 static void
25489
9c591341d172 Store PurpleBOSHConnection* instead of void* userdata
Paul Aurich <darkrain42@pidgin.im>
parents: 25488
diff changeset
583 http_received_cb(const char *data, int len, PurpleBOSHConnection *conn)
25488
acdb4dbab299 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <darkrain42@pidgin.im>
parents: 25487
diff changeset
584 {
26534
20a970cad8e2 Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <darkrain42@pidgin.im>
parents: 26533
diff changeset
585 if (conn->failed_connections)
20a970cad8e2 Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <darkrain42@pidgin.im>
parents: 26533
diff changeset
586 /* We've got some data, so reset the number of failed connections */
20a970cad8e2 Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <darkrain42@pidgin.im>
parents: 26533
diff changeset
587 conn->failed_connections = 0;
20a970cad8e2 Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <darkrain42@pidgin.im>
parents: 26533
diff changeset
588
23616
5e5d6a440ee6 * calling PurpleBOSHConnection's receive_cb
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23615
diff changeset
589 if (conn->receive_cb) {
25488
acdb4dbab299 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <darkrain42@pidgin.im>
parents: 25487
diff changeset
590 xmlnode *node = xmlnode_from_str(data, len);
26661
47880af4165a BOSH: Print out the received data (similar to the standard XMPP method,
Paul Aurich <darkrain42@pidgin.im>
parents: 26660
diff changeset
591
47880af4165a BOSH: Print out the received data (similar to the standard XMPP method,
Paul Aurich <darkrain42@pidgin.im>
parents: 26660
diff changeset
592 purple_debug_info("jabber", "RecvBOSH %s(%d): %s\n",
47880af4165a BOSH: Print out the received data (similar to the standard XMPP method,
Paul Aurich <darkrain42@pidgin.im>
parents: 26660
diff changeset
593 conn->ssl ? "(ssl)" : "", len, data);
47880af4165a BOSH: Print out the received data (similar to the standard XMPP method,
Paul Aurich <darkrain42@pidgin.im>
parents: 26660
diff changeset
594
23620
e306af5178d7 * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23619
diff changeset
595 if (node) {
e306af5178d7 * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23619
diff changeset
596 conn->receive_cb(conn, node);
23625
8d5884281cfb * free xmlnodes after bosh receive callback is called
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23624
diff changeset
597 xmlnode_free(node);
23620
e306af5178d7 * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23619
diff changeset
598 } else {
25486
5ed3de6b1794 BOSH: Fix an off-by-one g_memdup that was missing the null terminator.
Paul Aurich <darkrain42@pidgin.im>
parents: 25485
diff changeset
599 purple_debug_warning("jabber", "BOSH: Received invalid XML\n");
23620
e306af5178d7 * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23619
diff changeset
600 }
25486
5ed3de6b1794 BOSH: Fix an off-by-one g_memdup that was missing the null terminator.
Paul Aurich <darkrain42@pidgin.im>
parents: 25485
diff changeset
601 } else {
5ed3de6b1794 BOSH: Fix an off-by-one g_memdup that was missing the null terminator.
Paul Aurich <darkrain42@pidgin.im>
parents: 25485
diff changeset
602 g_return_if_reached();
5ed3de6b1794 BOSH: Fix an off-by-one g_memdup that was missing the null terminator.
Paul Aurich <darkrain42@pidgin.im>
parents: 25485
diff changeset
603 }
23612
0d8cc9f7f223 * adding receive callback; preparing receiving and boot code
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23611
diff changeset
604 }
0d8cc9f7f223 * adding receive callback; preparing receiving and boot code
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23611
diff changeset
605
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
606 void jabber_bosh_connection_send_raw(PurpleBOSHConnection *conn,
26660
be0a41af4dde Pass all messages to BOSH as text, so they pass through the sending-text
Paul Aurich <darkrain42@pidgin.im>
parents: 26534
diff changeset
607 const char *data)
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
608 {
26660
be0a41af4dde Pass all messages to BOSH as text, so they pass through the sending-text
Paul Aurich <darkrain42@pidgin.im>
parents: 26534
diff changeset
609 jabber_bosh_connection_send(conn, PACKET_NORMAL, data);
23618
8497c2f5e62d * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23617
diff changeset
610 }
8497c2f5e62d * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23617
diff changeset
611
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
612 static void
26085
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
613 connection_common_established_cb(PurpleHTTPConnection *conn)
26078
3526ac955ce3 Rename a few functions and drop some data members.
Paul Aurich <darkrain42@pidgin.im>
parents: 26076
diff changeset
614 {
26081
ef41d4bd0dfa Clean up BOSH reading and disconnection handling.
Paul Aurich <darkrain42@pidgin.im>
parents: 26079
diff changeset
615 /* Indicate we're ready and reset some variables */
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
616 conn->state = HTTP_CONN_CONNECTED;
28066
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
617 if (conn->requests != 0)
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
618 purple_debug_error("jabber", "bosh: httpconn %p has %d requests, != 0\n",
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
619 conn, conn->requests);
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
620
26081
ef41d4bd0dfa Clean up BOSH reading and disconnection handling.
Paul Aurich <darkrain42@pidgin.im>
parents: 26079
diff changeset
621 conn->requests = 0;
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
622 if (conn->read_buf) {
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
623 g_string_free(conn->read_buf, TRUE);
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
624 conn->read_buf = NULL;
26081
ef41d4bd0dfa Clean up BOSH reading and disconnection handling.
Paul Aurich <darkrain42@pidgin.im>
parents: 26079
diff changeset
625 }
ef41d4bd0dfa Clean up BOSH reading and disconnection handling.
Paul Aurich <darkrain42@pidgin.im>
parents: 26079
diff changeset
626 conn->headers_done = FALSE;
ef41d4bd0dfa Clean up BOSH reading and disconnection handling.
Paul Aurich <darkrain42@pidgin.im>
parents: 26079
diff changeset
627 conn->handled_len = conn->body_len = 0;
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
628
28379
df144a809a92 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <darkrain42@pidgin.im>
parents: 28322
diff changeset
629 if (conn->bosh->js->reinit)
df144a809a92 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <darkrain42@pidgin.im>
parents: 28322
diff changeset
630 jabber_bosh_connection_send(conn->bosh, PACKET_NORMAL, NULL);
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
631 else if (conn->bosh->state == BOSH_CONN_ONLINE) {
23621
d7a6cc7ca517 * 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: 23620
diff changeset
632 purple_debug_info("jabber", "BOSH session already exists. Trying to reuse it.\n");
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
633 if (conn->bosh->requests == 0 || conn->bosh->pending->bufused > 0) {
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
634 /* Send the pending data */
28072
208dfa375b79 jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <darkrain42@pidgin.im>
parents: 28066
diff changeset
635 jabber_bosh_connection_send(conn->bosh, PACKET_FLUSH, NULL);
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
636 }
25489
9c591341d172 Store PurpleBOSHConnection* instead of void* userdata
Paul Aurich <darkrain42@pidgin.im>
parents: 25488
diff changeset
637 } else
9c591341d172 Store PurpleBOSHConnection* instead of void* userdata
Paul Aurich <darkrain42@pidgin.im>
parents: 25488
diff changeset
638 jabber_bosh_connection_boot(conn->bosh);
23621
d7a6cc7ca517 * 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: 23620
diff changeset
639 }
d7a6cc7ca517 * 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: 23620
diff changeset
640
26078
3526ac955ce3 Rename a few functions and drop some data members.
Paul Aurich <darkrain42@pidgin.im>
parents: 26076
diff changeset
641 static void http_connection_disconnected(PurpleHTTPConnection *conn)
3526ac955ce3 Rename a few functions and drop some data members.
Paul Aurich <darkrain42@pidgin.im>
parents: 26076
diff changeset
642 {
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
643 /*
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
644 * Well, then. Fine! I never liked you anyway, server! I was cheating on you
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
645 * with AIM!
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
646 */
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
647 conn->state = HTTP_CONN_OFFLINE;
26533
5c74696c34d1 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <darkrain42@pidgin.im>
parents: 26085
diff changeset
648 if (conn->psc) {
5c74696c34d1 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <darkrain42@pidgin.im>
parents: 26085
diff changeset
649 purple_ssl_close(conn->psc);
5c74696c34d1 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <darkrain42@pidgin.im>
parents: 26085
diff changeset
650 conn->psc = NULL;
5c74696c34d1 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <darkrain42@pidgin.im>
parents: 26085
diff changeset
651 } else if (conn->fd >= 0) {
5c74696c34d1 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <darkrain42@pidgin.im>
parents: 26085
diff changeset
652 close(conn->fd);
5c74696c34d1 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <darkrain42@pidgin.im>
parents: 26085
diff changeset
653 conn->fd = -1;
5c74696c34d1 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <darkrain42@pidgin.im>
parents: 26085
diff changeset
654 }
5c74696c34d1 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <darkrain42@pidgin.im>
parents: 26085
diff changeset
655
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
656 if (conn->readh) {
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
657 purple_input_remove(conn->readh);
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
658 conn->readh = 0;
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
659 }
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
660
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
661 if (conn->writeh) {
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
662 purple_input_remove(conn->writeh);
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
663 conn->writeh = 0;
26533
5c74696c34d1 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <darkrain42@pidgin.im>
parents: 26085
diff changeset
664 }
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
665
28066
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
666 if (conn->requests > 0 && conn->read_buf->len == 0) {
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
667 purple_debug_error("jabber", "bosh: Adjusting BOSHconn requests (%d) to %d\n",
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
668 conn->bosh->requests, conn->bosh->requests - conn->requests);
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
669 conn->bosh->requests -= conn->requests;
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
670 conn->requests = 0;
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
671 }
28079
69fc36a9cbe3 jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <darkrain42@pidgin.im>
parents: 28072
diff changeset
672
69fc36a9cbe3 jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <darkrain42@pidgin.im>
parents: 28072
diff changeset
673 if (conn->bosh->pipelining) {
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
674 /* Hmmmm, fall back to multiple connections */
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
675 conn->bosh->pipelining = FALSE;
28079
69fc36a9cbe3 jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <darkrain42@pidgin.im>
parents: 28072
diff changeset
676 if (conn->bosh->connections[1] == NULL) {
69fc36a9cbe3 jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <darkrain42@pidgin.im>
parents: 28072
diff changeset
677 conn->bosh->connections[1] = jabber_bosh_http_connection_init(conn->bosh);
69fc36a9cbe3 jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <darkrain42@pidgin.im>
parents: 28072
diff changeset
678 http_connection_connect(conn->bosh->connections[1]);
31347
ae5f84d20061 jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <darkrain42@pidgin.im>
parents: 30626
diff changeset
679 } else {
ae5f84d20061 jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <darkrain42@pidgin.im>
parents: 30626
diff changeset
680 /* Shouldn't happen; this should be the only place pipelining
ae5f84d20061 jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <darkrain42@pidgin.im>
parents: 30626
diff changeset
681 * is turned off.
ae5f84d20061 jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <darkrain42@pidgin.im>
parents: 30626
diff changeset
682 */
ae5f84d20061 jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <darkrain42@pidgin.im>
parents: 30626
diff changeset
683 g_warn_if_reached();
28079
69fc36a9cbe3 jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <darkrain42@pidgin.im>
parents: 28072
diff changeset
684 }
69fc36a9cbe3 jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <darkrain42@pidgin.im>
parents: 28072
diff changeset
685 }
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
686
26534
20a970cad8e2 Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <darkrain42@pidgin.im>
parents: 26533
diff changeset
687 if (++conn->bosh->failed_connections == MAX_FAILED_CONNECTIONS) {
20a970cad8e2 Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <darkrain42@pidgin.im>
parents: 26533
diff changeset
688 purple_connection_error_reason(conn->bosh->js->gc,
20a970cad8e2 Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <darkrain42@pidgin.im>
parents: 26533
diff changeset
689 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
20a970cad8e2 Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <darkrain42@pidgin.im>
parents: 26533
diff changeset
690 _("Unable to establish a connection with the server"));
20a970cad8e2 Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <darkrain42@pidgin.im>
parents: 26533
diff changeset
691 } else {
20a970cad8e2 Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <darkrain42@pidgin.im>
parents: 26533
diff changeset
692 /* No! Please! Take me back. It was me, not you! I was weak! */
20a970cad8e2 Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <darkrain42@pidgin.im>
parents: 26533
diff changeset
693 http_connection_connect(conn);
20a970cad8e2 Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <darkrain42@pidgin.im>
parents: 26533
diff changeset
694 }
23611
d811757e19b5 * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23609
diff changeset
695 }
d811757e19b5 * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23609
diff changeset
696
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
697 void jabber_bosh_connection_connect(PurpleBOSHConnection *bosh) {
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
698 PurpleHTTPConnection *conn = bosh->connections[0];
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
699
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
700 g_return_if_fail(bosh->state == BOSH_CONN_OFFLINE);
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
701 bosh->state = BOSH_CONN_BOOTING;
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
702
26078
3526ac955ce3 Rename a few functions and drop some data members.
Paul Aurich <darkrain42@pidgin.im>
parents: 26076
diff changeset
703 http_connection_connect(conn);
23611
d811757e19b5 * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23609
diff changeset
704 }
d811757e19b5 * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23609
diff changeset
705
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
706 static void
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
707 jabber_bosh_http_connection_process(PurpleHTTPConnection *conn)
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
708 {
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
709 const char *cursor;
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
710
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
711 cursor = conn->read_buf->str + conn->handled_len;
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
712
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
713 if (!conn->headers_done) {
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
714 const char *content_length = purple_strcasestr(cursor, "\r\nContent-Length");
27154
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
715 const char *end_of_headers = strstr(cursor, "\r\n\r\n");
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
716
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
717 /* Make sure Content-Length is in headers, not body */
27154
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
718 if (content_length && (!end_of_headers || content_length < end_of_headers)) {
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
719 const char *sep;
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
720 int len;
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
721
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
722 if ((sep = strstr(content_length, ": ")) == NULL ||
30626
bec413ce77c7 Fix some "Dead nested assignment"s and then kill off some useless
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 30506
diff changeset
723 strstr(sep, "\r\n") == NULL)
27154
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
724 /*
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
725 * The packet ends in the middle of the Content-Length line.
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
726 * We'll try again later when we have more.
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
727 */
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
728 return;
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
729
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
730 len = atoi(sep + 2);
27155
53502d71efdd Remove trailing whitespace that has snuck in.
Paul Aurich <darkrain42@pidgin.im>
parents: 27154
diff changeset
731 if (len == 0)
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
732 purple_debug_warning("jabber", "Found mangled Content-Length header.\n");
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
733
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
734 conn->body_len = len;
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
735 }
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
736
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
737 if (end_of_headers) {
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
738 conn->headers_done = TRUE;
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
739 conn->handled_len = end_of_headers - conn->read_buf->str + 4;
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
740 cursor = end_of_headers + 4;
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
741 } else {
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
742 conn->handled_len = conn->read_buf->len;
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
743 return;
23620
e306af5178d7 * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23619
diff changeset
744 }
e306af5178d7 * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23619
diff changeset
745 }
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
746
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
747 /* Have we handled everything in the buffer? */
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
748 if (conn->handled_len >= conn->read_buf->len)
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
749 return;
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
750
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
751 /* Have we read all that the Content-Length promised us? */
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
752 if (conn->read_buf->len - conn->handled_len < conn->body_len)
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
753 return;
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
754
25488
acdb4dbab299 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <darkrain42@pidgin.im>
parents: 25487
diff changeset
755 --conn->requests;
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
756 --conn->bosh->requests;
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
757
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
758 http_received_cb(conn->read_buf->str + conn->handled_len, conn->body_len,
26082
7e3952f2713d Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <darkrain42@pidgin.im>
parents: 26081
diff changeset
759 conn->bosh);
7e3952f2713d Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <darkrain42@pidgin.im>
parents: 26081
diff changeset
760
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
761 if (conn->bosh->state == BOSH_CONN_ONLINE &&
26084
5e8895515af0 Use a PurpleCircBuffer for the queued stanzas
Paul Aurich <darkrain42@pidgin.im>
parents: 26083
diff changeset
762 (conn->bosh->requests == 0 || conn->bosh->pending->bufused > 0)) {
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
763 purple_debug_misc("jabber", "BOSH: Sending an empty request\n");
26660
be0a41af4dde Pass all messages to BOSH as text, so they pass through the sending-text
Paul Aurich <darkrain42@pidgin.im>
parents: 26534
diff changeset
764 jabber_bosh_connection_send(conn->bosh, PACKET_NORMAL, NULL);
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
765 }
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
766
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
767 g_string_free(conn->read_buf, TRUE);
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
768 conn->read_buf = NULL;
25488
acdb4dbab299 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <darkrain42@pidgin.im>
parents: 25487
diff changeset
769 conn->headers_done = FALSE;
acdb4dbab299 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <darkrain42@pidgin.im>
parents: 25487
diff changeset
770 conn->handled_len = conn->body_len = 0;
23620
e306af5178d7 * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23619
diff changeset
771 }
e306af5178d7 * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23619
diff changeset
772
26085
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
773 /*
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
774 * Common code for reading, called from http_connection_read_cb_ssl and
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
775 * http_connection_read_cb.
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
776 */
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
777 static void
26085
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
778 http_connection_read(PurpleHTTPConnection *conn)
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
779 {
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
780 char buffer[1025];
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
781 int cnt, count = 0;
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
782
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
783 if (!conn->read_buf)
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
784 conn->read_buf = g_string_new(NULL);
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
785
27154
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
786 do {
26085
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
787 if (conn->psc)
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
788 cnt = purple_ssl_read(conn->psc, buffer, sizeof(buffer));
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
789 else
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
790 cnt = read(conn->fd, buffer, sizeof(buffer));
27154
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
791
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
792 if (cnt > 0) {
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
793 count += cnt;
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
794 g_string_append_len(conn->read_buf, buffer, cnt);
27154
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
795 }
2ef476bfe073 Various BOSH fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 27152
diff changeset
796 } while (cnt > 0);
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
797
26081
ef41d4bd0dfa Clean up BOSH reading and disconnection handling.
Paul Aurich <darkrain42@pidgin.im>
parents: 26079
diff changeset
798 if (cnt == 0 || (cnt < 0 && errno != EAGAIN)) {
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
799 if (cnt < 0)
31347
ae5f84d20061 jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <darkrain42@pidgin.im>
parents: 30626
diff changeset
800 purple_debug_info("jabber", "BOSH (%p) read=%d, errno=%d, error=%s\n",
ae5f84d20061 jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <darkrain42@pidgin.im>
parents: 30626
diff changeset
801 conn, cnt, errno, g_strerror(errno));
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
802 else
31347
ae5f84d20061 jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <darkrain42@pidgin.im>
parents: 30626
diff changeset
803 purple_debug_info("jabber", "BOSH server closed the connection (%p)\n",
ae5f84d20061 jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <darkrain42@pidgin.im>
parents: 30626
diff changeset
804 conn);
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
805
26081
ef41d4bd0dfa Clean up BOSH reading and disconnection handling.
Paul Aurich <darkrain42@pidgin.im>
parents: 26079
diff changeset
806 /*
ef41d4bd0dfa Clean up BOSH reading and disconnection handling.
Paul Aurich <darkrain42@pidgin.im>
parents: 26079
diff changeset
807 * If the socket is closed, the processing really needs to know about
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
808 * it. Handle that now.
26081
ef41d4bd0dfa Clean up BOSH reading and disconnection handling.
Paul Aurich <darkrain42@pidgin.im>
parents: 26079
diff changeset
809 */
26078
3526ac955ce3 Rename a few functions and drop some data members.
Paul Aurich <darkrain42@pidgin.im>
parents: 26076
diff changeset
810 http_connection_disconnected(conn);
26081
ef41d4bd0dfa Clean up BOSH reading and disconnection handling.
Paul Aurich <darkrain42@pidgin.im>
parents: 26079
diff changeset
811
ef41d4bd0dfa Clean up BOSH reading and disconnection handling.
Paul Aurich <darkrain42@pidgin.im>
parents: 26079
diff changeset
812 /* Process what we do have */
23614
cb637468e183 * preparing handling of multiple requests for pipelining support
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23613
diff changeset
813 }
24884
896733ece217 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <darkrain42@pidgin.im>
parents: 24883
diff changeset
814
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
815 if (conn->read_buf->len > 0)
27152
fc1d8106f7e1 Don't try to process BOSH packet if there's no data (avoid a purple_strcasestr assertion).
Paul Aurich <darkrain42@pidgin.im>
parents: 26967
diff changeset
816 jabber_bosh_http_connection_process(conn);
23612
0d8cc9f7f223 * adding receive callback; preparing receiving and boot code
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23611
diff changeset
817 }
23611
d811757e19b5 * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23609
diff changeset
818
26085
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
819 static void
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
820 http_connection_read_cb(gpointer data, gint fd, PurpleInputCondition condition)
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
821 {
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
822 PurpleHTTPConnection *conn = data;
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
823
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
824 http_connection_read(conn);
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
825 }
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
826
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
827 static void
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
828 http_connection_read_cb_ssl(gpointer data, PurpleSslConnection *psc,
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
829 PurpleInputCondition cond)
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
830 {
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
831 PurpleHTTPConnection *conn = data;
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
832
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
833 http_connection_read(conn);
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
834 }
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
835
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
836 static void
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
837 ssl_connection_established_cb(gpointer data, PurpleSslConnection *psc,
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
838 PurpleInputCondition cond)
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
839 {
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
840 PurpleHTTPConnection *conn = data;
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
841
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
842 purple_ssl_input_add(psc, http_connection_read_cb_ssl, conn);
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
843 connection_common_established_cb(conn);
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
844 }
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
845
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
846 static void
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
847 ssl_connection_error_cb(PurpleSslConnection *gsc, PurpleSslErrorType error,
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
848 gpointer data)
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
849 {
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
850 PurpleHTTPConnection *conn = data;
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
851
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
852 /* sslconn frees the connection on error */
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
853 conn->psc = NULL;
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
854
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
855 purple_connection_ssl_error(conn->bosh->js->gc, error);
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
856 }
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
857
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
858 static void
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
859 connection_established_cb(gpointer data, gint source, const gchar *error)
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
860 {
23611
d811757e19b5 * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23609
diff changeset
861 PurpleHTTPConnection *conn = data;
25489
9c591341d172 Store PurpleBOSHConnection* instead of void* userdata
Paul Aurich <darkrain42@pidgin.im>
parents: 25488
diff changeset
862 PurpleConnection *gc = conn->bosh->js->gc;
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
863
23611
d811757e19b5 * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23609
diff changeset
864 if (source < 0) {
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
865 gchar *tmp;
27635
0cd19038c417 More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents: 27398
diff changeset
866 tmp = g_strdup_printf(_("Unable to establish a connection with the server: %s"),
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
867 error);
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
868 purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
869 g_free(tmp);
23611
d811757e19b5 * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23609
diff changeset
870 return;
d811757e19b5 * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23609
diff changeset
871 }
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
872
23611
d811757e19b5 * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23609
diff changeset
873 conn->fd = source;
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
874 conn->readh = purple_input_add(conn->fd, PURPLE_INPUT_READ,
26085
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
875 http_connection_read_cb, conn);
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
876 connection_common_established_cb(conn);
23609
94f1737e3853 * some refactoring
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23607
diff changeset
877 }
94f1737e3853 * some refactoring
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23607
diff changeset
878
26078
3526ac955ce3 Rename a few functions and drop some data members.
Paul Aurich <darkrain42@pidgin.im>
parents: 26076
diff changeset
879 static void http_connection_connect(PurpleHTTPConnection *conn)
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
880 {
26078
3526ac955ce3 Rename a few functions and drop some data members.
Paul Aurich <darkrain42@pidgin.im>
parents: 26076
diff changeset
881 PurpleBOSHConnection *bosh = conn->bosh;
3526ac955ce3 Rename a few functions and drop some data members.
Paul Aurich <darkrain42@pidgin.im>
parents: 26076
diff changeset
882 PurpleConnection *gc = bosh->js->gc;
24872
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
883 PurpleAccount *account = purple_connection_get_account(gc);
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
884
27811
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
885 conn->state = HTTP_CONN_CONNECTING;
9db18cacd8fc Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <darkrain42@pidgin.im>
parents: 27635
diff changeset
886
26085
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
887 if (bosh->ssl) {
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
888 if (purple_ssl_is_supported()) {
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
889 conn->psc = purple_ssl_connect(account, bosh->host, bosh->port,
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
890 ssl_connection_established_cb,
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
891 ssl_connection_error_cb,
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
892 conn);
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
893 if (!conn->psc) {
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
894 purple_connection_error_reason(gc,
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
895 PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT,
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
896 _("Unable to establish SSL connection"));
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
897 }
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
898 } else {
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
899 purple_connection_error_reason(gc,
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
900 PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT,
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
901 _("SSL support unavailable"));
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
902 }
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
903 } else if (purple_proxy_connect(conn, account, bosh->host, bosh->port,
6b5686df629c BOSH: Support HTTPS connections to the connection manager
Paul Aurich <darkrain42@pidgin.im>
parents: 26084
diff changeset
904 connection_established_cb, conn) == NULL) {
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
905 purple_connection_error_reason(gc,
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
906 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
27635
0cd19038c417 More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents: 27398
diff changeset
907 _("Unable to connect"));
24872
68de61b562f6 Jabber BOSH: Many fixes
Paul Aurich <darkrain42@pidgin.im>
parents: 23625
diff changeset
908 }
23613
1da7c5cbcc54 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23612
diff changeset
909 }
1da7c5cbcc54 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23612
diff changeset
910
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
911 static int
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
912 http_connection_do_send(PurpleHTTPConnection *conn, const char *data, int len)
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
913 {
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
914 int ret;
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
915
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
916 if (conn->psc)
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
917 ret = purple_ssl_write(conn->psc, data, len);
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
918 else
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
919 ret = write(conn->fd, data, len);
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
920
31347
ae5f84d20061 jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <darkrain42@pidgin.im>
parents: 30626
diff changeset
921 if (purple_debug_is_verbose())
ae5f84d20061 jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <darkrain42@pidgin.im>
parents: 30626
diff changeset
922 purple_debug_misc("jabber", "BOSH (%p): wrote %d bytes\n", conn, ret);
ae5f84d20061 jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <darkrain42@pidgin.im>
parents: 30626
diff changeset
923
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
924 return ret;
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
925 }
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
926
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
927 static void
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
928 http_connection_send_cb(gpointer data, gint source, PurpleInputCondition cond)
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
929 {
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
930 PurpleHTTPConnection *conn = data;
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
931 int ret;
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
932 int writelen = purple_circ_buffer_get_max_read(conn->write_buf);
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
933
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
934 if (writelen == 0) {
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
935 purple_input_remove(conn->writeh);
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
936 conn->writeh = 0;
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
937 return;
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
938 }
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
939
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
940 ret = http_connection_do_send(conn, conn->write_buf->outptr, writelen);
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
941
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
942 if (ret < 0 && errno == EAGAIN)
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
943 return;
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
944 else if (ret <= 0) {
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
945 /*
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
946 * TODO: Handle this better. Probably requires a PurpleBOSHConnection
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
947 * buffer that stores what is "being sent" until the
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
948 * PurpleHTTPConnection reports it is fully sent.
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
949 */
27635
0cd19038c417 More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents: 27398
diff changeset
950 gchar *tmp = g_strdup_printf(_("Lost connection with server: %s"),
0cd19038c417 More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents: 27398
diff changeset
951 g_strerror(errno));
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
952 purple_connection_error_reason(conn->bosh->js->gc,
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
953 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
27635
0cd19038c417 More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents: 27398
diff changeset
954 tmp);
0cd19038c417 More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents: 27398
diff changeset
955 g_free(tmp);
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
956 return;
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
957 }
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
958
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
959 purple_circ_buffer_mark_read(conn->write_buf, ret);
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
960 }
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
961
24883
c283f8737645 Jabber BOSH: Store less for each Request/Response
Paul Aurich <darkrain42@pidgin.im>
parents: 24875
diff changeset
962 static void
26078
3526ac955ce3 Rename a few functions and drop some data members.
Paul Aurich <darkrain42@pidgin.im>
parents: 26076
diff changeset
963 http_connection_send_request(PurpleHTTPConnection *conn, const GString *req)
24873
7d1e91d5ec46 Jabber BOSH: more fixes.
Paul Aurich <darkrain42@pidgin.im>
parents: 24872
diff changeset
964 {
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
965 char *data;
24883
c283f8737645 Jabber BOSH: Store less for each Request/Response
Paul Aurich <darkrain42@pidgin.im>
parents: 24875
diff changeset
966 int ret;
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
967 size_t len;
24883
c283f8737645 Jabber BOSH: Store less for each Request/Response
Paul Aurich <darkrain42@pidgin.im>
parents: 24875
diff changeset
968
28065
f9b9e38c98f4 jabber: Better inactivity timer logic.
Paul Aurich <darkrain42@pidgin.im>
parents: 28064
diff changeset
969 /* Sending something to the server, restart the inactivity timer */
30056
24dcb476e62b jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <darkrain42@pidgin.im>
parents: 29849
diff changeset
970 jabber_stream_restart_inactivity_timer(conn->bosh->js);
28065
f9b9e38c98f4 jabber: Better inactivity timer logic.
Paul Aurich <darkrain42@pidgin.im>
parents: 28064
diff changeset
971
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
972 data = g_strdup_printf("POST %s HTTP/1.1\r\n"
24883
c283f8737645 Jabber BOSH: Store less for each Request/Response
Paul Aurich <darkrain42@pidgin.im>
parents: 24875
diff changeset
973 "Host: %s\r\n"
c283f8737645 Jabber BOSH: Store less for each Request/Response
Paul Aurich <darkrain42@pidgin.im>
parents: 24875
diff changeset
974 "User-Agent: %s\r\n"
c283f8737645 Jabber BOSH: Store less for each Request/Response
Paul Aurich <darkrain42@pidgin.im>
parents: 24875
diff changeset
975 "Content-Encoding: text/xml; charset=utf-8\r\n"
26082
7e3952f2713d Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <darkrain42@pidgin.im>
parents: 26081
diff changeset
976 "Content-Length: %" G_GSIZE_FORMAT "\r\n\r\n"
7e3952f2713d Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <darkrain42@pidgin.im>
parents: 26081
diff changeset
977 "%s",
26078
3526ac955ce3 Rename a few functions and drop some data members.
Paul Aurich <darkrain42@pidgin.im>
parents: 26076
diff changeset
978 conn->bosh->path, conn->bosh->host, bosh_useragent,
26082
7e3952f2713d Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <darkrain42@pidgin.im>
parents: 26081
diff changeset
979 req->len, req->str);
25483
38e11b5dd1cf BOSH: Fix the HTTP Post to include the actual payload.
Paul Aurich <darkrain42@pidgin.im>
parents: 24886
diff changeset
980
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
981 len = strlen(data);
24883
c283f8737645 Jabber BOSH: Store less for each Request/Response
Paul Aurich <darkrain42@pidgin.im>
parents: 24875
diff changeset
982
25488
acdb4dbab299 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <darkrain42@pidgin.im>
parents: 25487
diff changeset
983 ++conn->requests;
26076
1755f871f1d1 Restore BOSH to a more-or-less working state.
Paul Aurich <darkrain42@pidgin.im>
parents: 25489
diff changeset
984 ++conn->bosh->requests;
24883
c283f8737645 Jabber BOSH: Store less for each Request/Response
Paul Aurich <darkrain42@pidgin.im>
parents: 24875
diff changeset
985
28066
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
986 if (purple_debug_is_unsafe() && purple_debug_is_verbose())
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
987 /* Will contain passwords for SASL PLAIN and is verbose */
31347
ae5f84d20061 jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <darkrain42@pidgin.im>
parents: 30626
diff changeset
988 purple_debug_misc("jabber", "BOSH (%p): Sending %s\n", conn, data);
ae5f84d20061 jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <darkrain42@pidgin.im>
parents: 30626
diff changeset
989 else if (purple_debug_is_verbose())
ae5f84d20061 jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <darkrain42@pidgin.im>
parents: 30626
diff changeset
990 purple_debug_misc("jabber", "BOSH (%p): Sending request of "
ae5f84d20061 jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <darkrain42@pidgin.im>
parents: 30626
diff changeset
991 "%" G_GSIZE_FORMAT "bytes.", conn, len);
28066
6e27a78baf3d jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <darkrain42@pidgin.im>
parents: 28065
diff changeset
992
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
993 if (conn->writeh == 0)
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
994 ret = http_connection_do_send(conn, data, len);
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
995 else {
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
996 ret = -1;
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
997 errno = EAGAIN;
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
998 }
24883
c283f8737645 Jabber BOSH: Store less for each Request/Response
Paul Aurich <darkrain42@pidgin.im>
parents: 24875
diff changeset
999
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
1000 if (ret < 0 && errno != EAGAIN) {
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
1001 /*
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
1002 * TODO: Handle this better. Probably requires a PurpleBOSHConnection
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
1003 * buffer that stores what is "being sent" until the
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
1004 * PurpleHTTPConnection reports it is fully sent.
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
1005 */
27635
0cd19038c417 More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents: 27398
diff changeset
1006 gchar *tmp = g_strdup_printf(_("Lost connection with server: %s"),
0cd19038c417 More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents: 27398
diff changeset
1007 g_strerror(errno));
25489
9c591341d172 Store PurpleBOSHConnection* instead of void* userdata
Paul Aurich <darkrain42@pidgin.im>
parents: 25488
diff changeset
1008 purple_connection_error_reason(conn->bosh->js->gc,
24883
c283f8737645 Jabber BOSH: Store less for each Request/Response
Paul Aurich <darkrain42@pidgin.im>
parents: 24875
diff changeset
1009 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
27635
0cd19038c417 More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents: 27398
diff changeset
1010 tmp);
0cd19038c417 More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents: 27398
diff changeset
1011 g_free(tmp);
24883
c283f8737645 Jabber BOSH: Store less for each Request/Response
Paul Aurich <darkrain42@pidgin.im>
parents: 24875
diff changeset
1012 return;
26673
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
1013 } else if (ret < len) {
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
1014 if (ret < 0)
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
1015 ret = 0;
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
1016 if (conn->writeh == 0)
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
1017 conn->writeh = purple_input_add(conn->psc ? conn->psc->fd : conn->fd,
f632d4de4bce BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <darkrain42@pidgin.im>
parents: 26672
diff changeset
1018 PURPLE_INPUT_WRITE, http_connection_send_cb, conn);
28062
f743d255c355 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <darkrain42@pidgin.im>
parents: 27811
diff changeset
1019 purple_circ_buffer_append(conn->write_buf, data + ret, len - ret);
24883
c283f8737645 Jabber BOSH: Store less for each Request/Response
Paul Aurich <darkrain42@pidgin.im>
parents: 24875
diff changeset
1020 }
23613
1da7c5cbcc54 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23612
diff changeset
1021 }
1da7c5cbcc54 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 23612
diff changeset
1022

mercurial