Mercurial > pidgin
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 |
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 | 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 | 554 major = atoi(version); |
555 if (dot) | |
556 minor = atoi(dot + 1); | |
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 | 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 | 771 if (content_length && (!end_of_headers || content_length < end_of_headers)) { |
772 int len; | |
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 | 775 /* |
776 * The packet ends in the middle of the Content-Length line. | |
777 * We'll try again later when we have more. | |
778 */ | |
779 return; | |
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 | 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 | 865 |
866 if (cnt > 0) { | |
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 | 869 } |
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 | 951 } |
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 |