diff options
Diffstat (limited to 'ot_http.c')
| -rw-r--r-- | ot_http.c | 45 |
1 files changed, 27 insertions, 18 deletions
| @@ -369,12 +369,11 @@ static ot_keywords keywords_announce[] = { { "port", 1 }, { "left", 2 }, { "even | |||
| 369 | #ifdef WANT_FULLLOG_NETWORKS | 369 | #ifdef WANT_FULLLOG_NETWORKS |
| 370 | { "lognet", 8 }, | 370 | { "lognet", 8 }, |
| 371 | #endif | 371 | #endif |
| 372 | { "peer_id", 9 }, | ||
| 372 | { NULL, -3 } }; | 373 | { NULL, -3 } }; |
| 373 | static ot_keywords keywords_announce_event[] = { { "completed", 1 }, { "stopped", 2 }, { NULL, -3 } }; | 374 | static ot_keywords keywords_announce_event[] = { { "completed", 1 }, { "stopped", 2 }, { NULL, -3 } }; |
| 374 | static ssize_t http_handle_announce( const int64 sock, struct ot_workstruct *ws, char *read_ptr ) { | 375 | static ssize_t http_handle_announce( const int64 sock, struct ot_workstruct *ws, char *read_ptr ) { |
| 375 | int numwant, tmp, scanon; | 376 | int numwant, tmp, scanon; |
| 376 | ot_peer peer; | ||
| 377 | ot_hash *hash = NULL; | ||
| 378 | unsigned short port = 0; | 377 | unsigned short port = 0; |
| 379 | char *write_ptr; | 378 | char *write_ptr; |
| 380 | ssize_t len; | 379 | ssize_t len; |
| @@ -392,14 +391,18 @@ static ssize_t http_handle_announce( const int64 sock, struct ot_workstruct *ws, | |||
| 392 | ot_ip6 proxied_ip; | 391 | ot_ip6 proxied_ip; |
| 393 | char *fwd = http_header( ws->request, ws->header_size, "x-forwarded-for" ); | 392 | char *fwd = http_header( ws->request, ws->header_size, "x-forwarded-for" ); |
| 394 | if( fwd && scan_ip6( fwd, proxied_ip ) ) | 393 | if( fwd && scan_ip6( fwd, proxied_ip ) ) |
| 395 | OT_SETIP( &peer, proxied_ip ); | 394 | OT_SETIP( &ws->peer, proxied_ip ); |
| 396 | else | 395 | else |
| 397 | OT_SETIP( &peer, cookie->ip ); | 396 | OT_SETIP( &ws->peer, cookie->ip ); |
| 398 | } else | 397 | } else |
| 399 | #endif | 398 | #endif |
| 400 | OT_SETIP( &peer, cookie->ip ); | 399 | |
| 401 | OT_SETPORT( &peer, &port ); | 400 | ws->peer_id = NULL; |
| 402 | OT_PEERFLAG( &peer ) = 0; | 401 | ws->hash = NULL; |
| 402 | |||
| 403 | OT_SETIP( &ws->peer, cookie->ip ); | ||
| 404 | OT_SETPORT( &ws->peer, &port ); | ||
| 405 | OT_PEERFLAG( &ws->peer ) = 0; | ||
| 403 | numwant = 50; | 406 | numwant = 50; |
| 404 | scanon = 1; | 407 | scanon = 1; |
| 405 | 408 | ||
| @@ -411,21 +414,21 @@ static ssize_t http_handle_announce( const int64 sock, struct ot_workstruct *ws, | |||
| 411 | case 1: /* matched "port" */ | 414 | case 1: /* matched "port" */ |
| 412 | len = scan_urlencoded_query( &read_ptr, write_ptr = read_ptr, SCAN_SEARCHPATH_VALUE ); | 415 | len = scan_urlencoded_query( &read_ptr, write_ptr = read_ptr, SCAN_SEARCHPATH_VALUE ); |
| 413 | if( ( len <= 0 ) || scan_fixed_int( write_ptr, len, &tmp ) || ( tmp > 0xffff ) ) HTTPERROR_400_PARAM; | 416 | if( ( len <= 0 ) || scan_fixed_int( write_ptr, len, &tmp ) || ( tmp > 0xffff ) ) HTTPERROR_400_PARAM; |
| 414 | port = htons( tmp ); OT_SETPORT( &peer, &port ); | 417 | port = htons( tmp ); OT_SETPORT( &ws->peer, &port ); |
| 415 | break; | 418 | break; |
| 416 | case 2: /* matched "left" */ | 419 | case 2: /* matched "left" */ |
| 417 | if( ( len = scan_urlencoded_query( &read_ptr, write_ptr = read_ptr, SCAN_SEARCHPATH_VALUE ) ) <= 0 ) HTTPERROR_400_PARAM; | 420 | if( ( len = scan_urlencoded_query( &read_ptr, write_ptr = read_ptr, SCAN_SEARCHPATH_VALUE ) ) <= 0 ) HTTPERROR_400_PARAM; |
| 418 | if( scan_fixed_int( write_ptr, len, &tmp ) ) tmp = 0; | 421 | if( scan_fixed_int( write_ptr, len, &tmp ) ) tmp = 0; |
| 419 | if( !tmp ) OT_PEERFLAG( &peer ) |= PEER_FLAG_SEEDING; | 422 | if( !tmp ) OT_PEERFLAG( &ws->peer ) |= PEER_FLAG_SEEDING; |
| 420 | break; | 423 | break; |
| 421 | case 3: /* matched "event" */ | 424 | case 3: /* matched "event" */ |
| 422 | switch( scan_find_keywords( keywords_announce_event, &read_ptr, SCAN_SEARCHPATH_VALUE ) ) { | 425 | switch( scan_find_keywords( keywords_announce_event, &read_ptr, SCAN_SEARCHPATH_VALUE ) ) { |
| 423 | case -1: HTTPERROR_400_PARAM; | 426 | case -1: HTTPERROR_400_PARAM; |
| 424 | case 1: /* matched "completed" */ | 427 | case 1: /* matched "completed" */ |
| 425 | OT_PEERFLAG( &peer ) |= PEER_FLAG_COMPLETED; | 428 | OT_PEERFLAG( &ws->peer ) |= PEER_FLAG_COMPLETED; |
| 426 | break; | 429 | break; |
| 427 | case 2: /* matched "stopped" */ | 430 | case 2: /* matched "stopped" */ |
| 428 | OT_PEERFLAG( &peer ) |= PEER_FLAG_STOPPED; | 431 | OT_PEERFLAG( &ws->peer ) |= PEER_FLAG_STOPPED; |
| 429 | break; | 432 | break; |
| 430 | default: | 433 | default: |
| 431 | break; | 434 | break; |
| @@ -443,10 +446,10 @@ static ssize_t http_handle_announce( const int64 sock, struct ot_workstruct *ws, | |||
| 443 | if( !tmp ) HTTPERROR_400_COMPACT; | 446 | if( !tmp ) HTTPERROR_400_COMPACT; |
| 444 | break; | 447 | break; |
| 445 | case 6: /* matched "info_hash" */ | 448 | case 6: /* matched "info_hash" */ |
| 446 | if( hash ) HTTPERROR_400_DOUBLEHASH; | 449 | if( ws->hash ) HTTPERROR_400_DOUBLEHASH; |
| 447 | /* ignore this, when we have less than 20 bytes */ | 450 | /* ignore this, when we have less than 20 bytes */ |
| 448 | if( scan_urlencoded_query( &read_ptr, write_ptr = read_ptr, SCAN_SEARCHPATH_VALUE ) != 20 ) HTTPERROR_400_PARAM; | 451 | if( scan_urlencoded_query( &read_ptr, write_ptr = read_ptr, SCAN_SEARCHPATH_VALUE ) != 20 ) HTTPERROR_400_PARAM; |
| 449 | hash = (ot_hash*)write_ptr; | 452 | ws->hash = (ot_hash*)write_ptr; |
| 450 | break; | 453 | break; |
| 451 | #ifdef WANT_IP_FROM_QUERY_STRING | 454 | #ifdef WANT_IP_FROM_QUERY_STRING |
| 452 | case 7: /* matched "ip" */ | 455 | case 7: /* matched "ip" */ |
| @@ -455,7 +458,7 @@ static ssize_t http_handle_announce( const int64 sock, struct ot_workstruct *ws, | |||
| 455 | len = scan_urlencoded_query( &read_ptr, tmp_buf2, SCAN_SEARCHPATH_VALUE ); | 458 | len = scan_urlencoded_query( &read_ptr, tmp_buf2, SCAN_SEARCHPATH_VALUE ); |
| 456 | tmp_buf2[len] = 0; | 459 | tmp_buf2[len] = 0; |
| 457 | if( ( len <= 0 ) || !scan_ip6( tmp_buf2, tmp_buf1 ) ) HTTPERROR_400_PARAM; | 460 | if( ( len <= 0 ) || !scan_ip6( tmp_buf2, tmp_buf1 ) ) HTTPERROR_400_PARAM; |
| 458 | OT_SETIP( &peer, tmp_buf1 ); | 461 | OT_SETIP( &ws->peer, tmp_buf1 ); |
| 459 | } | 462 | } |
| 460 | break; | 463 | break; |
| 461 | #endif | 464 | #endif |
| @@ -490,6 +493,12 @@ static ssize_t http_handle_announce( const int64 sock, struct ot_workstruct *ws, | |||
| 490 | //} | 493 | //} |
| 491 | } | 494 | } |
| 492 | #endif | 495 | #endif |
| 496 | break; | ||
| 497 | case 9: /* matched "peer_id" */ | ||
| 498 | /* ignore this, when we have less than 20 bytes */ | ||
| 499 | if( scan_urlencoded_query( &read_ptr, write_ptr = read_ptr, SCAN_SEARCHPATH_VALUE ) != 20 ) HTTPERROR_400_PARAM; | ||
| 500 | ws->peer_id = write_ptr; | ||
| 501 | break; | ||
| 493 | } | 502 | } |
| 494 | } | 503 | } |
| 495 | 504 | ||
| @@ -501,13 +510,13 @@ static ssize_t http_handle_announce( const int64 sock, struct ot_workstruct *ws, | |||
| 501 | stats_issue_event( EVENT_ACCEPT, FLAG_TCP, (uintptr_t)ws->reply ); | 510 | stats_issue_event( EVENT_ACCEPT, FLAG_TCP, (uintptr_t)ws->reply ); |
| 502 | 511 | ||
| 503 | /* Scanned whole query string */ | 512 | /* Scanned whole query string */ |
| 504 | if( !hash ) | 513 | if( !ws->hash ) |
| 505 | return ws->reply_size = sprintf( ws->reply, "d14:failure reason80:Your client forgot to send your torrent's info_hash. Please upgrade your client.e" ); | 514 | return ws->reply_size = sprintf( ws->reply, "d14:failure reason80:Your client forgot to send your torrent's info_hash. Please upgrade your client.e" ); |
| 506 | 515 | ||
| 507 | if( OT_PEERFLAG( &peer ) & PEER_FLAG_STOPPED ) | 516 | if( OT_PEERFLAG( &ws->peer ) & PEER_FLAG_STOPPED ) |
| 508 | ws->reply_size = remove_peer_from_torrent( *hash, &peer, ws->reply, FLAG_TCP ); | 517 | ws->reply_size = remove_peer_from_torrent( FLAG_TCP, ws ); |
| 509 | else | 518 | else |
| 510 | ws->reply_size = add_peer_to_torrent_and_return_peers( *hash, &peer, FLAG_TCP, numwant, ws->reply ); | 519 | ws->reply_size = add_peer_to_torrent_and_return_peers( FLAG_TCP, ws, numwant ); |
| 511 | 520 | ||
| 512 | stats_issue_event( EVENT_ANNOUNCE, FLAG_TCP, ws->reply_size); | 521 | stats_issue_event( EVENT_ANNOUNCE, FLAG_TCP, ws->reply_size); |
| 513 | return ws->reply_size; | 522 | return ws->reply_size; |
