comparison libpurple/protocols/jabber/bosh.c @ 25046:e28f1711f402

* parsing HTTP response and emitting HTTP request callback
author Tobias Markmann <tfar@soc.pidgin.im>
date Mon, 11 Aug 2008 21:28:05 +0000
parents 24b97b8359ff
children f747c682a0d9
comparison
equal deleted inserted replaced
25045:24b97b8359ff 25046:e28f1711f402
78 jabber_bosh_connection_send(conn, init); 78 jabber_bosh_connection_send(conn, init);
79 } 79 }
80 80
81 void jabber_bosh_connection_login_cb(PurpleHTTPRequest *req, PurpleHTTPResponse *res, void *userdata) { 81 void jabber_bosh_connection_login_cb(PurpleHTTPRequest *req, PurpleHTTPResponse *res, void *userdata) {
82 purple_debug_info("jabber", "RECEIVED FIRST HTTP RESPONSE\n"); 82 purple_debug_info("jabber", "RECEIVED FIRST HTTP RESPONSE\n");
83 printf("\nDATA\n\n%s\n", res->data);
83 } 84 }
84 85
85 void jabber_bosh_connection_send(PurpleBOSHConnection *conn, xmlnode *node) { 86 void jabber_bosh_connection_send(PurpleBOSHConnection *conn, xmlnode *node) {
86 PurpleHTTPRequest *request = g_new0(PurpleHTTPRequest, 1); 87 PurpleHTTPRequest *request = g_new0(PurpleHTTPRequest, 1);
87 jabber_bosh_http_request_init(request, "POST", g_strdup_printf("/%s", conn->path), jabber_bosh_connection_login_cb, conn); 88 jabber_bosh_http_request_init(request, "POST", g_strdup_printf("/%s", conn->path), jabber_bosh_connection_login_cb, conn);
102 conn->conn_a->connect_cb = jabber_bosh_connection_connected; 103 conn->conn_a->connect_cb = jabber_bosh_connection_connected;
103 jabber_bosh_http_connection_connect(conn->conn_a); 104 jabber_bosh_http_connection_connect(conn->conn_a);
104 } 105 }
105 106
106 static void jabber_bosh_http_connection_receive(gpointer data, gint source, PurpleInputCondition condition) { 107 static void jabber_bosh_http_connection_receive(gpointer data, gint source, PurpleInputCondition condition) {
108 char buffer[1024];
109 int len;
107 PurpleHTTPConnection *conn = data; 110 PurpleHTTPConnection *conn = data;
108 PurpleHTTPResponse *response = conn->current_response; 111 PurpleHTTPResponse *response = conn->current_response;
109 112
110 purple_debug_info("jabber", "jabber_bosh_http_connection_receive\n"); 113 purple_debug_info("jabber", "jabber_bosh_http_connection_receive\n");
111 if (response) { 114 if (!response) {
112 // data for current response
113
114 } else {
115 // new response 115 // new response
116 response = conn->current_response = g_new0(PurpleHTTPResponse, 1); 116 response = conn->current_response = g_new0(PurpleHTTPResponse, 1);
117 jabber_bosh_http_response_init(response);
118 }
119
120 len = read(source, buffer, 1024);
121 if (len > 0) {
122 char *found = NULL;
123 if (found = g_strstr_len(buffer, len, "\r\n\r\n")) {
124 char *beginning = buffer;
125 char *field = NULL;
126 char *value = NULL;
127 char *cl = NULL;
128
129 while (*beginning != 'H') ++beginning;
130 beginning[12] = 0;
131 response->status = atoi(&beginning[9]);
132 beginning = &beginning[13];
133 do {
134 ++beginning;
135 } while (*beginning != '\n');
136 ++beginning;
137 /* parse HTTP response header */
138 for (;beginning != found; ++beginning) {
139 if (!field) field = beginning;
140 if (*beginning == ':') {
141 *beginning = 0;
142 value = beginning + 1;
143 } else if (*beginning == '\r') {
144 *beginning = 0;
145 g_hash_table_replace(response->header, g_strdup(field), g_strdup(value));
146 value = field = 0;
147 ++beginning;
148 }
149 }
150 ++found; ++found; ++found; ++found;
151
152 cl = g_hash_table_lookup(response->header, "Content-Length");
153 if (cl) {
154 PurpleHTTPRequest *request = NULL;
155 response->data_len = atoi(cl);
156 if (response->data <= len - (found - buffer)) response->data = g_memdup(found, response->data_len);
157 else printf("\nDidn't receive complete content");
158
159 request = g_queue_pop_head(conn->requests);
160 if (request) {
161 request->cb(request, response, conn->userdata);
162 jabber_bosh_http_request_clean(request);
163 jabber_bosh_http_response_clean(response);
164 } else {
165 purple_debug_info("jabber", "received HTTP response but haven't requested anything yet.\n");
166 }
167 } else {
168 printf("\ndidn't receive length.\n");
169 }
170 } else {
171 printf("\nDid not receive complete HTTP header!\n");
172 }
173 } else {
174 purple_debug_info("jabber", "jabber_bosh_http_connection_receive: problem receiving data\n");
117 } 175 }
118 } 176 }
119 177
120 void jabber_bosh_http_connection_init(PurpleHTTPConnection *conn, PurpleAccount *account, char *host, int port) { 178 void jabber_bosh_http_connection_init(PurpleHTTPConnection *conn, PurpleAccount *account, char *host, int port) {
121 conn->account = account; 179 conn->account = account;
122 conn->host = host; 180 conn->host = host;
123 conn->port = port; 181 conn->port = port;
124 conn->connect_cb = NULL; 182 conn->connect_cb = NULL;
125 conn->current_response = NULL; 183 conn->current_response = NULL;
184 conn->current_data = NULL;
126 conn->requests = g_queue_new(); 185 conn->requests = g_queue_new();
127 } 186 }
128 187
129 void jabber_bosh_http_connection_clean(PurpleHTTPConnection *conn) { 188 void jabber_bosh_http_connection_clean(PurpleHTTPConnection *conn) {
130 g_queue_free(conn->requests); 189 g_queue_free(conn->requests);
186 req->data = data; 245 req->data = data;
187 req->data_len = len; 246 req->data_len = len;
188 } 247 }
189 248
190 void jabber_bosh_http_request_clean(PurpleHTTPRequest *req) { 249 void jabber_bosh_http_request_clean(PurpleHTTPRequest *req) {
250 g_hash_table_destroy(req->header);
191 g_free(req->method); 251 g_free(req->method);
192 g_free(req->path); 252 g_free(req->path);
193 } 253 }
254
255 void jabber_bosh_http_response_init(PurpleHTTPResponse *res) {
256 res->status = 0;
257 res->header = g_hash_table_new(g_str_hash, g_str_equal);
258 }
259
260
261 void jabber_bosh_http_response_clean(PurpleHTTPResponse *res) {
262 g_hash_table_destroy(res->header);
263 g_free(res->data);
264 }