Mercurial > pidgin
comparison src/protocols/msn/httpconn.c @ 10568:fed2a7c2471d
[gaim-migrate @ 11954]
Some MSN bits:
- Fix HTTP Method works when using an HTTP proxy that require authentication
(Bastien Durel)
- Better error reporting when the MSN servers are temporarily unavailable
- Prevent zombie failed switchboard connections swallowing up messages
- Fix win32 crashes receiving messages from aMSN with no formatting info
- Fix a crash when the connection to the nexus server fails
- maybe some other stuff, I forgot how much had piled up
committer: Tailor Script <tailor@pidgin.im>
| author | Stu Tomlinson <stu@nosnilmot.com> |
|---|---|
| date | Thu, 03 Feb 2005 19:47:52 +0000 |
| parents | 052ef28a0695 |
| children | 56f1c92b943f |
comparison
equal
deleted
inserted
replaced
| 10567:54f7939df8e3 | 10568:fed2a7c2471d |
|---|---|
| 78 g_free(httpconn->host); | 78 g_free(httpconn->host); |
| 79 | 79 |
| 80 g_free(httpconn); | 80 g_free(httpconn); |
| 81 } | 81 } |
| 82 | 82 |
| 83 static char * | |
| 84 msn_httpconn_proxy_auth(MsnHttpConn *httpconn) | |
| 85 { | |
| 86 GaimAccount *account; | |
| 87 GaimProxyInfo *gpi; | |
| 88 const char *username, *password; | |
| 89 char *auth = NULL; | |
| 90 | |
| 91 account = httpconn->session->account; | |
| 92 | |
| 93 if (gaim_account_get_proxy_info(account) == NULL) | |
| 94 gpi = gaim_global_proxy_get_info(); | |
| 95 else | |
| 96 gpi = gaim_account_get_proxy_info(account); | |
| 97 | |
| 98 if (gpi == NULL || !(gaim_proxy_info_get_type(gpi) == GAIM_PROXY_HTTP || | |
| 99 gaim_proxy_info_get_type(gpi) == GAIM_PROXY_USE_ENVVAR)) | |
| 100 return NULL; | |
| 101 | |
| 102 username = gaim_proxy_info_get_username(gpi); | |
| 103 password = gaim_proxy_info_get_password(gpi); | |
| 104 | |
| 105 if (username != NULL) { | |
| 106 char *tmp; | |
| 107 auth = g_strdup_printf("%s:%s", username, password ? password : ""); | |
| 108 tmp = gaim_base64_encode(auth, strlen(auth)); | |
| 109 g_free(auth); | |
| 110 auth = g_strdup_printf("Proxy-Authorization: Basic %s\r\n", tmp); | |
| 111 g_free(tmp); | |
| 112 } | |
| 113 | |
| 114 return auth; | |
| 115 } | |
| 116 | |
| 83 static ssize_t | 117 static ssize_t |
| 84 write_raw(MsnHttpConn *httpconn, const char *header, | 118 write_raw(MsnHttpConn *httpconn, const char *header, |
| 85 const char *body, size_t body_len) | 119 const char *body, size_t body_len) |
| 86 { | 120 { |
| 87 char *buf; | 121 char *buf; |
| 127 | 161 |
| 128 void | 162 void |
| 129 msn_httpconn_poll(MsnHttpConn *httpconn) | 163 msn_httpconn_poll(MsnHttpConn *httpconn) |
| 130 { | 164 { |
| 131 char *header; | 165 char *header; |
| 166 char *auth; | |
| 132 int r; | 167 int r; |
| 133 | 168 |
| 134 g_return_if_fail(httpconn != NULL); | 169 g_return_if_fail(httpconn != NULL); |
| 135 | 170 |
| 136 if (httpconn->waiting_response || | 171 if (httpconn->waiting_response || |
| 137 httpconn->queue != NULL) | 172 httpconn->queue != NULL) |
| 138 { | 173 { |
| 139 return; | 174 return; |
| 140 } | 175 } |
| 176 | |
| 177 auth = msn_httpconn_proxy_auth(httpconn); | |
| 141 | 178 |
| 142 header = g_strdup_printf( | 179 header = g_strdup_printf( |
| 143 "POST http://%s/gateway/gateway.dll?Action=poll&SessionID=%s HTTP/1.1\r\n" | 180 "POST http://%s/gateway/gateway.dll?Action=poll&SessionID=%s HTTP/1.1\r\n" |
| 144 "Accept: */*\r\n" | 181 "Accept: */*\r\n" |
| 145 "Accept-Language: en-us\r\n" | 182 "Accept-Language: en-us\r\n" |
| 146 "User-Agent: MSMSGS\r\n" | 183 "User-Agent: MSMSGS\r\n" |
| 147 "Host: %s\r\n" | 184 "Host: %s\r\n" |
| 148 "Proxy-Connection: Keep-Alive\r\n" | 185 "Proxy-Connection: Keep-Alive\r\n" |
| 186 "%s" /* Proxy auth */ | |
| 149 "Connection: Keep-Alive\r\n" | 187 "Connection: Keep-Alive\r\n" |
| 150 "Pragma: no-cache\r\n" | 188 "Pragma: no-cache\r\n" |
| 151 "Content-Type: application/x-msn-messenger\r\n" | 189 "Content-Type: application/x-msn-messenger\r\n" |
| 152 "Content-Length: 0\r\n", | 190 "Content-Length: 0\r\n", |
| 153 httpconn->host, | 191 httpconn->host, |
| 154 httpconn->full_session_id, | 192 httpconn->full_session_id, |
| 155 httpconn->host); | 193 httpconn->host, |
| 194 auth ? auth : ""); | |
| 195 | |
| 196 if (auth != NULL) | |
| 197 g_free(auth); | |
| 156 | 198 |
| 157 r = write_raw(httpconn, header, NULL, -1); | 199 r = write_raw(httpconn, header, NULL, -1); |
| 158 | 200 |
| 159 g_free(header); | 201 g_free(header); |
| 160 | 202 |
| 169 do_poll(gpointer data) | 211 do_poll(gpointer data) |
| 170 { | 212 { |
| 171 MsnHttpConn *httpconn; | 213 MsnHttpConn *httpconn; |
| 172 | 214 |
| 173 httpconn = data; | 215 httpconn = data; |
| 216 | |
| 217 g_return_val_if_fail(httpconn != NULL, TRUE); | |
| 174 | 218 |
| 175 #if 0 | 219 #if 0 |
| 176 gaim_debug_info("msn", "polling from %s\n", httpconn->session_id); | 220 gaim_debug_info("msn", "polling from %s\n", httpconn->session_id); |
| 177 #endif | 221 #endif |
| 222 | |
| 223 if ((httpconn->host == NULL) || (httpconn->full_session_id == NULL)) | |
| 224 { | |
| 225 gaim_debug_warning("msn", "Attempted HTTP poll before session is established\n"); | |
| 226 return TRUE; | |
| 227 } | |
| 178 | 228 |
| 179 if (httpconn->dirty) | 229 if (httpconn->dirty) |
| 180 msn_httpconn_poll(httpconn); | 230 msn_httpconn_poll(httpconn); |
| 181 | 231 |
| 182 return TRUE; | 232 return TRUE; |
| 294 httpconn->rx_len += len; | 344 httpconn->rx_len += len; |
| 295 | 345 |
| 296 if (!msn_httpconn_parse_data(httpconn, httpconn->rx_buf, httpconn->rx_len, | 346 if (!msn_httpconn_parse_data(httpconn, httpconn->rx_buf, httpconn->rx_len, |
| 297 &result_msg, &result_len, &error)) | 347 &result_msg, &result_len, &error)) |
| 298 { | 348 { |
| 299 /* We must wait for more input */ | 349 /* We must wait for more input, or something went wrong */ |
| 350 if (error) | |
| 351 msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_READ); | |
| 300 | 352 |
| 301 return; | 353 return; |
| 302 } | 354 } |
| 303 | 355 |
| 304 httpconn->servconn->processing = FALSE; | 356 httpconn->servconn->processing = FALSE; |
| 419 size_t | 471 size_t |
| 420 msn_httpconn_write(MsnHttpConn *httpconn, const char *data, size_t size) | 472 msn_httpconn_write(MsnHttpConn *httpconn, const char *data, size_t size) |
| 421 { | 473 { |
| 422 char *params; | 474 char *params; |
| 423 char *header; | 475 char *header; |
| 476 char *auth; | |
| 424 gboolean first; | 477 gboolean first; |
| 425 const char *server_types[] = { "NS", "SB" }; | 478 const char *server_types[] = { "NS", "SB" }; |
| 426 const char *server_type; | 479 const char *server_type; |
| 427 size_t r; /* result of the write operation */ | 480 size_t r; /* result of the write operation */ |
| 428 char *host; | 481 char *host; |
| 467 else | 520 else |
| 468 { | 521 { |
| 469 /* The rest of the times servconn->host is the gateway host. */ | 522 /* The rest of the times servconn->host is the gateway host. */ |
| 470 host = httpconn->host; | 523 host = httpconn->host; |
| 471 | 524 |
| 525 if (host == NULL || httpconn->full_session_id == NULL) | |
| 526 { | |
| 527 gaim_debug_warning("msn", "Attempted HTTP write before session is established\n"); | |
| 528 return -1; | |
| 529 } | |
| 530 | |
| 472 params = g_strdup_printf("SessionID=%s", | 531 params = g_strdup_printf("SessionID=%s", |
| 473 httpconn->full_session_id); | 532 httpconn->full_session_id); |
| 474 } | 533 } |
| 534 | |
| 535 auth = msn_httpconn_proxy_auth(httpconn); | |
| 475 | 536 |
| 476 header = g_strdup_printf( | 537 header = g_strdup_printf( |
| 477 "POST http://%s/gateway/gateway.dll?%s HTTP/1.1\r\n" | 538 "POST http://%s/gateway/gateway.dll?%s HTTP/1.1\r\n" |
| 478 "Accept: */*\r\n" | 539 "Accept: */*\r\n" |
| 479 "Accept-Language: en-us\r\n" | 540 "Accept-Language: en-us\r\n" |
| 480 "User-Agent: MSMSGS\r\n" | 541 "User-Agent: MSMSGS\r\n" |
| 481 "Host: %s\r\n" | 542 "Host: %s\r\n" |
| 482 "Proxy-Connection: Keep-Alive\r\n" | 543 "Proxy-Connection: Keep-Alive\r\n" |
| 544 "%s" /* Proxy auth */ | |
| 483 "Connection: Keep-Alive\r\n" | 545 "Connection: Keep-Alive\r\n" |
| 484 "Pragma: no-cache\r\n" | 546 "Pragma: no-cache\r\n" |
| 485 "Content-Type: application/x-msn-messenger\r\n" | 547 "Content-Type: application/x-msn-messenger\r\n" |
| 486 "Content-Length: %d\r\n", | 548 "Content-Length: %d\r\n", |
| 487 host, | 549 host, |
| 488 params, | 550 params, |
| 489 host, | 551 host, |
| 552 auth ? auth : "", | |
| 490 (int)size); | 553 (int)size); |
| 491 | 554 |
| 492 g_free(params); | 555 g_free(params); |
| 556 | |
| 557 if (auth != NULL) | |
| 558 g_free(auth); | |
| 493 | 559 |
| 494 r = write_raw(httpconn, header, data, size); | 560 r = write_raw(httpconn, header, data, size); |
| 495 | 561 |
| 496 g_free(header); | 562 g_free(header); |
| 497 | 563 |
