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