annotate libpurple/protocols/jabber/bosh.c @ 27789:1ff7de15d856

jabber: Ridiculously verbose logging for BOSH.
author Paul Aurich <paul@darkrain42.org>
date Sat, 01 Aug 2009 04:32:24 +0000
parents 46e80810b095
children 3eef8392a54b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25038
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
1 /*
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
2 * purple - Jabber Protocol Plugin
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
3 *
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
4 * Copyright (C) 2008, Tobias Markmann <tmarkmann@googlemail.com>
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
5 *
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
6 * This program is free software; you can redistribute it and/or modify
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
7 * it under the terms of the GNU General Public License as published by
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
9 * (at your option) any later version.
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
10 *
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
11 * This program is distributed in the hope that it will be useful,
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
14 * GNU General Public License for more details.
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
15 *
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
17 * along with this program; if not, write to the Free Software
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
19 *
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
20 */
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
21 #include "internal.h"
25997
c605e5f2fc99 Use a PurpleCircBuffer for the queued stanzas
Paul Aurich <paul@darkrain42.org>
parents: 25996
diff changeset
22 #include "circbuffer.h"
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
23 #include "core.h"
25038
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
24 #include "cipher.h"
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
25 #include "debug.h"
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
26 #include "prpl.h"
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
27 #include "util.h"
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
28 #include "xmlnode.h"
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
29
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
30 #include "bosh.h"
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
31
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
32 #define MAX_HTTP_CONNECTIONS 2
26273
79ca1cf55d9d Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <paul@darkrain42.org>
parents: 26272
diff changeset
33 #define MAX_FAILED_CONNECTIONS 3
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
34
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
35 typedef struct _PurpleHTTPConnection PurpleHTTPConnection;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
36
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
37 typedef void (*PurpleBOSHConnectionConnectFunction)(PurpleBOSHConnection *conn);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
38 typedef void (*PurpleBOSHConnectionReceiveFunction)(PurpleBOSHConnection *conn, xmlnode *node);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
39
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
40 static char *bosh_useragent = NULL;
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
41
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
42 typedef enum {
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
43 PACKET_TERMINATE,
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
44 PACKET_STREAM_RESTART,
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
45 PACKET_NORMAL,
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
46 } PurpleBOSHPacketType;
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
47
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
48 struct _PurpleBOSHConnection {
25996
349e411da2ce Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <paul@darkrain42.org>
parents: 25995
diff changeset
49 JabberStream *js;
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
50 PurpleHTTPConnection *connections[MAX_HTTP_CONNECTIONS];
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
51
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
52 PurpleCircBuffer *pending;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
53 PurpleBOSHConnectionConnectFunction connect_cb;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
54 PurpleBOSHConnectionReceiveFunction receive_cb;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
55
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
56 /* 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
57 char *sid;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
58 guint64 rid;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
59
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
60 /* decoded URL */
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
61 char *host;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
62 char *path;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
63 guint16 port;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
64
25996
349e411da2ce Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <paul@darkrain42.org>
parents: 25995
diff changeset
65 gboolean pipelining;
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
66 gboolean ssl;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
67 gboolean needs_restart;
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
68
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
69 enum {
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
70 BOSH_CONN_OFFLINE,
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
71 BOSH_CONN_BOOTING,
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
72 BOSH_CONN_ONLINE
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
73 } state;
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
74 guint8 failed_connections;
25996
349e411da2ce Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <paul@darkrain42.org>
parents: 25995
diff changeset
75
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
76 int max_inactivity;
25996
349e411da2ce Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <paul@darkrain42.org>
parents: 25995
diff changeset
77 int wait;
349e411da2ce Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <paul@darkrain42.org>
parents: 25995
diff changeset
78
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
79 int max_requests;
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
80 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
81
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
82 guint inactivity_timer;
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
83 };
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
84
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
85 struct _PurpleHTTPConnection {
25996
349e411da2ce Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <paul@darkrain42.org>
parents: 25995
diff changeset
86 PurpleBOSHConnection *bosh;
25998
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
87 PurpleSslConnection *psc;
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
88
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
89 PurpleCircBuffer *write_buf;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
90 GString *read_buf;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
91
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
92 gsize handled_len;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
93 gsize body_len;
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
94
25996
349e411da2ce Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <paul@darkrain42.org>
parents: 25995
diff changeset
95 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
96 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
97 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
98
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
99 enum {
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
100 HTTP_CONN_OFFLINE,
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
101 HTTP_CONN_CONNECTING,
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
102 HTTP_CONN_CONNECTED
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
103 } state;
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
104 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
105
25996
349e411da2ce Rearrange the structs and fix the indentation. No functional changes.
Paul Aurich <paul@darkrain42.org>
parents: 25995
diff changeset
106 gboolean headers_done;
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
107
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
108 };
25038
7768cad83127 * looking for alternative connection methods if direct connection fails
Tobias Markmann <tfar@soc.pidgin.im>
parents:
diff changeset
109
25991
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
110 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
111 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
112 const GString *req);
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
113
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
114 void jabber_bosh_init(void)
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
115 {
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
116 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
117 const char *ui_name = NULL;
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
118 const char *ui_version = NULL;
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
119
25668
8c58f31f41eb The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <paul@darkrain42.org>
parents: 25667
diff changeset
120 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
121 ui_name = g_hash_table_lookup(ui_info, "name");
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
122 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
123 }
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
124
25668
8c58f31f41eb The BOSH User Agent should include the client name (and optionally version),
Paul Aurich <paul@darkrain42.org>
parents: 25667
diff changeset
125 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
126 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
127 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
128 ui_version ? ui_version : "");
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
129 else
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
130 bosh_useragent = g_strdup("libpurple " VERSION);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
131 }
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
132
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
133 void jabber_bosh_uninit(void)
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
134 {
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
135 g_free(bosh_useragent);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
136 bosh_useragent = NULL;
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
137 }
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
138
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
139 static PurpleHTTPConnection*
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
140 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
141 {
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
142 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
143 conn->bosh = bosh;
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
144 conn->fd = -1;
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
145 conn->state = HTTP_CONN_OFFLINE;
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
146
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
147 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
148
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
149 return conn;
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
150 }
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
151
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
152 static void
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
153 jabber_bosh_http_connection_destroy(PurpleHTTPConnection *conn)
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
154 {
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
155 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
156 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
157
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
158 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
159 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
160 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
161 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
162 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
163 purple_input_remove(conn->writeh);
25998
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
164 if (conn->psc)
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
165 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
166 if (conn->fd >= 0)
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
167 close(conn->fd);
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
168
25992
c3c2e8b64539 Close a small race with disconnecting while establishing a connection and
Paul Aurich <paul@darkrain42.org>
parents: 25991
diff changeset
169 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
170
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
171 g_free(conn);
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
172 }
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
173
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
174 PurpleBOSHConnection*
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
175 jabber_bosh_connection_init(JabberStream *js, const char *url)
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
176 {
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
177 PurpleBOSHConnection *conn;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
178 char *host, *path, *user, *passwd;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
179 int port;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
180
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
181 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
182 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
183 return NULL;
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
184 }
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
185
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
186 conn = g_new0(PurpleBOSHConnection, 1);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
187 conn->host = host;
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
188 conn->port = port;
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
189 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
190 g_free(path);
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
191 conn->pipelining = TRUE;
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
192 conn->needs_restart = FALSE;
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
193
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
194 if ((user && user[0] != '\0') || (passwd && passwd[0] != '\0')) {
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
195 purple_debug_info("jabber", "Ignoring unexpected username and password "
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
196 "in BOSH URL.\n");
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
197 }
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
198
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
199 g_free(user);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
200 g_free(passwd);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
201
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
202 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
203
43cfca2eab64 A better random number for the rid in the range [0, 2**52).
Paul Aurich <paul@darkrain42.org>
parents: 26452
diff changeset
204 /*
43cfca2eab64 A better random number for the rid in the range [0, 2**52).
Paul Aurich <paul@darkrain42.org>
parents: 26452
diff changeset
205 * 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
206 *
43cfca2eab64 A better random number for the rid in the range [0, 2**52).
Paul Aurich <paul@darkrain42.org>
parents: 26452
diff changeset
207 * 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
208 * 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
209 */
43cfca2eab64 A better random number for the rid in the range [0, 2**52).
Paul Aurich <paul@darkrain42.org>
parents: 26452
diff changeset
210 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
211 conn->rid &= 0xFFFFFFFFFFFFFLL;
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
212
25997
c605e5f2fc99 Use a PurpleCircBuffer for the queued stanzas
Paul Aurich <paul@darkrain42.org>
parents: 25996
diff changeset
213 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
214
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
215 conn->state = BOSH_CONN_OFFLINE;
25998
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
216 if (purple_strcasestr(url, "https://") != NULL)
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
217 conn->ssl = TRUE;
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
218 else
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
219 conn->ssl = FALSE;
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
220
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
221 conn->connections[0] = jabber_bosh_http_connection_init(conn);
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
222
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
223 return conn;
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
224 }
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
225
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
226 void
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
227 jabber_bosh_connection_destroy(PurpleBOSHConnection *conn)
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
228 {
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
229 int i;
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
230
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
231 g_free(conn->host);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
232 g_free(conn->path);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
233
25995
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
234 if (conn->inactivity_timer)
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
235 purple_timeout_remove(conn->inactivity_timer);
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
236
25997
c605e5f2fc99 Use a PurpleCircBuffer for the queued stanzas
Paul Aurich <paul@darkrain42.org>
parents: 25996
diff changeset
237 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
238
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
239 for (i = 0; i < MAX_HTTP_CONNECTIONS; ++i) {
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
240 if (conn->connections[i])
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
241 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
242 }
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
243
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
244 g_free(conn);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
245 }
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
246
26272
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
247 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
248 {
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
249 return conn->ssl;
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
250 }
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
251
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
252 static PurpleHTTPConnection *
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
253 find_available_http_connection(PurpleBOSHConnection *conn)
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
254 {
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
255 int i;
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
256
27789
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
257 if (purple_debug_is_verbose()) {
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
258 for (i = 0; i < MAX_HTTP_CONNECTIONS; ++i) {
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
259 PurpleHTTPConnection *httpconn = conn->connections[i];
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
260 if (httpconn == NULL)
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
261 purple_debug_misc("jabber", "BOSH %p->connections[%d] = (nil)\n",
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
262 conn, i);
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
263 else
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
264 purple_debug_misc("jabber", "BOSH %p->connections[%d] = %p, state = %d"
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
265 ", requests = %d\n", conn, i, httpconn,
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
266 httpconn->state, httpconn->requests);
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
267 }
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
268 }
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
269
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
270 /* 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
271 * one TCP connection! */
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
272 if (conn->pipelining)
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
273 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
274 conn->connections[0] : NULL;
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
275
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
276 /* First loop, look for a connection that's ready */
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
277 for (i = 0; i < MAX_HTTP_CONNECTIONS; ++i) {
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
278 if (conn->connections[i] &&
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
279 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
280 conn->connections[i]->requests == 0)
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
281 return conn->connections[i];
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
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
284 /* Second loop, is something currently connecting? If so, just queue up. */
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
285 for (i = 0; i < MAX_HTTP_CONNECTIONS; ++i) {
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
286 if (conn->connections[i] &&
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
287 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
288 return NULL;
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
289 }
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
290
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
291 /* Third loop, look for one that's NULL and create a new connection */
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
292 for (i = 0; i < MAX_HTTP_CONNECTIONS; ++i) {
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
293 if (!conn->connections[i]) {
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
294 purple_debug_info("jabber", "bosh: Creating and connecting new httpconn\n");
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
295 conn->connections[i] = jabber_bosh_http_connection_init(conn);
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
296
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
297 http_connection_connect(conn->connections[i]);
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
298 return NULL;
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
299 }
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
27789
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
302 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
303
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
304 /* None available. */
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
305 return NULL;
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
306 }
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
307
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
308 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
309 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
310 const PurpleBOSHPacketType type, const char *data)
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
311 {
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
312 PurpleHTTPConnection *chosen;
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
313 GString *packet = NULL;
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
314
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
315 chosen = find_available_http_connection(conn);
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
316
27789
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
317 if ((type != PACKET_NORMAL) && !chosen) {
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
318 /*
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
319 * For non-ordinary traffic, we can't 'buffer' it, so use the
27174
708f92703a13 Don't try to write when the BOSH connection isn't ready.
Paul Aurich <paul@darkrain42.org>
parents: 26932
diff changeset
320 * first connection.
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
321 */
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
322 chosen = conn->connections[0];
26932
a8537bbcfb79 Remove trailing whitespace that has snuck in.
Paul Aurich <paul@darkrain42.org>
parents: 26931
diff changeset
323
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
324 if (chosen->state != HTTP_CONN_CONNECTED) {
27174
708f92703a13 Don't try to write when the BOSH connection isn't ready.
Paul Aurich <paul@darkrain42.org>
parents: 26932
diff changeset
325 purple_debug_info("jabber", "Unable to find a ready BOSH "
708f92703a13 Don't try to write when the BOSH connection isn't ready.
Paul Aurich <paul@darkrain42.org>
parents: 26932
diff changeset
326 "connection. Ignoring send of type 0x%02x.\n", type);
708f92703a13 Don't try to write when the BOSH connection isn't ready.
Paul Aurich <paul@darkrain42.org>
parents: 26932
diff changeset
327 return;
708f92703a13 Don't try to write when the BOSH connection isn't ready.
Paul Aurich <paul@darkrain42.org>
parents: 26932
diff changeset
328 }
26452
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
27789
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
331 if (type == PACKET_NORMAL) {
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
332 if (conn->max_requests > 0 && conn->requests == conn->max_requests) {
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
333 purple_debug_warning("jabber", "BOSH connection %p has %d requests out\n", conn, conn->requests);
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
334 } else if (!chosen) {
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
335 purple_debug_warning("jabber", "No BOSH connection found!\n");
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
336 }
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
337 }
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
338
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
339 if (type == PACKET_NORMAL && (!chosen ||
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
340 (conn->max_requests > 0 && conn->requests == conn->max_requests))) {
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 * For normal data, send up to max_requests requests at a time or there is no
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
343 * connection ready (likely, we're currently opening a second connection and
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
344 * will send these packets when connected).
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
345 */
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
346 if (data) {
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
347 int len = data ? strlen(data) : 0;
26932
a8537bbcfb79 Remove trailing whitespace that has snuck in.
Paul Aurich <paul@darkrain42.org>
parents: 26931
diff changeset
348 purple_circ_buffer_append(conn->pending, data, len);
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
349 }
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
350
27789
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
351 if (purple_debug_is_verbose())
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
352 purple_debug_misc("jabber", "bosh: %p has %" G_GSIZE_FORMAT " bytes in "
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
353 "the buffer.\n", conn, conn->pending->buflen);
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
354
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
355 return;
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
356 }
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
357
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
358 packet = g_string_new(NULL);
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
359
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
360 g_string_printf(packet, "<body "
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
361 "rid='%" G_GUINT64_FORMAT "' "
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
362 "sid='%s' "
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
363 "to='%s' "
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
364 "xml:lang='en' "
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
365 "xmlns='http://jabber.org/protocol/httpbind' "
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
366 "xmlns:xmpp='urn:xmpp:xbosh'",
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
367 ++conn->rid,
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
368 conn->sid,
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
369 conn->js->user->domain);
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
370
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
371 if (type == PACKET_STREAM_RESTART) {
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
372 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
373 /* TODO: Do we need to wait for a response? */
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
374 conn->needs_restart = FALSE;
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
375 } else {
26452
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
376 gsize read_amt;
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
377 if (type == PACKET_TERMINATE)
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
378 packet = g_string_append(packet, " type='terminate'");
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
379
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
380 packet = g_string_append_c(packet, '>');
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
381
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
382 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
383 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
384 purple_circ_buffer_mark_read(conn->pending, read_amt);
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
385 }
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
386
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
387 if (data)
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
388 packet = g_string_append(packet, data);
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
389 packet = g_string_append(packet, "</body>");
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
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
392 http_connection_send_request(chosen, packet);
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
393 }
5172ebcc8673 Reorder functions to remove prototypes
Paul Aurich <paul@darkrain42.org>
parents: 26449
diff changeset
394
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
395 void jabber_bosh_connection_close(PurpleBOSHConnection *conn)
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
396 {
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
397 jabber_bosh_connection_send(conn, PACKET_TERMINATE, NULL);
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
398 }
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
399
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
400 static void jabber_bosh_connection_stream_restart(PurpleBOSHConnection *conn)
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
401 {
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
402 conn->needs_restart = TRUE;
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
403 jabber_bosh_connection_send(conn, PACKET_STREAM_RESTART, NULL);
25050
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
404 }
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
405
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
406 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
407 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
408
25054
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
409 type = xmlnode_get_attrib(node, "type");
26932
a8537bbcfb79 Remove trailing whitespace that has snuck in.
Paul Aurich <paul@darkrain42.org>
parents: 26931
diff changeset
410
25054
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
411 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
412 conn->state = BOSH_CONN_OFFLINE;
27381
f541583e31bd More uniformity among disconnect error messages
Mark Doliner <mark@kingant.net>
parents: 27174
diff changeset
413 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
414 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
415 _("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
416 return TRUE;
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
417 }
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
418 return FALSE;
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
419 }
8badac6cc7c9 * fixing a bug in jabber_bosh_http_connection_receive_parse_header()
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25052
diff changeset
420
25995
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
421 static gboolean
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
422 bosh_inactivity_cb(gpointer data)
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
423 {
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
424 PurpleBOSHConnection *bosh = data;
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
425
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
426 jabber_bosh_connection_send(bosh, PACKET_NORMAL, NULL);
25995
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
427 return TRUE;
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
428 }
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
429
27788
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
430 static void
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
431 restart_inactivity_timer(PurpleBOSHConnection *conn)
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
432 {
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
433 if (conn->inactivity_timer != 0) {
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
434 purple_timeout_remove(conn->inactivity_timer);
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
435 conn->inactivity_timer = 0;
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
436 }
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
437
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
438 if (conn->max_inactivity != 0) {
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
439 conn->inactivity_timer =
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
440 purple_timeout_add_seconds(conn->max_inactivity - 5 /* rounding */,
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
441 bosh_inactivity_cb, conn);
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
442 }
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
443 }
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
444
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
445 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
446 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
447 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
448
25666
7856dccb02fb BOSH: Another g_return_if_fail that is backward
Paul Aurich <paul@darkrain42.org>
parents: 25665
diff changeset
449 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
450 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
451 return;
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
452
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
453 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
454 while (child != NULL) {
25195
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
455 /* jabber_process_packet might free child */
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
456 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
457 if (child->type == XMLNODE_TYPE_TAG) {
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
458 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
459 }
25195
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
460
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
461 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
462 }
25050
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
463 }
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
464
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
465 static void auth_response_cb(PurpleBOSHConnection *conn, xmlnode *node) {
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
466 xmlnode *child;
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
467
25195
4e624cc0c4a5 Jabber BOSH: memory management fixes
Paul Aurich <paul@darkrain42.org>
parents: 25194
diff changeset
468 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
469 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
470 return;
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
471
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
472 child = node->child;
25050
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
473 while(child != NULL && child->type != XMLNODE_TYPE_TAG) {
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
474 child = child->next;
25050
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
475 }
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
476
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
477 /* We're only expecting one XML node here, so only process the first one */
25050
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
478 if (child != NULL && child->type == XMLNODE_TYPE_TAG) {
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
479 JabberStream *js = conn->js;
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
480 if (!strcmp(child->name, "success")) {
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
481 jabber_bosh_connection_stream_restart(conn);
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
482 jabber_process_packet(js, &child);
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
483 conn->receive_cb = jabber_bosh_connection_received;
25050
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
484 } else {
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
485 js->state = JABBER_STREAM_AUTHENTICATING;
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
486 jabber_process_packet(js, &child);
a03a953ba63d * moving BOSH interfacing from jabber_send to jabber_send_raw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25049
diff changeset
487 }
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
488 } else {
26932
a8537bbcfb79 Remove trailing whitespace that has snuck in.
Paul Aurich <paul@darkrain42.org>
parents: 26931
diff changeset
489 purple_debug_warning("jabber", "Received unexepcted empty BOSH packet.\n");
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
490 }
25049
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
491 }
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
492
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
493 static void boot_response_cb(PurpleBOSHConnection *conn, xmlnode *node) {
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
494 const char *sid, *version;
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
495 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
496 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
497
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
498 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
499 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
500 return;
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
501
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
502 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
503 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
504
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
505 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
506 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
507
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
508 if (sid) {
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
509 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
510 } else {
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
511 purple_connection_error_reason(conn->js->gc,
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
512 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
513 _("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
514 return;
25049
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
515 }
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
516
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
517 if (version) {
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
518 const char *dot = strstr(version, ".");
26931
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
519 int major, minor = 0;
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
520
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
521 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
522
26931
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
523 major = atoi(version);
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
524 if (dot)
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
525 minor = atoi(dot + 1);
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
526
25194
b78c8ab5de2b Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <paul@darkrain42.org>
parents: 25193
diff changeset
527 if (major != 1 || minor < 6) {
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
528 purple_connection_error_reason(conn->js->gc,
25184
1ce32c6752fc Make the Request ID a long long (fit in 2^53-1)
Paul Aurich <paul@darkrain42.org>
parents: 25183
diff changeset
529 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
530 _("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
531 return;
25049
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
532 }
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
533 } else {
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
534 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
535 }
25194
b78c8ab5de2b Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <paul@darkrain42.org>
parents: 25193
diff changeset
536
25995
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
537 if (inactivity) {
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
538 conn->max_inactivity = atoi(inactivity);
27786
0f79a7b6e856 jabber: Since we use max_inactivity - 5, treat a 5s timeout as bogus, too.
Paul Aurich <paul@darkrain42.org>
parents: 27785
diff changeset
539 if (conn->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
540 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
541 inactivity);
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
542 conn->max_inactivity = 0;
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
543 } else {
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
544 /* TODO: Integrate this with jabber.c keepalive checks... */
27788
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
545 /* TODO: Can this check fail? It shouldn't */
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
546 if (conn->inactivity_timer == 0) {
27788
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
547 purple_debug_misc("jabber", "Starting BOSH inactivity timer "
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
548 "for %d secs (compensating for rounding)\n",
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
549 conn->max_inactivity - 5);
27788
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
550 restart_inactivity_timer(conn);
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
551 }
25995
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
552 }
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
553 }
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
554
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
555 if (requests)
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
556 conn->max_requests = atoi(requests);
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
557
25194
b78c8ab5de2b Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <paul@darkrain42.org>
parents: 25193
diff changeset
558 /* 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
559 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
560 conn->state = BOSH_CONN_ONLINE;
25194
b78c8ab5de2b Jabber BOSH: Try to continue with no BOSH version attribute
Paul Aurich <paul@darkrain42.org>
parents: 25193
diff changeset
561 conn->receive_cb = auth_response_cb;
26932
a8537bbcfb79 Remove trailing whitespace that has snuck in.
Paul Aurich <paul@darkrain42.org>
parents: 26931
diff changeset
562 jabber_stream_features_parse(conn->js, packet);
25047
f747c682a0d9 * calling PurpleBOSHConnection's receive_cb
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25046
diff changeset
563 }
f747c682a0d9 * calling PurpleBOSHConnection's receive_cb
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25046
diff changeset
564
25043
15d9825a5621 * adding receive callback; preparing receiving and boot code
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25042
diff changeset
565 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
566 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
567
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
568 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
569 "secure='true' "
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
570 "to='%s' "
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
571 "xml:lang='en' "
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
572 "xmpp:version='1.0' "
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
573 "ver='1.6' "
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
574 "xmlns:xmpp='urn:xmpp:bosh' "
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
575 "rid='%" G_GUINT64_FORMAT "' "
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
576 /* 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
577 * realtime network behavior */
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
578 "wait='60' "
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
579 "hold='1' "
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
580 "xmlns='http://jabber.org/protocol/httpbind'/>",
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
581 conn->js->user->domain,
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
582 ++conn->rid);
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
583
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
584 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
585 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
586 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
587 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
588 g_string_free(buf, TRUE);
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
589 }
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
590
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
591 static void
25670
c11c14dde641 Store PurpleBOSHConnection* instead of void* userdata
Paul Aurich <paul@darkrain42.org>
parents: 25669
diff changeset
592 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
593 {
26273
79ca1cf55d9d Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <paul@darkrain42.org>
parents: 26272
diff changeset
594 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
595 /* 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
596 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
597
25047
f747c682a0d9 * calling PurpleBOSHConnection's receive_cb
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25046
diff changeset
598 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
599 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
600
345165fc51b6 BOSH: Print out the received data (similar to the standard XMPP method,
Paul Aurich <paul@darkrain42.org>
parents: 26448
diff changeset
601 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
602 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
603
25051
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
604 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
605 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
606 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
607 } 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
608 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
609 }
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
610 } 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
611 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
612 }
25043
15d9825a5621 * adding receive callback; preparing receiving and boot code
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25042
diff changeset
613 }
15d9825a5621 * adding receive callback; preparing receiving and boot code
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25042
diff changeset
614
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
615 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
616 const char *data)
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
617 {
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
618 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
619 }
f775f6021654 * using libpurple's internal SASL mechanisms during BOSH authentication phase
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25048
diff changeset
620
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
621 static void
25998
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
622 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
623 {
25994
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
624 /* 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
625 conn->state = HTTP_CONN_CONNECTED;
27789
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
626 if (conn->requests != 0)
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
627 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
628 conn, conn->requests);
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
629
25994
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
630 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
631 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
632 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
633 conn->read_buf = NULL;
25994
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
634 }
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
635 conn->headers_done = FALSE;
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
636 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
637
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
638 if (conn->bosh->needs_restart)
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
639 jabber_bosh_connection_stream_restart(conn->bosh);
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
640 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
641 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
642 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
643 /* Send the pending data */
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
644 jabber_bosh_connection_send(conn->bosh, PACKET_NORMAL, NULL);
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
645 }
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
646 #if 0
25670
c11c14dde641 Store PurpleBOSHConnection* instead of void* userdata
Paul Aurich <paul@darkrain42.org>
parents: 25669
diff changeset
647 conn->bosh->receive_cb = jabber_bosh_connection_received;
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
648 if (conn->bosh->connect_cb)
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
649 conn->bosh->connect_cb(conn->bosh);
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
650 #endif
25670
c11c14dde641 Store PurpleBOSHConnection* instead of void* userdata
Paul Aurich <paul@darkrain42.org>
parents: 25669
diff changeset
651 } else
c11c14dde641 Store PurpleBOSHConnection* instead of void* userdata
Paul Aurich <paul@darkrain42.org>
parents: 25669
diff changeset
652 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
653 }
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
654
25183
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
655 void jabber_bosh_connection_refresh(PurpleBOSHConnection *conn)
62d9bce9ff74 Reorder some functions to eliminate prototypes and
Paul Aurich <paul@darkrain42.org>
parents: 25182
diff changeset
656 {
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
657 jabber_bosh_connection_send(conn, PACKET_NORMAL, NULL);
25052
0a8484372312 * sending empty <body> requests if there are not othere requests to be answered to keep a CM -> client channel open
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25051
diff changeset
658 }
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
659
25991
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
660 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
661 {
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
662 /*
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
663 * 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
664 * with AIM!
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
665 */
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
666 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
667 if (conn->psc) {
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
668 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
669 conn->psc = NULL;
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
670 } 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
671 close(conn->fd);
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
672 conn->fd = -1;
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
673 }
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
674
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
675 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
676 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
677 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
678 }
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
679
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
680 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
681 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
682 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
683 }
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
684
27789
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
685 if (conn->requests > 0 && conn->read_buf->len == 0) {
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
686 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
687 conn->bosh->requests, conn->bosh->requests - conn->requests);
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
688 conn->bosh->requests -= conn->requests;
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
689 conn->requests = 0;
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
690 }
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
691 if (conn->bosh->pipelining)
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
692 /* Hmmmm, fall back to multiple connections */
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
693 conn->bosh->pipelining = FALSE;
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
694
26273
79ca1cf55d9d Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <paul@darkrain42.org>
parents: 26272
diff changeset
695 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
696 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
697 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
698 _("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
699 } else {
79ca1cf55d9d Because BOSH works over connections that may die non-fatally, we need to
Paul Aurich <paul@darkrain42.org>
parents: 26272
diff changeset
700 /* 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
701 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
702 }
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
703 }
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
704
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
705 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
706 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
707
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
708 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
709 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
710
25991
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
711 http_connection_connect(conn);
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
712 }
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
713
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
714 static void
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
715 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
716 {
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
717 const char *cursor;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
718
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
719 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
720
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
721 if (!conn->headers_done) {
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
722 const char *content_length = purple_strcasestr(cursor, "\r\nContent-Length");
26931
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
723 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
724
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
725 /* Make sure Content-Length is in headers, not body */
26931
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
726 if (content_length && (!end_of_headers || content_length < end_of_headers)) {
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
727 const char *sep;
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
728 const char *eol;
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
729 int len;
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
730
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
731 if ((sep = strstr(content_length, ": ")) == NULL ||
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
732 (eol = strstr(sep, "\r\n")) == NULL)
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
733 /*
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
734 * The packet ends in the middle of the Content-Length line.
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
735 * We'll try again later when we have more.
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
736 */
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
737 return;
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
738
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
739 len = atoi(sep + 2);
26932
a8537bbcfb79 Remove trailing whitespace that has snuck in.
Paul Aurich <paul@darkrain42.org>
parents: 26931
diff changeset
740 if (len == 0)
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
741 purple_debug_warning("jabber", "Found mangled Content-Length header.\n");
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
742
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
743 conn->body_len = len;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
744 }
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
745
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
746 if (end_of_headers) {
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
747 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
748 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
749 cursor = end_of_headers + 4;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
750 } else {
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
751 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
752 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
753 }
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
754 }
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
755
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
756 /* 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
757 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
758 return;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
759
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
760 /* 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
761 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
762 return;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
763
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
764 --conn->requests;
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
765 --conn->bosh->requests;
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
766
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
767 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
768 conn->bosh);
e995540378f0 Obey the 'inactivity' attribute and send blank updates often enough. Also,
Paul Aurich <paul@darkrain42.org>
parents: 25994
diff changeset
769
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
770 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
771 (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
772 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
773 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
774 }
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
775
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
776 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
777 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
778 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
779 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
780 }
5f70e13db5cc * data buffer for received data. Support for any HTTP resonse size now.
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25050
diff changeset
781
25998
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
782 /*
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
783 * 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
784 * http_connection_read_cb.
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
785 */
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
786 static void
25998
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
787 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
788 {
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
789 char buffer[1025];
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
790 int cnt, count = 0;
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
791
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
792 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
793 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
794
26931
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
795 do {
25998
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
796 if (conn->psc)
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
797 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
798 else
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
799 cnt = read(conn->fd, buffer, sizeof(buffer));
26931
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
800
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
801 if (cnt > 0) {
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
802 count += cnt;
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
803 g_string_append_len(conn->read_buf, buffer, cnt);
26931
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
804 }
6105fa42b60c Various BOSH fixes
Paul Aurich <paul@darkrain42.org>
parents: 26929
diff changeset
805 } while (cnt > 0);
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
806
25994
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
807 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
808 if (cnt < 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
809 purple_debug_info("jabber", "bosh read=%d, errno=%d, error=%s\n",
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
810 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
811 else
26272
fcee93c74230 BOSH: For authentication purposes, HTTPS is equivalent to a secured JabberStream.
Paul Aurich <paul@darkrain42.org>
parents: 25998
diff changeset
812 purple_debug_info("jabber", "bosh server closed the connection\n");
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
813
25994
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
814 /*
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
815 * 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
816 * it. Handle that now.
25994
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
817 */
25991
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
818 http_connection_disconnected(conn);
25994
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
819
a94b28023bf6 Clean up BOSH reading and disconnection handling.
Paul Aurich <paul@darkrain42.org>
parents: 25992
diff changeset
820 /* 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
821 }
25193
e7f20c859519 Jabber BOSH: Model the parsing on the SOAP stuff
Paul Aurich <paul@darkrain42.org>
parents: 25192
diff changeset
822
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
823 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
824 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
825 }
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
826
25998
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
827 static void
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
828 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
829 {
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
830 PurpleHTTPConnection *conn = data;
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
831
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
832 http_connection_read(conn);
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
833 }
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
834
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
835 static void
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
836 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
837 PurpleInputCondition cond)
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
838 {
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
839 PurpleHTTPConnection *conn = data;
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
840
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
841 http_connection_read(conn);
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
842 }
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
843
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
844 static void
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
845 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
846 PurpleInputCondition cond)
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 PurpleHTTPConnection *conn = data;
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
849
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
850 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
851 connection_common_established_cb(conn);
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
852 }
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
853
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
854 static void
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
855 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
856 gpointer data)
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
857 {
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
858 PurpleHTTPConnection *conn = data;
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
859
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
860 /* sslconn frees the connection on error */
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
861 conn->psc = NULL;
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
862
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
863 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
864 }
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
865
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
866 static void
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
867 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
868 {
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
869 PurpleHTTPConnection *conn = data;
25670
c11c14dde641 Store PurpleBOSHConnection* instead of void* userdata
Paul Aurich <paul@darkrain42.org>
parents: 25669
diff changeset
870 PurpleConnection *gc = conn->bosh->js->gc;
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
871
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
872 if (source < 0) {
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
873 gchar *tmp;
27381
f541583e31bd More uniformity among disconnect error messages
Mark Doliner <mark@kingant.net>
parents: 27174
diff changeset
874 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
875 error);
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
876 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
877 g_free(tmp);
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
878 return;
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
879 }
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
880
25042
1cbe5a9f6efb * adding bosh files to Makefile.am & .mingw
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25040
diff changeset
881 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
882 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
883 http_connection_read_cb, conn);
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
884 connection_common_established_cb(conn);
25040
b238da95f39a * some refactoring
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25038
diff changeset
885 }
b238da95f39a * some refactoring
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25038
diff changeset
886
25991
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
887 static void http_connection_connect(PurpleHTTPConnection *conn)
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
888 {
25991
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
889 PurpleBOSHConnection *bosh = conn->bosh;
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
890 PurpleConnection *gc = bosh->js->gc;
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
891 PurpleAccount *account = purple_connection_get_account(gc);
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
892
27546
70dcaa0b6fea Various fixes to get BOSH working with Prosody 0.5.
Paul Aurich <paul@darkrain42.org>
parents: 27381
diff changeset
893 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
894
25998
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
895 if (bosh->ssl) {
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
896 if (purple_ssl_is_supported()) {
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
897 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
898 ssl_connection_established_cb,
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
899 ssl_connection_error_cb,
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
900 conn);
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
901 if (!conn->psc) {
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
902 purple_connection_error_reason(gc,
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
903 PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT,
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
904 _("Unable to establish SSL connection"));
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
905 }
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
906 } else {
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
907 purple_connection_error_reason(gc,
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
908 PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT,
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
909 _("SSL support unavailable"));
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
910 }
31bb0d6e7f7e BOSH: Support HTTPS connections to the connection manager
Paul Aurich <paul@darkrain42.org>
parents: 25997
diff changeset
911 } 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
912 connection_established_cb, conn) == NULL) {
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
913 purple_connection_error_reason(gc,
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
914 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
27381
f541583e31bd More uniformity among disconnect error messages
Mark Doliner <mark@kingant.net>
parents: 27174
diff changeset
915 _("Unable to connect"));
25181
7de1f124f95a Jabber BOSH: Many fixes
Paul Aurich <paul@darkrain42.org>
parents: 25056
diff changeset
916 }
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
917 }
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
918
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
919 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
920 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
921 {
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
922 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
923
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
924 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
925 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
926 else
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
927 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
928
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
929 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
930 }
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
931
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
932 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
933 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
934 {
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
935 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
936 int ret;
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
937 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
938
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
939 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
940 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
941 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
942 return;
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
943 }
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
944
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
945 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
946
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
947 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
948 return;
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
949 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
950 /*
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
951 * 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
952 * 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
953 * 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
954 */
27381
f541583e31bd More uniformity among disconnect error messages
Mark Doliner <mark@kingant.net>
parents: 27174
diff changeset
955 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
956 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
957 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
958 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
27381
f541583e31bd More uniformity among disconnect error messages
Mark Doliner <mark@kingant.net>
parents: 27174
diff changeset
959 tmp);
f541583e31bd More uniformity among disconnect error messages
Mark Doliner <mark@kingant.net>
parents: 27174
diff changeset
960 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
961 return;
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
962 }
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
963
27785
14e5eadff540 jabber: Re-order the BOSH structs and normalize the buffer names.
Paul Aurich <paul@darkrain42.org>
parents: 27546
diff changeset
964 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
965 }
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
966
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
967 static void
25991
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
968 http_connection_send_request(PurpleHTTPConnection *conn, const GString *req)
25182
17b60b844803 Jabber BOSH: more fixes.
Paul Aurich <paul@darkrain42.org>
parents: 25181
diff changeset
969 {
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
970 char *data;
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
971 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
972 size_t len;
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
973
27788
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
974 /* Sending something to the server, restart the inactivity timer */
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
975 restart_inactivity_timer(conn->bosh);
46e80810b095 jabber: Better inactivity timer logic.
Paul Aurich <paul@darkrain42.org>
parents: 27787
diff changeset
976
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
977 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
978 "Host: %s\r\n"
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
979 "User-Agent: %s\r\n"
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
980 "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
981 "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
982 "%s",
25991
71835e00c0fc Rename a few functions and drop some data members.
Paul Aurich <paul@darkrain42.org>
parents: 25988
diff changeset
983 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
984 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
985
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
986 len = strlen(data);
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
987
25669
828640306e31 Don't track a cb-per-POST and remove the PurpleHTTPResponse structure.
Paul Aurich <paul@darkrain42.org>
parents: 25668
diff changeset
988 ++conn->requests;
25988
f36a94f19db3 Restore BOSH to a more-or-less working state.
Paul Aurich <paul@darkrain42.org>
parents: 25670
diff changeset
989 ++conn->bosh->requests;
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
990
27789
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
991 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
992 /* Will contain passwords for SASL PLAIN and is verbose */
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
993 purple_debug_misc("jabber", "BOSH: Sending %s\n", data);
1ff7de15d856 jabber: Ridiculously verbose logging for BOSH.
Paul Aurich <paul@darkrain42.org>
parents: 27788
diff changeset
994
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
995 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
996 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
997 else {
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
998 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
999 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
1000 }
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
1001
26462
e0218e4ec785 BOSH: Use a write buffer (read: basically cut-n-paste from jabber.c)
Paul Aurich <paul@darkrain42.org>
parents: 26461
diff changeset
1002 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
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 * 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
1005 * 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
1006 * 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
1007 */
27381
f541583e31bd More uniformity among disconnect error messages
Mark Doliner <mark@kingant.net>
parents: 27174
diff changeset
1008 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
1009 g_strerror(errno));
25670
c11c14dde641 Store PurpleBOSHConnection* instead of void* userdata
Paul Aurich <paul@darkrain42.org>
parents: 25669
diff changeset
1010 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
1011 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
27381
f541583e31bd More uniformity among disconnect error messages
Mark Doliner <mark@kingant.net>
parents: 27174
diff changeset
1012 tmp);
f541583e31bd More uniformity among disconnect error messages
Mark Doliner <mark@kingant.net>
parents: 27174
diff changeset
1013 g_free(tmp);
25192
592c2cf00fea Jabber BOSH: Store less for each Request/Response
Paul Aurich <paul@darkrain42.org>
parents: 25184
diff changeset
1014 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
1015 } 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
1016 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
1017 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
1018 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
1019 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
1020 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
1021 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
1022 }
25044
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
1023 }
f9322be084c4 * doing HTTP requests
Tobias Markmann <tfar@soc.pidgin.im>
parents: 25043
diff changeset
1024