comparison libpurple/protocols/jabber/bosh.c @ 25054:8badac6cc7c9

* fixing a bug in jabber_bosh_http_connection_receive_parse_header() * removing some debugging output
author Tobias Markmann <tfar@soc.pidgin.im>
date Mon, 18 Aug 2008 15:44:43 +0000
parents 0a8484372312
children 480736bfcf45
comparison
equal deleted inserted replaced
25053:84ff003a7d33 25054:8badac6cc7c9
79 xmlnode_set_attrib(restart, "xmlns:xmpp", "urn:xmpp:xbosh"); 79 xmlnode_set_attrib(restart, "xmlns:xmpp", "urn:xmpp:xbosh");
80 80
81 jabber_bosh_connection_send_native(conn, restart); 81 jabber_bosh_connection_send_native(conn, restart);
82 } 82 }
83 83
84 gboolean jabber_bosh_connection_error_check(PurpleBOSHConnection *conn, xmlnode *node) {
85 char *type;
86
87 if (!node) return;
88 type = xmlnode_get_attrib(node, "type");
89
90 if (type != NULL && !strcmp(type, "terminate")) {
91 conn->ready = FALSE;
92 return TRUE;
93 }
94 return FALSE;
95 }
96
84 void jabber_bosh_connection_received(PurpleBOSHConnection *conn, xmlnode *node) { 97 void jabber_bosh_connection_received(PurpleBOSHConnection *conn, xmlnode *node) {
85 xmlnode *child; 98 xmlnode *child;
86 JabberStream *js = conn->js; 99 JabberStream *js = conn->js;
87 100
88 if (node == NULL) return; 101 if (node == NULL) return;
89 102
103 if (jabber_bosh_connection_error_check(conn, node) == TRUE) return;
104
90 child = node->child; 105 child = node->child;
91 while (child != 0) { 106 while (child != 0) {
92 if (child->type == XMLNODE_TYPE_TAG) { 107 if (child->type == XMLNODE_TYPE_TAG) {
108 xmlnode *session = NULL;
109 if (!strcmp(child->name, "iq")) session = xmlnode_get_child(child, "session");
110 if (session) {
111 conn->ready = TRUE;
112 }
93 jabber_process_packet(js, &child); 113 jabber_process_packet(js, &child);
94 } 114 }
95 child = child->next; 115 child = child->next;
96 } 116 }
97 xmlnode_free(node); 117 xmlnode_free(node);
98 } 118 }
99 119
100 void jabber_bosh_connection_auth_response(PurpleBOSHConnection *conn, xmlnode *node) { 120 void jabber_bosh_connection_auth_response(PurpleBOSHConnection *conn, xmlnode *node) {
101 xmlnode *child = node->child; 121 xmlnode *child = node->child;
122
123 if (jabber_bosh_connection_error_check(conn, node) == TRUE) return;
102 124
103 while(child != NULL && child->type != XMLNODE_TYPE_TAG) { 125 while(child != NULL && child->type != XMLNODE_TYPE_TAG) {
104 child = child->next; 126 child = child->next;
105 } 127 }
106 128
107 if (child != NULL && child->type == XMLNODE_TYPE_TAG) { 129 if (child != NULL && child->type == XMLNODE_TYPE_TAG) {
108 JabberStream *js = conn->js; 130 JabberStream *js = conn->js;
109 if (!strcmp(child->name, "success")) { 131 if (!strcmp(child->name, "success")) {
110 jabber_bosh_connection_stream_restart(conn); 132 jabber_bosh_connection_stream_restart(conn);
111 jabber_process_packet(js, &child); 133 jabber_process_packet(js, &child);
112 conn->ready = TRUE;
113 conn->receive_cb = jabber_bosh_connection_received; 134 conn->receive_cb = jabber_bosh_connection_received;
114 } else { 135 } else {
115 js->state = JABBER_STREAM_AUTHENTICATING; 136 js->state = JABBER_STREAM_AUTHENTICATING;
116 jabber_process_packet(js, &child); 137 jabber_process_packet(js, &child);
117 } 138 }
118 } else printf("\n!! no child!!\n"); 139 } else printf("\n!! no child!!\n");
119 } 140 }
120 141
121 void jabber_bosh_connection_boot_response(PurpleBOSHConnection *conn, xmlnode *node) { 142 void jabber_bosh_connection_boot_response(PurpleBOSHConnection *conn, xmlnode *node) {
122 char *version; 143 char *version;
144
145 if (jabber_bosh_connection_error_check(conn, node) == TRUE) return;
146
123 if (xmlnode_get_attrib(node, "sid")) { 147 if (xmlnode_get_attrib(node, "sid")) {
124 conn->sid = g_strdup(xmlnode_get_attrib(node, "sid")); 148 conn->sid = g_strdup(xmlnode_get_attrib(node, "sid"));
125 } else { 149 } else {
126 purple_debug_info("jabber", "Connection manager doesn't behave BOSH-like!\n"); 150 purple_debug_info("jabber", "Connection manager doesn't behave BOSH-like!\n");
127 } 151 }
186 xmlnode_set_attrib(packet, "sid", conn->sid); 210 xmlnode_set_attrib(packet, "sid", conn->sid);
187 tmp = g_strdup_printf("%d", conn->rid); 211 tmp = g_strdup_printf("%d", conn->rid);
188 xmlnode_set_attrib(packet, "rid", tmp); 212 xmlnode_set_attrib(packet, "rid", tmp);
189 g_free(tmp); 213 g_free(tmp);
190 214
191 if (node) xmlnode_insert_child(packet, node); 215 if (node) {
192 216 xmlnode_insert_child(packet, node);
217 if (conn->ready == TRUE) xmlnode_set_attrib(node, "xmlns", "jabber:client");
218 }
193 jabber_bosh_connection_send_native(conn, packet); 219 jabber_bosh_connection_send_native(conn, packet);
194 } 220 }
195 221
196 void jabber_bosh_connection_send_native(PurpleBOSHConnection *conn, xmlnode *node) { 222 void jabber_bosh_connection_send_native(PurpleBOSHConnection *conn, xmlnode *node) {
197 PurpleHTTPRequest *request = g_new0(PurpleHTTPRequest, 1); 223 PurpleHTTPRequest *request = g_new0(PurpleHTTPRequest, 1);
262 } 288 }
263 } 289 }
264 ++beginning; ++beginning; ++beginning; ++beginning; 290 ++beginning; ++beginning; ++beginning; ++beginning;
265 /* remove the header from data buffer */ 291 /* remove the header from data buffer */
266 *data = g_strdup(beginning); 292 *data = g_strdup(beginning);
293 *len = *len - (beginning - old_data);
267 g_free(old_data); 294 g_free(old_data);
268 } 295 }
269 296
270 static void jabber_bosh_http_connection_receive(gpointer data, gint source, PurpleInputCondition condition) { 297 static void jabber_bosh_http_connection_receive(gpointer data, gint source, PurpleInputCondition condition) {
271 char buffer[1025]; 298 char buffer[1025];
291 318
292 if (!response) { 319 if (!response) {
293 /* check for header footer */ 320 /* check for header footer */
294 char *found = NULL; 321 char *found = NULL;
295 if (found = g_strstr_len(conn->current_data, conn->current_len, "\r\n\r\n")) { 322 if (found = g_strstr_len(conn->current_data, conn->current_len, "\r\n\r\n")) {
323
296 // new response 324 // new response
297 response = conn->current_response = g_new0(PurpleHTTPResponse, 1); 325 response = conn->current_response = g_new0(PurpleHTTPResponse, 1);
298 jabber_bosh_http_response_init(response); 326 jabber_bosh_http_response_init(response);
299 jabber_bosh_http_connection_receive_parse_header(response, &(conn->current_data), &(conn->current_len)); 327 jabber_bosh_http_connection_receive_parse_header(response, &(conn->current_data), &(conn->current_len));
300 response->data_len = atoi(g_hash_table_lookup(response->header, "Content-Length")); 328 response->data_len = atoi(g_hash_table_lookup(response->header, "Content-Length"));
301 jabber_bosh_http_connection_receive(data, source, condition);
302 } else { 329 } else {
303 printf("\nDATA: %s \n", conn->current_data);
304 printf("\nDid not receive HTTP header\n"); 330 printf("\nDid not receive HTTP header\n");
305 } 331 }
306 } 332 }
307 333
308 if (response) { 334 if (response) {
314 jabber_bosh_connection_send(bosh_conn, NULL); 340 jabber_bosh_connection_send(bosh_conn, NULL);
315 printf("\n SEND AN EMPTY REQUEST \n"); 341 printf("\n SEND AN EMPTY REQUEST \n");
316 } 342 }
317 343
318 if (request) { 344 if (request) {
345 char *old_data = conn->current_data;
319 response->data = g_memdup(conn->current_data, response->data_len); 346 response->data = g_memdup(conn->current_data, response->data_len);
320 request->cb(request, response, conn->userdata); 347 conn->current_data = g_strdup(&conn->current_data[response->data_len]);
348 conn->current_len -= response->data_len;
349 g_free(old_data);
350
351 if (request->cb) request->cb(request, response, conn->userdata);
352 else purple_debug_info("jabber", "missing request callback!\n");
353
321 jabber_bosh_http_request_clean(request); 354 jabber_bosh_http_request_clean(request);
322 jabber_bosh_http_response_clean(response); 355 jabber_bosh_http_response_clean(response);
323 conn->current_response = NULL; 356 conn->current_response = NULL;
324 g_free(request); 357 g_free(request);
325 g_free(response); 358 g_free(response);