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