annotate libpurple/protocols/jabber/bosh.c @ 32797:aacfb71133cc

Fix a possible MSN remote crash Incoming messages with certain characters or character encodings can cause clients to crash. The fix is for the contents of all incoming plaintext messages are converted to UTF-8 and validated before used. This was reported to us by Fabian Yamaguchi and this patch was written by Elliott Sales de Andrade (maybe with small, insignificant changes by me)
author Mark Doliner <mark@kingant.net>
date Mon, 07 May 2012 03:18:08 +0000
parents b1a6535f99d9
children a5b556ac1de5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25038
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
1 /*
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
2 * purple - Jabber Protocol Plugin
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
3 *
28048
c585572e80dd Remove specific copyright lines from the XMPP prpl.
Paul Aurich <paul@darkrain42.org>
parents: 27802
diff changeset
4 * Purple is the legal property of its developers, whose names are too numerous
c585572e80dd Remove specific copyright lines from the XMPP prpl.
Paul Aurich <paul@darkrain42.org>
parents: 27802
diff changeset
5 * to list here. Please refer to the COPYRIGHT file distributed with this
c585572e80dd Remove specific copyright lines from the XMPP prpl.
Paul Aurich <paul@darkrain42.org>
parents: 27802
diff changeset
6 * source distribution.
25038
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
7 *
7768cad83127 * 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
7768cad83127 * 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
7768cad83127 * 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
7768cad83127 * 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.
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
12 *
7768cad83127 * 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,
7768cad83127 * 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
7768cad83127 * 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
7768cad83127 * 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.
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
17 *
7768cad83127 * 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
7768cad83127 * 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
7768cad83127 * 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
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
21 *
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
22 */
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
23 #include "internal.h"
25997
c605e5f2fc99 Use a PurpleCircBuffer for the queued stanzas
Paul Aurich <paul@darkrain42.org>
parents: 25996
diff changeset
24 #include "circbuffer.h"
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
25 #include "core.h"
25038
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
26 #include "cipher.h"
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
27 #include "debug.h"
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
28 #include "prpl.h"
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
29 #include "util.h"
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
30 #include "xmlnode.h"
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
31
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
32 #include "bosh.h"
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
33
27802
20f13609ca7a jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <paul@darkrain42.org>
parents: 27795
diff changeset
34 /* The number of HTTP connections to use. This MUST be at least 2. */
20f13609ca7a jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <paul@darkrain42.org>
parents: 27795
diff changeset
35 #define NUM_HTTP_CONNECTIONS 2
20f13609ca7a jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <paul@darkrain42.org>
parents: 27795
diff changeset
36 /* How many failed connection attempts before it becomes a fatal error */
26273
79ca1cf55d9d Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <paul@darkrain42.org>
parents: 26272
diff changeset
37 #define MAX_FAILED_CONNECTIONS 3
27802
20f13609ca7a jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <paul@darkrain42.org>
parents: 27795
diff changeset
38 /* How long in seconds to queue up outgoing messages */
27795
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
39 #define BUFFER_SEND_IN_SECS 1
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
40
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
41 typedef struct _PurpleHTTPConnection PurpleHTTPConnection;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
42
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
43 typedef void (*PurpleBOSHConnectionConnectFunction)(PurpleBOSHConnection *conn);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
44 typedef void (*PurpleBOSHConnectionReceiveFunction)(PurpleBOSHConnection *conn, xmlnode *node);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
45
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
46 static char *bosh_useragent = NULL;
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
47
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
48 typedef enum {
27795
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
49 PACKET_NORMAL,
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
50 PACKET_TERMINATE,
27795
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
51 PACKET_FLUSH,
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
52 } PurpleBOSHPacketType;
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
53
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
54 struct _PurpleBOSHConnection {
25996
349e411da2ce Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <paul@darkrain42.org>
parents: 25995
diff changeset
55 JabberStream *js;
27802
20f13609ca7a jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <paul@darkrain42.org>
parents: 27795
diff changeset
56 PurpleHTTPConnection *connections[NUM_HTTP_CONNECTIONS];
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
57
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
58 PurpleCircBuffer *pending;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
59 PurpleBOSHConnectionConnectFunction connect_cb;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
60 PurpleBOSHConnectionReceiveFunction receive_cb;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
61
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
62 /* Must be big enough to hold 2^53 - 1 */
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
63 char *sid;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
64 guint64 rid;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
65
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
66 /* decoded URL */
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
67 char *host;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
68 char *path;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
69 guint16 port;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
70
25996
349e411da2ce Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <paul@darkrain42.org>
parents: 25995
diff changeset
71 gboolean pipelining;
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
72 gboolean ssl;
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
73
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
74 enum {
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
75 BOSH_CONN_OFFLINE,
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
76 BOSH_CONN_BOOTING,
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
77 BOSH_CONN_ONLINE
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
78 } state;
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
79 guint8 failed_connections;
25996
349e411da2ce Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <paul@darkrain42.org>
parents: 25995
diff changeset
80
349e411da2ce Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <paul@darkrain42.org>
parents: 25995
diff changeset
81 int wait;
349e411da2ce Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <paul@darkrain42.org>
parents: 25995
diff changeset
82
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
83 int max_requests;
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
84 int requests;
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
85
27795
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
86 guint send_timer;
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
87 };
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
88
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
89 struct _PurpleHTTPConnection {
25996
349e411da2ce Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <paul@darkrain42.org>
parents: 25995
diff changeset
90 PurpleBOSHConnection *bosh;
25998
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
91 PurpleSslConnection *psc;
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
92
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
93 PurpleCircBuffer *write_buf;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
94 GString *read_buf;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
95
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
96 gsize handled_len;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
97 gsize body_len;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
98
25996
349e411da2ce Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <paul@darkrain42.org>
parents: 25995
diff changeset
99 int fd;
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
100 guint readh;
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
101 guint writeh;
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
102
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
103 enum {
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
104 HTTP_CONN_OFFLINE,
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
105 HTTP_CONN_CONNECTING,
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
106 HTTP_CONN_CONNECTED
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
107 } state;
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
108 int requests; /* number of outstanding HTTP requests */
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
109
25996
349e411da2ce Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <paul@darkrain42.org>
parents: 25995
diff changeset
110 gboolean headers_done;
31135
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
111 gboolean close;
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
112 };
25038
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
113
31134
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
114 static void
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
115 debug_dump_http_connections(PurpleBOSHConnection *conn)
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
116 {
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
117 int i;
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
118
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
119 g_return_if_fail(conn != NULL);
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
120
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
121 for (i = 0; i < NUM_HTTP_CONNECTIONS; ++i) {
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
122 PurpleHTTPConnection *httpconn = conn->connections[i];
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
123 if (httpconn == NULL)
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
124 purple_debug_misc("jabber", "BOSH %p->connections[%d] = (nil)\n",
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
125 conn, i);
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
126 else
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
127 purple_debug_misc("jabber", "BOSH %p->connections[%d] = %p, state = %d"
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
128 ", requests = %d\n", conn, i, httpconn,
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
129 httpconn->state, httpconn->requests);
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
130 }
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
131 }
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
132
25991
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
133 static void http_connection_connect(PurpleHTTPConnection *conn);
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
134 static void http_connection_send_request(PurpleHTTPConnection *conn,
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
135 const GString *req);
27795
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
136 static gboolean send_timer_cb(gpointer data);
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
137
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
138 void jabber_bosh_init(void)
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
139 {
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
140 GHashTable *ui_info = purple_core_get_ui_info();
25668
8c58f31f41eb The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <paul@darkrain42.org>
parents: 25667
diff changeset
141 const char *ui_name = NULL;
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
142 const char *ui_version = NULL;
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
143
25668
8c58f31f41eb The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <paul@darkrain42.org>
parents: 25667
diff changeset
144 if (ui_info) {
8c58f31f41eb The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <paul@darkrain42.org>
parents: 25667
diff changeset
145 ui_name = g_hash_table_lookup(ui_info, "name");
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
146 ui_version = g_hash_table_lookup(ui_info, "version");
25668
8c58f31f41eb The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <paul@darkrain42.org>
parents: 25667
diff changeset
147 }
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
148
25668
8c58f31f41eb The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <paul@darkrain42.org>
parents: 25667
diff changeset
149 if (ui_name)
8c58f31f41eb The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <paul@darkrain42.org>
parents: 25667
diff changeset
150 bosh_useragent = g_strdup_printf("%s%s%s (libpurple " VERSION ")",
8c58f31f41eb The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <paul@darkrain42.org>
parents: 25667
diff changeset
151 ui_name, ui_version ? " " : "",
8c58f31f41eb The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <paul@darkrain42.org>
parents: 25667
diff changeset
152 ui_version ? ui_version : "");
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
153 else
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
154 bosh_useragent = g_strdup("libpurple " VERSION);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
155 }
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
156
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
157 void jabber_bosh_uninit(void)
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
158 {
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
159 g_free(bosh_useragent);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
160 bosh_useragent = NULL;
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
161 }
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
162
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
163 static PurpleHTTPConnection*
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
164 jabber_bosh_http_connection_init(PurpleBOSHConnection *bosh)
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
165 {
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
166 PurpleHTTPConnection *conn = g_new0(PurpleHTTPConnection, 1);
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
167 conn->bosh = bosh;
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
168 conn->fd = -1;
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
169 conn->state = HTTP_CONN_OFFLINE;
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
170
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
171 conn->write_buf = purple_circ_buffer_new(0 /* default grow size */);
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
172
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
173 return conn;
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
174 }
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
175
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
176 static void
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
177 jabber_bosh_http_connection_destroy(PurpleHTTPConnection *conn)
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
178 {
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
179 if (conn->read_buf)
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
180 g_string_free(conn->read_buf, TRUE);
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
181
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
182 if (conn->write_buf)
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
183 purple_circ_buffer_destroy(conn->write_buf);
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
184 if (conn->readh)
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
185 purple_input_remove(conn->readh);
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
186 if (conn->writeh)
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
187 purple_input_remove(conn->writeh);
25998
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
188 if (conn->psc)
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
189 purple_ssl_close(conn->psc);
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
190 if (conn->fd >= 0)
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
191 close(conn->fd);
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
192
25992
c3c2e8b64539 Close a small race with disconnecting while establishing a connection and
Paul Aurich <paul@darkrain42.org>
parents: 25991
diff changeset
193 purple_proxy_connect_cancel_with_handle(conn);
c3c2e8b64539 Close a small race with disconnecting while establishing a connection and
Paul Aurich <paul@darkrain42.org>
parents: 25991
diff changeset
194
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
195 g_free(conn);
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
196 }
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
197
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
198 PurpleBOSHConnection*
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
199 jabber_bosh_connection_init(JabberStream *js, const char *url)
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
200 {
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
201 PurpleBOSHConnection *conn;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
202 char *host, *path, *user, *passwd;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
203 int port;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
204
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
205 if (!purple_url_parse(url, &host, &port, &path, &user, &passwd)) {
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
206 purple_debug_info("jabber", "Unable to parse given URL.\n");
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
207 return NULL;
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
208 }
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
209
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
210 conn = g_new0(PurpleBOSHConnection, 1);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
211 conn->host = host;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
212 conn->port = port;
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
213 conn->path = g_strdup_printf("/%s", path);
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
214 g_free(path);
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
215 conn->pipelining = TRUE;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
216
30253
22afdd5a9290 jabber: Set js->serverFQDN when connecting via BOSH. Fixes #12289
Paul Aurich <paul@darkrain42.org>
parents: 29772
diff changeset
217 if (purple_ip_address_is_valid(host))
22afdd5a9290 jabber: Set js->serverFQDN when connecting via BOSH. Fixes #12289
Paul Aurich <paul@darkrain42.org>
parents: 29772
diff changeset
218 js->serverFQDN = g_strdup(js->user->domain);
22afdd5a9290 jabber: Set js->serverFQDN when connecting via BOSH. Fixes #12289
Paul Aurich <paul@darkrain42.org>
parents: 29772
diff changeset
219 else
22afdd5a9290 jabber: Set js->serverFQDN when connecting via BOSH. Fixes #12289
Paul Aurich <paul@darkrain42.org>
parents: 29772
diff changeset
220 js->serverFQDN = g_strdup(host);
22afdd5a9290 jabber: Set js->serverFQDN when connecting via BOSH. Fixes #12289
Paul Aurich <paul@darkrain42.org>
parents: 29772
diff changeset
221
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
222 if ((user && user[0] != '\0') || (passwd && passwd[0] != '\0')) {
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
223 purple_debug_info("jabber", "Ignoring unexpected username and password "
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
224 "in BOSH URL.\n");
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
225 }
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
226
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
227 g_free(user);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
228 g_free(passwd);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
229
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
230 conn->js = js;
26461
43cfca2eab64 A better random number for the rid in the range [0, 2**52).
Paul Aurich <paul@darkrain42.org>
parents: 26452
diff changeset
231
43cfca2eab64 A better random number for the rid in the range [0, 2**52).
Paul Aurich <paul@darkrain42.org>
parents: 26452
diff changeset
232 /*
43cfca2eab64 A better random number for the rid in the range [0, 2**52).
Paul Aurich <paul@darkrain42.org>
parents: 26452
diff changeset
233 * Random 64-bit integer masked off by 2^52 - 1.
43cfca2eab64 A better random number for the rid in the range [0, 2**52).
Paul Aurich <paul@darkrain42.org>
parents: 26452
diff changeset
234 *
43cfca2eab64 A better random number for the rid in the range [0, 2**52).
Paul Aurich <paul@darkrain42.org>
parents: 26452
diff changeset
235 * This should produce a random integer in the range [0, 2^52). It's
43cfca2eab64 A better random number for the rid in the range [0, 2**52).
Paul Aurich <paul@darkrain42.org>
parents: 26452
diff changeset
236 * unlikely we'll send enough packets in one session to overflow the rid.
43cfca2eab64 A better random number for the rid in the range [0, 2**52).
Paul Aurich <paul@darkrain42.org>
parents: 26452
diff changeset
237 */
43cfca2eab64 A better random number for the rid in the range [0, 2**52).
Paul Aurich <paul@darkrain42.org>
parents: 26452
diff changeset
238 conn->rid = ((guint64)g_random_int() << 32) | g_random_int();
26744
45271de9c65d Windows compilation complains (probably because it's 32-bit)
Paul Aurich <paul@darkrain42.org>
parents: 26462
diff changeset
239 conn->rid &= 0xFFFFFFFFFFFFFLL;
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
240
25997
c605e5f2fc99 Use a PurpleCircBuffer for the queued stanzas
Paul Aurich <paul@darkrain42.org>
parents: 25996
diff changeset
241 conn->pending = purple_circ_buffer_new(0 /* default grow size */);
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
242
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
243 conn->state = BOSH_CONN_OFFLINE;
25998
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
244 if (purple_strcasestr(url, "https://") != NULL)
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
245 conn->ssl = TRUE;
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
246 else
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
247 conn->ssl = FALSE;
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
248
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
249 conn->connections[0] = jabber_bosh_http_connection_init(conn);
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
250
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
251 return conn;
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
252 }
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
253
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
254 void
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
255 jabber_bosh_connection_destroy(PurpleBOSHConnection *conn)
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
256 {
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
257 int i;
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
258
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
259 g_free(conn->host);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
260 g_free(conn->path);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
261
27795
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
262 if (conn->send_timer)
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
263 purple_timeout_remove(conn->send_timer);
25995
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
264
25997
c605e5f2fc99 Use a PurpleCircBuffer for the queued stanzas
Paul Aurich <paul@darkrain42.org>
parents: 25996
diff changeset
265 purple_circ_buffer_destroy(conn->pending);
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
266
27802
20f13609ca7a jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <paul@darkrain42.org>
parents: 27795
diff changeset
267 for (i = 0; i < NUM_HTTP_CONNECTIONS; ++i) {
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
268 if (conn->connections[i])
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
269 jabber_bosh_http_connection_destroy(conn->connections[i]);
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
270 }
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
271
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
272 g_free(conn);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
273 }
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
274
26272
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
275 gboolean jabber_bosh_connection_is_ssl(PurpleBOSHConnection *conn)
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
276 {
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
277 return conn->ssl;
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
278 }
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
279
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
280 static PurpleHTTPConnection *
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
281 find_available_http_connection(PurpleBOSHConnection *conn)
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
282 {
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
283 int i;
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
284
31134
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
285 if (purple_debug_is_verbose())
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
286 debug_dump_http_connections(conn);
27789
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
287
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
288 /* Easy solution: Does everyone involved support pipelining? Hooray! Just use
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
289 * one TCP connection! */
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
290 if (conn->pipelining)
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
291 return conn->connections[0]->state == HTTP_CONN_CONNECTED ?
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
292 conn->connections[0] : NULL;
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
293
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
294 /* First loop, look for a connection that's ready */
27802
20f13609ca7a jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <paul@darkrain42.org>
parents: 27795
diff changeset
295 for (i = 0; i < NUM_HTTP_CONNECTIONS; ++i) {
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
296 if (conn->connections[i] &&
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
297 conn->connections[i]->state == HTTP_CONN_CONNECTED &&
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
298 conn->connections[i]->requests == 0)
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
299 return conn->connections[i];
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
300 }
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
301
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
302 /* Second loop, is something currently connecting? If so, just queue up. */
27802
20f13609ca7a jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <paul@darkrain42.org>
parents: 27795
diff changeset
303 for (i = 0; i < NUM_HTTP_CONNECTIONS; ++i) {
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
304 if (conn->connections[i] &&
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
305 conn->connections[i]->state == HTTP_CONN_CONNECTING)
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
306 return NULL;
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
307 }
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
308
31144
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
309 /* Third loop, is something offline that we can connect? */
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
310 for (i = 0; i < NUM_HTTP_CONNECTIONS; ++i) {
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
311 if (conn->connections[i] &&
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
312 conn->connections[i]->state == HTTP_CONN_OFFLINE) {
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
313 purple_debug_info("jabber", "bosh: Reconnecting httpconn "
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
314 "(%i, %p)\n", i, conn->connections[i]);
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
315 http_connection_connect(conn->connections[i]);
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
316 return NULL;
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
317 }
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
318 }
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
319
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
320 /* Fourth loop, look for one that's NULL and create a new connection */
27802
20f13609ca7a jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <paul@darkrain42.org>
parents: 27795
diff changeset
321 for (i = 0; i < NUM_HTTP_CONNECTIONS; ++i) {
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
322 if (!conn->connections[i]) {
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
323 conn->connections[i] = jabber_bosh_http_connection_init(conn);
31132
b7e2cddaac7a jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <paul@darkrain42.org>
parents: 30413
diff changeset
324 purple_debug_info("jabber", "bosh: Creating and connecting new httpconn "
b7e2cddaac7a jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <paul@darkrain42.org>
parents: 30413
diff changeset
325 "(%i, %p)\n", i, conn->connections[i]);
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
326
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
327 http_connection_connect(conn->connections[i]);
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
328 return NULL;
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
329 }
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
330 }
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
331
27789
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
332 purple_debug_warning("jabber", "Could not find a HTTP connection!\n");
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
333
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
334 /* None available. */
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
335 return NULL;
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
336 }
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
337
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
338 static void
27174
708f92703a13 Don't try to write when the BOSH connection isn't ready.
Paul Aurich <paul@darkrain42.org>
parents: 26932
diff changeset
339 jabber_bosh_connection_send(PurpleBOSHConnection *conn,
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
340 const PurpleBOSHPacketType type, const char *data)
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
341 {
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
342 PurpleHTTPConnection *chosen;
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
343 GString *packet = NULL;
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
344
27795
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
345 if (type != PACKET_FLUSH && type != PACKET_TERMINATE) {
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
346 /*
27795
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
347 * Unless this is a flush (or session terminate, which needs to be
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
348 * sent immediately), queue up the data and start a timer to flush
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
349 * the buffer.
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
350 */
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
351 if (data) {
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
352 int len = data ? strlen(data) : 0;
26932
a8537bbcfb79 Remove trailing whitespace that has snuck in.
Paul Aurich <paul@darkrain42.org>
parents: 26931
diff changeset
353 purple_circ_buffer_append(conn->pending, data, len);
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
354 }
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
355
27789
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
356 if (purple_debug_is_verbose())
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
357 purple_debug_misc("jabber", "bosh: %p has %" G_GSIZE_FORMAT " bytes in "
27795
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
358 "the buffer.\n", conn, conn->pending->bufused);
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
359 if (conn->send_timer == 0)
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
360 conn->send_timer = purple_timeout_add_seconds(BUFFER_SEND_IN_SECS,
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
361 send_timer_cb, conn);
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
362 return;
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
363 }
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
364
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
365 chosen = find_available_http_connection(conn);
27789
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
366
27795
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
367 if (!chosen) {
31175
928335d6461b jabber: bosh: Hopefully a final corrective fix. Refs #13008
Paul Aurich <paul@darkrain42.org>
parents: 31144
diff changeset
368 if (type == PACKET_FLUSH)
928335d6461b jabber: bosh: Hopefully a final corrective fix. Refs #13008
Paul Aurich <paul@darkrain42.org>
parents: 31144
diff changeset
369 return;
27795
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
370 /*
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
371 * For non-ordinary traffic, we can't 'buffer' it, so use the
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
372 * first connection.
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
373 */
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
374 chosen = conn->connections[0];
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
375
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
376 if (chosen->state != HTTP_CONN_CONNECTED) {
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
377 purple_debug_warning("jabber", "Unable to find a ready BOSH "
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
378 "connection. Ignoring send of type 0x%02x.\n", type);
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
379 return;
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
380 }
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
381 }
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
382
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
383 /* We're flushing the send buffer, so remove the send timer */
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
384 if (conn->send_timer != 0) {
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
385 purple_timeout_remove(conn->send_timer);
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
386 conn->send_timer = 0;
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
387 }
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
388
26929
f82f3dc29f9b Don't try to process BOSH packet if there's no data (avoid a purple_strcasestr assertion).
Paul Aurich <paul@darkrain42.org>
parents: 26744
diff changeset
389 packet = g_string_new(NULL);
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
390
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
391 g_string_printf(packet, "<body "
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
392 "rid='%" G_GUINT64_FORMAT "' "
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
393 "sid='%s' "
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
394 "to='%s' "
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
395 "xml:lang='en' "
28664
931d6906291b jabber: Here's a good reason for the namespace defines. Fix a typo 'urn:xmpp:bosh'.
Paul Aurich <paul@darkrain42.org>
parents: 28303
diff changeset
396 "xmlns='" NS_BOSH "' "
931d6906291b jabber: Here's a good reason for the namespace defines. Fix a typo 'urn:xmpp:bosh'.
Paul Aurich <paul@darkrain42.org>
parents: 28303
diff changeset
397 "xmlns:xmpp='" NS_XMPP_BOSH "'",
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
398 ++conn->rid,
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
399 conn->sid,
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
400 conn->js->user->domain);
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
401
28096
b357216b7b79 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
402 if (conn->js->reinit) {
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
403 packet = g_string_append(packet, " xmpp:restart='true'/>");
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
404 /* TODO: Do we need to wait for a response? */
28096
b357216b7b79 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
405 conn->js->reinit = FALSE;
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
406 } else {
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
407 gsize read_amt;
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
408 if (type == PACKET_TERMINATE)
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
409 packet = g_string_append(packet, " type='terminate'");
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
410
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
411 packet = g_string_append_c(packet, '>');
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
412
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
413 while ((read_amt = purple_circ_buffer_get_max_read(conn->pending)) > 0) {
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
414 packet = g_string_append_len(packet, conn->pending->outptr, read_amt);
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
415 purple_circ_buffer_mark_read(conn->pending, read_amt);
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
416 }
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
417
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
418 if (data)
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
419 packet = g_string_append(packet, data);
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
420 packet = g_string_append(packet, "</body>");
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
421 }
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
422
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
423 http_connection_send_request(chosen, packet);
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
424 }
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
425
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
426 void jabber_bosh_connection_close(PurpleBOSHConnection *conn)
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
427 {
28303
9206aabf0251 jabber: Don't crash when disconnecting if there's been no response from the server.
Paul Aurich <paul@darkrain42.org>
parents: 28096
diff changeset
428 if (conn->state == BOSH_CONN_ONLINE)
9206aabf0251 jabber: Don't crash when disconnecting if there's been no response from the server.
Paul Aurich <paul@darkrain42.org>
parents: 28096
diff changeset
429 jabber_bosh_connection_send(conn, PACKET_TERMINATE, NULL);
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
430 }
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
431
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
432 static gboolean jabber_bosh_connection_error_check(PurpleBOSHConnection *conn, xmlnode *node) {
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
433 const char *type;
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
434
25054
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
435 type = xmlnode_get_attrib(node, "type");
26932
a8537bbcfb79 Remove trailing whitespace that has snuck in.
Paul Aurich <paul@darkrain42.org>
parents: 26931
diff changeset
436
25054
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
437 if (type != NULL && !strcmp(type, "terminate")) {
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
438 conn->state = BOSH_CONN_OFFLINE;
27381
f541583e31bd More uniformity among disconnect error messages
Mark Doliner <mark@kingant.net>
parents: 27174
diff changeset
439 purple_connection_error_reason(conn->js->gc,
25055
480736bfcf45 * removing some comment with XML example
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25054
diff changeset
440 PURPLE_CONNECTION_ERROR_OTHER_ERROR,
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
441 _("The BOSH connection manager terminated your session."));
25054
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
442 return TRUE;
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
443 }
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
444 return FALSE;
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
445 }
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
446
25995
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
447 static gboolean
27795
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
448 send_timer_cb(gpointer data)
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
449 {
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
450 PurpleBOSHConnection *bosh;
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
451
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
452 bosh = data;
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
453 bosh->send_timer = 0;
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
454
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
455 jabber_bosh_connection_send(bosh, PACKET_FLUSH, NULL);
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
456
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
457 return FALSE;
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
458 }
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
459
29772
3ac7f10d13d4 jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <paul@darkrain42.org>
parents: 29561
diff changeset
460 void
3ac7f10d13d4 jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <paul@darkrain42.org>
parents: 29561
diff changeset
461 jabber_bosh_connection_send_keepalive(PurpleBOSHConnection *bosh)
25995
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
462 {
27795
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
463 if (bosh->send_timer != 0)
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
464 purple_timeout_remove(bosh->send_timer);
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
465
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
466 /* clears bosh->send_timer */
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
467 send_timer_cb(bosh);
27788
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
468 }
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
469
31135
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
470 static void
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
471 jabber_bosh_disable_pipelining(PurpleBOSHConnection *bosh)
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
472 {
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
473 /* Do nothing if it's already disabled */
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
474 if (!bosh->pipelining)
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
475 return;
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
476
31175
928335d6461b jabber: bosh: Hopefully a final corrective fix. Refs #13008
Paul Aurich <paul@darkrain42.org>
parents: 31144
diff changeset
477 purple_debug_info("jabber", "BOSH: Disabling pipelining on conn %p\n",
928335d6461b jabber: bosh: Hopefully a final corrective fix. Refs #13008
Paul Aurich <paul@darkrain42.org>
parents: 31144
diff changeset
478 bosh);
31135
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
479 bosh->pipelining = FALSE;
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
480 if (bosh->connections[1] == NULL) {
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
481 bosh->connections[1] = jabber_bosh_http_connection_init(bosh);
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
482 http_connection_connect(bosh->connections[1]);
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
483 } else {
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
484 /* Shouldn't happen; this should be the only place pipelining
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
485 * is turned off.
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
486 */
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
487 g_warn_if_reached();
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
488 }
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
489 }
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
490
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
491 static void jabber_bosh_connection_received(PurpleBOSHConnection *conn, xmlnode *node) {
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
492 xmlnode *child;
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
493 JabberStream *js = conn->js;
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
494
25666
7856dccb02fb BOSH: Another g_return_if_fail that is backward
Paul Aurich <paul@darkrain42.org>
parents: 25665
diff changeset
495 g_return_if_fail(node != NULL);
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
496 if (jabber_bosh_connection_error_check(conn, node))
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
497 return;
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
498
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
499 child = node->child;
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
500 while (child != NULL) {
25195
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
501 /* jabber_process_packet might free child */
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
502 xmlnode *next = child->next;
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
503 if (child->type == XMLNODE_TYPE_TAG) {
29017
f521dd7c75b5 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <paul@darkrain42.org>
parents: 28664
diff changeset
504 const char *xmlns = xmlnode_get_namespace(child);
f521dd7c75b5 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <paul@darkrain42.org>
parents: 28664
diff changeset
505 /*
f521dd7c75b5 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <paul@darkrain42.org>
parents: 28664
diff changeset
506 * Workaround for non-compliant servers that don't stamp
f521dd7c75b5 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <paul@darkrain42.org>
parents: 28664
diff changeset
507 * the right xmlns on these packets. See #11315.
f521dd7c75b5 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <paul@darkrain42.org>
parents: 28664
diff changeset
508 */
f521dd7c75b5 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <paul@darkrain42.org>
parents: 28664
diff changeset
509 if ((xmlns == NULL /* shouldn't happen, but is equally wrong */ ||
f521dd7c75b5 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <paul@darkrain42.org>
parents: 28664
diff changeset
510 g_str_equal(xmlns, NS_BOSH)) &&
f521dd7c75b5 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <paul@darkrain42.org>
parents: 28664
diff changeset
511 (g_str_equal(child->name, "iq") ||
f521dd7c75b5 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <paul@darkrain42.org>
parents: 28664
diff changeset
512 g_str_equal(child->name, "message") ||
f521dd7c75b5 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <paul@darkrain42.org>
parents: 28664
diff changeset
513 g_str_equal(child->name, "presence"))) {
f521dd7c75b5 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <paul@darkrain42.org>
parents: 28664
diff changeset
514 xmlnode_set_namespace(child, NS_XMPP_CLIENT);
f521dd7c75b5 jabber: Handle non-compliant servers that don't put stanzas in the right namespace.
Paul Aurich <paul@darkrain42.org>
parents: 28664
diff changeset
515 }
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
516 jabber_process_packet(js, &child);
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
517 }
25195
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
518
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
519 child = next;
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
520 }
25050
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
521 }
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
522
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
523 static void boot_response_cb(PurpleBOSHConnection *conn, xmlnode *node) {
28096
b357216b7b79 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
524 JabberStream *js = conn->js;
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
525 const char *sid, *version;
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
526 const char *inactivity, *requests;
25194
b78c8ab5de2b Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <paul@darkrain42.org>
parents: 25193
diff changeset
527 xmlnode *packet;
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
528
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
529 g_return_if_fail(node != NULL);
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
530 if (jabber_bosh_connection_error_check(conn, node))
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
531 return;
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
532
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
533 sid = xmlnode_get_attrib(node, "sid");
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
534 version = xmlnode_get_attrib(node, "ver");
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
535
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
536 inactivity = xmlnode_get_attrib(node, "inactivity");
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
537 requests = xmlnode_get_attrib(node, "requests");
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
538
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
539 if (sid) {
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
540 conn->sid = g_strdup(sid);
25049
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
541 } else {
28096
b357216b7b79 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
542 purple_connection_error_reason(js->gc,
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
543 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
544 _("No session ID given"));
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
545 return;
25049
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
546 }
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
547
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
548 if (version) {
29561
618c4165d4f8 jabber: Treat the version properly.
Paul Aurich <paul@darkrain42.org>
parents: 29017
diff changeset
549 const char *dot = strchr(version, '.');
26931
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
550 int major, minor = 0;
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
551
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
552 purple_debug_info("jabber", "BOSH connection manager version %s\n", version);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
553
26931
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
554 major = atoi(version);
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
555 if (dot)
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
556 minor = atoi(dot + 1);
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
557
25194
b78c8ab5de2b Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <paul@darkrain42.org>
parents: 25193
diff changeset
558 if (major != 1 || minor < 6) {
28096
b357216b7b79 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
559 purple_connection_error_reason(js->gc,
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
560 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
561 _("Unsupported version of BOSH protocol"));
25194
b78c8ab5de2b Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <paul@darkrain42.org>
parents: 25193
diff changeset
562 return;
25049
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
563 }
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
564 } else {
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
565 purple_debug_info("jabber", "Missing version in BOSH initiation\n");
25049
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
566 }
25194
b78c8ab5de2b Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <paul@darkrain42.org>
parents: 25193
diff changeset
567
25995
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
568 if (inactivity) {
29772
3ac7f10d13d4 jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <paul@darkrain42.org>
parents: 29561
diff changeset
569 js->max_inactivity = atoi(inactivity);
3ac7f10d13d4 jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <paul@darkrain42.org>
parents: 29561
diff changeset
570 if (js->max_inactivity <= 5) {
25995
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
571 purple_debug_warning("jabber", "Ignoring bogusly small inactivity: %s\n",
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
572 inactivity);
29772
3ac7f10d13d4 jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <paul@darkrain42.org>
parents: 29561
diff changeset
573 /* Leave it at the default */
25995
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
574 } else {
27788
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
575 /* TODO: Can this check fail? It shouldn't */
29772
3ac7f10d13d4 jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <paul@darkrain42.org>
parents: 29561
diff changeset
576 js->max_inactivity -= 5; /* rounding */
3ac7f10d13d4 jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <paul@darkrain42.org>
parents: 29561
diff changeset
577
3ac7f10d13d4 jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <paul@darkrain42.org>
parents: 29561
diff changeset
578 if (js->inactivity_timer == 0) {
27788
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
579 purple_debug_misc("jabber", "Starting BOSH inactivity timer "
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
580 "for %d secs (compensating for rounding)\n",
29772
3ac7f10d13d4 jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <paul@darkrain42.org>
parents: 29561
diff changeset
581 js->max_inactivity);
3ac7f10d13d4 jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <paul@darkrain42.org>
parents: 29561
diff changeset
582 jabber_stream_restart_inactivity_timer(js);
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
583 }
25995
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
584 }
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
585 }
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
586
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
587 if (requests)
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
588 conn->max_requests = atoi(requests);
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
589
28096
b357216b7b79 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
590 jabber_stream_set_state(js, JABBER_STREAM_AUTHENTICATING);
b357216b7b79 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
591
25194
b78c8ab5de2b Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <paul@darkrain42.org>
parents: 25193
diff changeset
592 /* FIXME: Depending on receiving features might break with some hosts */
b78c8ab5de2b Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <paul@darkrain42.org>
parents: 25193
diff changeset
593 packet = xmlnode_get_child(node, "features");
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
594 conn->state = BOSH_CONN_ONLINE;
28096
b357216b7b79 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
595 conn->receive_cb = jabber_bosh_connection_received;
b357216b7b79 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
596 jabber_stream_features_parse(js, packet);
25047
f747c682a0d9 * calling PurpleBOSHConnection's receive_cb
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25046
diff changeset
597 }
f747c682a0d9 * calling PurpleBOSHConnection's receive_cb
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25046
diff changeset
598
25043
15d9825a5621 * adding receive callback; preparing receiving and boot code
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25042
diff changeset
599 static void jabber_bosh_connection_boot(PurpleBOSHConnection *conn) {
26929
f82f3dc29f9b Don't try to process BOSH packet if there's no data (avoid a purple_strcasestr assertion).
Paul Aurich <paul@darkrain42.org>
parents: 26744
diff changeset
600 GString *buf = g_string_new(NULL);
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
601
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
602 g_string_printf(buf, "<body content='text/xml; charset=utf-8' "
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
603 "secure='true' "
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
604 "to='%s' "
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
605 "xml:lang='en' "
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
606 "xmpp:version='1.0' "
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
607 "ver='1.6' "
28664
931d6906291b jabber: Here's a good reason for the namespace defines. Fix a typo 'urn:xmpp:bosh'.
Paul Aurich <paul@darkrain42.org>
parents: 28303
diff changeset
608 "xmlns:xmpp='" NS_XMPP_BOSH "' "
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
609 "rid='%" G_GUINT64_FORMAT "' "
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
610 /* TODO: This should be adjusted/adjustable automatically according to
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
611 * realtime network behavior */
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
612 "wait='60' "
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
613 "hold='1' "
28664
931d6906291b jabber: Here's a good reason for the namespace defines. Fix a typo 'urn:xmpp:bosh'.
Paul Aurich <paul@darkrain42.org>
parents: 28303
diff changeset
614 "xmlns='" NS_BOSH "'/>",
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
615 conn->js->user->domain,
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
616 ++conn->rid);
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
617
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
618 purple_debug_misc("jabber", "SendBOSH Boot %s(%" G_GSIZE_FORMAT "): %s\n",
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
619 conn->ssl ? "(ssl)" : "", buf->len, buf->str);
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
620 conn->receive_cb = boot_response_cb;
25991
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
621 http_connection_send_request(conn->connections[0], buf);
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
622 g_string_free(buf, TRUE);
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
623 }
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
624
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
625 static void
25670
c11c14dde641 Store PurpleBOSHConnection* instead of void* userdata
Paul Aurich <paul@darkrain42.org>
parents: 25669
diff changeset
626 http_received_cb(const char *data, int len, PurpleBOSHConnection *conn)
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
627 {
26273
79ca1cf55d9d Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <paul@darkrain42.org>
parents: 26272
diff changeset
628 if (conn->failed_connections)
79ca1cf55d9d Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <paul@darkrain42.org>
parents: 26272
diff changeset
629 /* We've got some data, so reset the number of failed connections */
79ca1cf55d9d Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <paul@darkrain42.org>
parents: 26272
diff changeset
630 conn->failed_connections = 0;
79ca1cf55d9d Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <paul@darkrain42.org>
parents: 26272
diff changeset
631
25047
f747c682a0d9 * calling PurpleBOSHConnection's receive_cb
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25046
diff changeset
632 if (conn->receive_cb) {
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
633 xmlnode *node = xmlnode_from_str(data, len);
26449
345165fc51b6 BOSH: Print out the received data (similar to the standard XMPP method,
Paul Aurich <paul@darkrain42.org>
parents: 26448
diff changeset
634
345165fc51b6 BOSH: Print out the received data (similar to the standard XMPP method,
Paul Aurich <paul@darkrain42.org>
parents: 26448
diff changeset
635 purple_debug_info("jabber", "RecvBOSH %s(%d): %s\n",
345165fc51b6 BOSH: Print out the received data (similar to the standard XMPP method,
Paul Aurich <paul@darkrain42.org>
parents: 26448
diff changeset
636 conn->ssl ? "(ssl)" : "", len, data);
345165fc51b6 BOSH: Print out the received data (similar to the standard XMPP method,
Paul Aurich <paul@darkrain42.org>
parents: 26448
diff changeset
637
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
638 if (node) {
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
639 conn->receive_cb(conn, node);
25056
94ccccab4e98 * free xmlnodes after bosh receive callback is called
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25055
diff changeset
640 xmlnode_free(node);
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
641 } else {
25667
bf7338765863 BOSH: Fix an off-by-one g_memdup that was missing the null terminator.
Paul Aurich <paul@darkrain42.org>
parents: 25666
diff changeset
642 purple_debug_warning("jabber", "BOSH: Received invalid XML\n");
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
643 }
25667
bf7338765863 BOSH: Fix an off-by-one g_memdup that was missing the null terminator.
Paul Aurich <paul@darkrain42.org>
parents: 25666
diff changeset
644 } else {
bf7338765863 BOSH: Fix an off-by-one g_memdup that was missing the null terminator.
Paul Aurich <paul@darkrain42.org>
parents: 25666
diff changeset
645 g_return_if_reached();
bf7338765863 BOSH: Fix an off-by-one g_memdup that was missing the null terminator.
Paul Aurich <paul@darkrain42.org>
parents: 25666
diff changeset
646 }
25043
15d9825a5621 * adding receive callback; preparing receiving and boot code
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25042
diff changeset
647 }
15d9825a5621 * adding receive callback; preparing receiving and boot code
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25042
diff changeset
648
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
649 void jabber_bosh_connection_send_raw(PurpleBOSHConnection *conn,
26448
d4af753e0e33 Pass all messages to BOSH as text, so they pass through the sending-text
Paul Aurich <paul@darkrain42.org>
parents: 26273
diff changeset
650 const char *data)
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
651 {
26448
d4af753e0e33 Pass all messages to BOSH as text, so they pass through the sending-text
Paul Aurich <paul@darkrain42.org>
parents: 26273
diff changeset
652 jabber_bosh_connection_send(conn, PACKET_NORMAL, data);
25049
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
653 }
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
654
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
655 static void
25998
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
656 connection_common_established_cb(PurpleHTTPConnection *conn)
25991
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
657 {
31134
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
658 purple_debug_misc("jabber", "bosh: httpconn %p re-connected\n", conn);
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
659
25994
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
660 /* Indicate we're ready and reset some variables */
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
661 conn->state = HTTP_CONN_CONNECTED;
27789
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
662 if (conn->requests != 0)
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
663 purple_debug_error("jabber", "bosh: httpconn %p has %d requests, != 0\n",
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
664 conn, conn->requests);
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
665
25994
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
666 conn->requests = 0;
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
667 if (conn->read_buf) {
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
668 g_string_free(conn->read_buf, TRUE);
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
669 conn->read_buf = NULL;
25994
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
670 }
31135
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
671 conn->close = FALSE;
25994
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
672 conn->headers_done = FALSE;
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
673 conn->handled_len = conn->body_len = 0;
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
674
31134
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
675 if (purple_debug_is_verbose())
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
676 debug_dump_http_connections(conn->bosh);
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
677
28096
b357216b7b79 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
678 if (conn->bosh->js->reinit)
b357216b7b79 jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <paul@darkrain42.org>
parents: 28048
diff changeset
679 jabber_bosh_connection_send(conn->bosh, PACKET_NORMAL, NULL);
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
680 else if (conn->bosh->state == BOSH_CONN_ONLINE) {
25052
0a8484372312 * sending empty <body> requests if there are not othere requests to be answered to keep a CM -> client channel open
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25051
diff changeset
681 purple_debug_info("jabber", "BOSH session already exists. Trying to reuse it.\n");
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
682 if (conn->bosh->requests == 0 || conn->bosh->pending->bufused > 0) {
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
683 /* Send the pending data */
27795
3eef8392a54b jabber: Add a BOSH send timer (queue up stanzas), fixes connecting to Prosody
Paul Aurich <paul@darkrain42.org>
parents: 27789
diff changeset
684 jabber_bosh_connection_send(conn->bosh, PACKET_FLUSH, NULL);
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
685 }
25670
c11c14dde641 Store PurpleBOSHConnection* instead of void* userdata
Paul Aurich <paul@darkrain42.org>
parents: 25669
diff changeset
686 } else
c11c14dde641 Store PurpleBOSHConnection* instead of void* userdata
Paul Aurich <paul@darkrain42.org>
parents: 25669
diff changeset
687 jabber_bosh_connection_boot(conn->bosh);
25052
0a8484372312 * sending empty <body> requests if there are not othere requests to be answered to keep a CM -> client channel open
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25051
diff changeset
688 }
0a8484372312 * sending empty <body> requests if there are not othere requests to be answered to keep a CM -> client channel open
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25051
diff changeset
689
25991
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
690 static void http_connection_disconnected(PurpleHTTPConnection *conn)
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
691 {
31144
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
692 gboolean had_requests = FALSE;
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
693 /*
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
694 * Well, then. Fine! I never liked you anyway, server! I was cheating on you
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
695 * with AIM!
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
696 */
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
697 conn->state = HTTP_CONN_OFFLINE;
26272
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
698 if (conn->psc) {
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
699 purple_ssl_close(conn->psc);
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
700 conn->psc = NULL;
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
701 } else if (conn->fd >= 0) {
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
702 close(conn->fd);
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
703 conn->fd = -1;
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
704 }
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
705
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
706 if (conn->readh) {
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
707 purple_input_remove(conn->readh);
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
708 conn->readh = 0;
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
709 }
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
710
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
711 if (conn->writeh) {
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
712 purple_input_remove(conn->writeh);
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
713 conn->writeh = 0;
26272
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
714 }
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
715
31144
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
716 had_requests = (conn->requests > 0);
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
717 if (had_requests && conn->read_buf->len == 0) {
27789
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
718 purple_debug_error("jabber", "bosh: Adjusting BOSHconn requests (%d) to %d\n",
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
719 conn->bosh->requests, conn->bosh->requests - conn->requests);
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
720 conn->bosh->requests -= conn->requests;
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
721 conn->requests = 0;
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
722 }
27802
20f13609ca7a jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <paul@darkrain42.org>
parents: 27795
diff changeset
723
20f13609ca7a jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <paul@darkrain42.org>
parents: 27795
diff changeset
724 if (conn->bosh->pipelining) {
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
725 /* Hmmmm, fall back to multiple connections */
31135
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
726 jabber_bosh_disable_pipelining(conn->bosh);
27802
20f13609ca7a jabber: Keep a second connection open over which to send the terminate.
Paul Aurich <paul@darkrain42.org>
parents: 27795
diff changeset
727 }
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
728
31144
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
729 if (!had_requests)
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
730 /* If the server disconnected us without any requests, let's
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
731 * just wait until we have something to send before we reconnect
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
732 */
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
733 return;
7986f4e5a05f jabber: Be friendlier to servers when we have nothing to say.
Paul Aurich <paul@darkrain42.org>
parents: 31135
diff changeset
734
26273
79ca1cf55d9d Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <paul@darkrain42.org>
parents: 26272
diff changeset
735 if (++conn->bosh->failed_connections == MAX_FAILED_CONNECTIONS) {
79ca1cf55d9d Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <paul@darkrain42.org>
parents: 26272
diff changeset
736 purple_connection_error_reason(conn->bosh->js->gc,
79ca1cf55d9d Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <paul@darkrain42.org>
parents: 26272
diff changeset
737 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
79ca1cf55d9d Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <paul@darkrain42.org>
parents: 26272
diff changeset
738 _("Unable to establish a connection with the server"));
79ca1cf55d9d Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <paul@darkrain42.org>
parents: 26272
diff changeset
739 } else {
79ca1cf55d9d Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <paul@darkrain42.org>
parents: 26272
diff changeset
740 /* No! Please! Take me back. It was me, not you! I was weak! */
79ca1cf55d9d Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <paul@darkrain42.org>
parents: 26272
diff changeset
741 http_connection_connect(conn);
79ca1cf55d9d Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <paul@darkrain42.org>
parents: 26272
diff changeset
742 }
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
743 }
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
744
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
745 void jabber_bosh_connection_connect(PurpleBOSHConnection *bosh) {
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
746 PurpleHTTPConnection *conn = bosh->connections[0];
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
747
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
748 g_return_if_fail(bosh->state == BOSH_CONN_OFFLINE);
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
749 bosh->state = BOSH_CONN_BOOTING;
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
750
25991
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
751 http_connection_connect(conn);
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
752 }
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
753
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
754 static void
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
755 jabber_bosh_http_connection_process(PurpleHTTPConnection *conn)
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
756 {
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
757 const char *cursor;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
758
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
759 cursor = conn->read_buf->str + conn->handled_len;
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
760
31135
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
761 if (purple_debug_is_verbose())
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
762 purple_debug_misc("jabber", "BOSH server sent: %s\n", cursor);
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
763
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
764 /* TODO: Chunked encoding and check response version :/ */
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
765 if (!conn->headers_done) {
31134
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
766 const char *content_length = purple_strcasestr(cursor, "\r\nContent-Length:");
31135
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
767 const char *connection = purple_strcasestr(cursor, "\r\nConnection:");
26931
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
768 const char *end_of_headers = strstr(cursor, "\r\n\r\n");
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
769
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
770 /* Make sure Content-Length is in headers, not body */
26931
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
771 if (content_length && (!end_of_headers || content_length < end_of_headers)) {
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
772 int len;
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
773
31134
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
774 if (strstr(content_length, "\r\n") == NULL)
26931
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
775 /*
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
776 * The packet ends in the middle of the Content-Length line.
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
777 * We'll try again later when we have more.
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
778 */
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
779 return;
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
780
31134
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
781 len = atoi(content_length + strlen("\r\nContent-Length:"));
26932
a8537bbcfb79 Remove trailing whitespace that has snuck in.
Paul Aurich <paul@darkrain42.org>
parents: 26931
diff changeset
782 if (len == 0)
31134
bb91133708fe jabber: Make the BOSH parsing a little more resilient and add more diagnostic output
Paul Aurich <paul@darkrain42.org>
parents: 31133
diff changeset
783 purple_debug_warning("jabber", "Found mangled Content-Length header, or server returned 0-length response.\n");
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
784
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
785 conn->body_len = len;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
786 }
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
787
31135
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
788 if (connection && (!end_of_headers || content_length < end_of_headers)) {
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
789 const char *tmp;
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
790 if (strstr(connection, "\r\n") == NULL)
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
791 return;
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
792
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
793
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
794 tmp = connection + strlen("\r\nConnection:");
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
795 while (*tmp && (*tmp == ' ' || *tmp == '\t'))
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
796 ++tmp;
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
797
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
798 if (!g_ascii_strncasecmp(tmp, "close", strlen("close"))) {
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
799 conn->close = TRUE;
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
800 jabber_bosh_disable_pipelining(conn->bosh);
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
801 }
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
802 }
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
803
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
804 if (end_of_headers) {
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
805 conn->headers_done = TRUE;
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
806 conn->handled_len = end_of_headers - conn->read_buf->str + 4;
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
807 } else {
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
808 conn->handled_len = conn->read_buf->len;
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
809 return;
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
810 }
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
811 }
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
812
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
813 /* Have we handled everything in the buffer? */
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
814 if (conn->handled_len >= conn->read_buf->len)
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
815 return;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
816
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
817 /* Have we read all that the Content-Length promised us? */
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
818 if (conn->read_buf->len - conn->handled_len < conn->body_len)
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
819 return;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
820
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
821 --conn->requests;
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
822 --conn->bosh->requests;
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
823
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
824 http_received_cb(conn->read_buf->str + conn->handled_len, conn->body_len,
25995
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
825 conn->bosh);
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
826
31135
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
827 /* Connection: Close? */
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
828 if (conn->close && conn->state == HTTP_CONN_CONNECTED) {
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
829 if (purple_debug_is_verbose())
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
830 purple_debug_misc("jabber", "bosh (%p), server sent Connection: "
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
831 "close\n", conn);
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
832 http_connection_disconnected(conn);
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
833 }
6826925abd6d jabber: Handle the connection: close header. Closes #13008
Paul Aurich <paul@darkrain42.org>
parents: 31134
diff changeset
834
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
835 if (conn->bosh->state == BOSH_CONN_ONLINE &&
25997
c605e5f2fc99 Use a PurpleCircBuffer for the queued stanzas
Paul Aurich <paul@darkrain42.org>
parents: 25996
diff changeset
836 (conn->bosh->requests == 0 || conn->bosh->pending->bufused > 0)) {
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
837 purple_debug_misc("jabber", "BOSH: Sending an empty request\n");
26448
d4af753e0e33 Pass all messages to BOSH as text, so they pass through the sending-text
Paul Aurich <paul@darkrain42.org>
parents: 26273
diff changeset
838 jabber_bosh_connection_send(conn->bosh, PACKET_NORMAL, NULL);
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
839 }
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
840
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
841 g_string_free(conn->read_buf, TRUE);
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
842 conn->read_buf = NULL;
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
843 conn->headers_done = FALSE;
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
844 conn->handled_len = conn->body_len = 0;
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
845 }
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
846
25998
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
847 /*
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
848 * Common code for reading, called from http_connection_read_cb_ssl and
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
849 * http_connection_read_cb.
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
850 */
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
851 static void
25998
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
852 http_connection_read(PurpleHTTPConnection *conn)
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
853 {
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
854 char buffer[1025];
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
855 int cnt, count = 0;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
856
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
857 if (!conn->read_buf)
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
858 conn->read_buf = g_string_new(NULL);
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
859
26931
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
860 do {
25998
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
861 if (conn->psc)
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
862 cnt = purple_ssl_read(conn->psc, buffer, sizeof(buffer));
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
863 else
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
864 cnt = read(conn->fd, buffer, sizeof(buffer));
26931
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
865
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
866 if (cnt > 0) {
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
867 count += cnt;
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
868 g_string_append_len(conn->read_buf, buffer, cnt);
26931
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
869 }
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
870 } while (cnt > 0);
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
871
25994
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
872 if (cnt == 0 || (cnt < 0 && errno != EAGAIN)) {
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
873 if (cnt < 0)
31132
b7e2cddaac7a jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <paul@darkrain42.org>
parents: 30413
diff changeset
874 purple_debug_info("jabber", "BOSH (%p) read=%d, errno=%d, error=%s\n",
b7e2cddaac7a jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <paul@darkrain42.org>
parents: 30413
diff changeset
875 conn, cnt, errno, g_strerror(errno));
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
876 else
31132
b7e2cddaac7a jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <paul@darkrain42.org>
parents: 30413
diff changeset
877 purple_debug_info("jabber", "BOSH server closed the connection (%p)\n",
b7e2cddaac7a jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <paul@darkrain42.org>
parents: 30413
diff changeset
878 conn);
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
879
25994
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
880 /*
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
881 * If the socket is closed, the processing really needs to know about
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
882 * it. Handle that now.
25994
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
883 */
25991
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
884 http_connection_disconnected(conn);
25994
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
885
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
886 /* Process what we do have */
25045
24b97b8359ff * preparing handling of multiple requests for pipelining support
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25044
diff changeset
887 }
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
888
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
889 if (conn->read_buf->len > 0)
26929
f82f3dc29f9b Don't try to process BOSH packet if there's no data (avoid a purple_strcasestr assertion).
Paul Aurich <paul@darkrain42.org>
parents: 26744
diff changeset
890 jabber_bosh_http_connection_process(conn);
25043
15d9825a5621 * adding receive callback; preparing receiving and boot code
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25042
diff changeset
891 }
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
892
25998
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
893 static void
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
894 http_connection_read_cb(gpointer data, gint fd, PurpleInputCondition condition)
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
895 {
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
896 PurpleHTTPConnection *conn = data;
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
897
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
898 http_connection_read(conn);
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
899 }
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
900
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
901 static void
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
902 http_connection_read_cb_ssl(gpointer data, PurpleSslConnection *psc,
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
903 PurpleInputCondition cond)
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
904 {
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
905 PurpleHTTPConnection *conn = data;
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
906
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
907 http_connection_read(conn);
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
908 }
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
909
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
910 static void
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
911 ssl_connection_established_cb(gpointer data, PurpleSslConnection *psc,
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
912 PurpleInputCondition cond)
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
913 {
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
914 PurpleHTTPConnection *conn = data;
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
915
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
916 purple_ssl_input_add(psc, http_connection_read_cb_ssl, conn);
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
917 connection_common_established_cb(conn);
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
918 }
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
919
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
920 static void
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
921 ssl_connection_error_cb(PurpleSslConnection *gsc, PurpleSslErrorType error,
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
922 gpointer data)
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
923 {
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
924 PurpleHTTPConnection *conn = data;
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
925
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
926 /* sslconn frees the connection on error */
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
927 conn->psc = NULL;
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
928
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
929 purple_connection_ssl_error(conn->bosh->js->gc, error);
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
930 }
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
931
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
932 static void
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
933 connection_established_cb(gpointer data, gint source, const gchar *error)
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
934 {
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
935 PurpleHTTPConnection *conn = data;
25670
c11c14dde641 Store PurpleBOSHConnection* instead of void* userdata
Paul Aurich <paul@darkrain42.org>
parents: 25669
diff changeset
936 PurpleConnection *gc = conn->bosh->js->gc;
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
937
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
938 if (source < 0) {
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
939 gchar *tmp;
27381
f541583e31bd More uniformity among disconnect error messages
Mark Doliner <mark@kingant.net>
parents: 27174
diff changeset
940 tmp = g_strdup_printf(_("Unable to establish a connection with the server: %s"),
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
941 error);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
942 purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
943 g_free(tmp);
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
944 return;
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
945 }
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
946
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
947 conn->fd = source;
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
948 conn->readh = purple_input_add(conn->fd, PURPLE_INPUT_READ,
25998
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
949 http_connection_read_cb, conn);
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
950 connection_common_established_cb(conn);
25040
b238da95f39a * some refactoring
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25038
diff changeset
951 }
b238da95f39a * some refactoring
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25038
diff changeset
952
25991
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
953 static void http_connection_connect(PurpleHTTPConnection *conn)
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
954 {
25991
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
955 PurpleBOSHConnection *bosh = conn->bosh;
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
956 PurpleConnection *gc = bosh->js->gc;
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
957 PurpleAccount *account = purple_connection_get_account(gc);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
958
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
959 conn->state = HTTP_CONN_CONNECTING;
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
960
25998
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
961 if (bosh->ssl) {
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
962 if (purple_ssl_is_supported()) {
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
963 conn->psc = purple_ssl_connect(account, bosh->host, bosh->port,
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
964 ssl_connection_established_cb,
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
965 ssl_connection_error_cb,
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
966 conn);
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
967 if (!conn->psc) {
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
968 purple_connection_error_reason(gc,
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
969 PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT,
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
970 _("Unable to establish SSL connection"));
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
971 }
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
972 } else {
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
973 purple_connection_error_reason(gc,
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
974 PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT,
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
975 _("SSL support unavailable"));
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
976 }
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
977 } else if (purple_proxy_connect(conn, account, bosh->host, bosh->port,
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
978 connection_established_cb, conn) == NULL) {
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
979 purple_connection_error_reason(gc,
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
980 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
27381
f541583e31bd More uniformity among disconnect error messages
Mark Doliner <mark@kingant.net>
parents: 27174
diff changeset
981 _("Unable to connect"));
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
982 }
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
983 }
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
984
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
985 static int
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
986 http_connection_do_send(PurpleHTTPConnection *conn, const char *data, int len)
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
987 {
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
988 int ret;
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
989
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
990 if (conn->psc)
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
991 ret = purple_ssl_write(conn->psc, data, len);
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
992 else
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
993 ret = write(conn->fd, data, len);
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
994
31132
b7e2cddaac7a jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <paul@darkrain42.org>
parents: 30413
diff changeset
995 if (purple_debug_is_verbose())
b7e2cddaac7a jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <paul@darkrain42.org>
parents: 30413
diff changeset
996 purple_debug_misc("jabber", "BOSH (%p): wrote %d bytes\n", conn, ret);
b7e2cddaac7a jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <paul@darkrain42.org>
parents: 30413
diff changeset
997
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
998 return ret;
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
999 }
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1000
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1001 static void
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1002 http_connection_send_cb(gpointer data, gint source, PurpleInputCondition cond)
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1003 {
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1004 PurpleHTTPConnection *conn = data;
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1005 int ret;
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
1006 int writelen = purple_circ_buffer_get_max_read(conn->write_buf);
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1007
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1008 if (writelen == 0) {
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1009 purple_input_remove(conn->writeh);
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1010 conn->writeh = 0;
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1011 return;
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1012 }
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1013
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
1014 ret = http_connection_do_send(conn, conn->write_buf->outptr, writelen);
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1015
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1016 if (ret < 0 && errno == EAGAIN)
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1017 return;
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1018 else if (ret <= 0) {
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1019 /*
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1020 * TODO: Handle this better. Probably requires a PurpleBOSHConnection
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1021 * buffer that stores what is "being sent" until the
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1022 * PurpleHTTPConnection reports it is fully sent.
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1023 */
27381
f541583e31bd More uniformity among disconnect error messages
Mark Doliner <mark@kingant.net>
parents: 27174
diff changeset
1024 gchar *tmp = g_strdup_printf(_("Lost connection with server: %s"),
f541583e31bd More uniformity among disconnect error messages
Mark Doliner <mark@kingant.net>
parents: 27174
diff changeset
1025 g_strerror(errno));
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1026 purple_connection_error_reason(conn->bosh->js->gc,
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1027 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
27381
f541583e31bd More uniformity among disconnect error messages
Mark Doliner <mark@kingant.net>
parents: 27174
diff changeset
1028 tmp);
f541583e31bd More uniformity among disconnect error messages
Mark Doliner <mark@kingant.net>
parents: 27174
diff changeset
1029 g_free(tmp);
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1030 return;
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1031 }
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1032
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
1033 purple_circ_buffer_mark_read(conn->write_buf, ret);
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1034 }
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1035
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
1036 static void
25991
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
1037 http_connection_send_request(PurpleHTTPConnection *conn, const GString *req)
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
1038 {
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1039 char *data;
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
1040 int ret;
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1041 size_t len;
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
1042
27788
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
1043 /* Sending something to the server, restart the inactivity timer */
29772
3ac7f10d13d4 jabber: Send whitespace keepalives every two minutes of (outgoing) silence.
Paul Aurich <paul@darkrain42.org>
parents: 29561
diff changeset
1044 jabber_stream_restart_inactivity_timer(conn->bosh->js);
27788
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
1045
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1046 data = g_strdup_printf("POST %s HTTP/1.1\r\n"
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
1047 "Host: %s\r\n"
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
1048 "User-Agent: %s\r\n"
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
1049 "Content-Encoding: text/xml; charset=utf-8\r\n"
25995
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
1050 "Content-Length: %" G_GSIZE_FORMAT "\r\n\r\n"
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
1051 "%s",
25991
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
1052 conn->bosh->path, conn->bosh->host, bosh_useragent,
25995
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
1053 req->len, req->str);
25664
26259ee81c5b BOSH: Fix the HTTP Post to include the actual payload.
Paul Aurich <paul@darkrain42.org>
parents: 25195
diff changeset
1054
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1055 len = strlen(data);
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
1056
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
1057 ++conn->requests;
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
1058 ++conn->bosh->requests;
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
1059
27789
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
1060 if (purple_debug_is_unsafe() && purple_debug_is_verbose())
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
1061 /* Will contain passwords for SASL PLAIN and is verbose */
31132
b7e2cddaac7a jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <paul@darkrain42.org>
parents: 30413
diff changeset
1062 purple_debug_misc("jabber", "BOSH (%p): Sending %s\n", conn, data);
b7e2cddaac7a jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <paul@darkrain42.org>
parents: 30413
diff changeset
1063 else if (purple_debug_is_verbose())
b7e2cddaac7a jabber: Improved BOSH logging some. Refs #13008
Paul Aurich <paul@darkrain42.org>
parents: 30413
diff changeset
1064 purple_debug_misc("jabber", "BOSH (%p): Sending request of "
31133
dbd0012e72cb jabber: \n-ize a debug message
Paul Aurich <paul@darkrain42.org>
parents: 31132
diff changeset
1065 "%" G_GSIZE_FORMAT " bytes.\n", conn, len);
27789
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
1066
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1067 if (conn->writeh == 0)
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1068 ret = http_connection_do_send(conn, data, len);
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1069 else {
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1070 ret = -1;
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1071 errno = EAGAIN;
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1072 }
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
1073
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1074 if (ret < 0 && errno != EAGAIN) {
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1075 /*
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1076 * TODO: Handle this better. Probably requires a PurpleBOSHConnection
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1077 * buffer that stores what is "being sent" until the
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1078 * PurpleHTTPConnection reports it is fully sent.
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1079 */
27381
f541583e31bd More uniformity among disconnect error messages
Mark Doliner <mark@kingant.net>
parents: 27174
diff changeset
1080 gchar *tmp = g_strdup_printf(_("Lost connection with server: %s"),
f541583e31bd More uniformity among disconnect error messages
Mark Doliner <mark@kingant.net>
parents: 27174
diff changeset
1081 g_strerror(errno));
25670
c11c14dde641 Store PurpleBOSHConnection* instead of void* userdata
Paul Aurich <paul@darkrain42.org>
parents: 25669
diff changeset
1082 purple_connection_error_reason(conn->bosh->js->gc,
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
1083 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
27381
f541583e31bd More uniformity among disconnect error messages
Mark Doliner <mark@kingant.net>
parents: 27174
diff changeset
1084 tmp);
f541583e31bd More uniformity among disconnect error messages
Mark Doliner <mark@kingant.net>
parents: 27174
diff changeset
1085 g_free(tmp);
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
1086 return;
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1087 } else if (ret < len) {
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1088 if (ret < 0)
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1089 ret = 0;
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1090 if (conn->writeh == 0)
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1091 conn->writeh = purple_input_add(conn->psc ? conn->psc->fd : conn->fd,
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1092 PURPLE_INPUT_WRITE, http_connection_send_cb, conn);
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
1093 purple_circ_buffer_append(conn->write_buf, data + ret, len - ret);
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
1094 }
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
1095 }
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
1096