diff options
| author | erdgeist <> | 2008-10-04 05:40:51 +0000 |
|---|---|---|
| committer | erdgeist <> | 2008-10-04 05:40:51 +0000 |
| commit | e534db03c6877f8ac0559f63840e9a00e9bd43bf (patch) | |
| tree | 811181b9b39d0484e28eb25cbb9f2eea094978e2 /ot_http.c | |
| parent | 8cbfc8602c73e55770f3c06d8ea42758b22a0401 (diff) | |
added live sync code
added a config file parser
added tracker id
changed WANT_CLOSED_TRACKER and WANT_BLACKLIST into WANT_ACCESS_WHITE and WANT_ACCESS_BLACK
changed WANT_TRACKER_SYNC to WANT_SYNC_BATCH and added WANT_SYNC_LIVE
added an option to switch off fullscrapes
cleaned up many internal hardcoded values, like PROTO_FLAG,
Diffstat (limited to 'ot_http.c')
| -rw-r--r-- | ot_http.c | 35 |
1 files changed, 18 insertions, 17 deletions
| @@ -28,10 +28,6 @@ | |||
| 28 | #include "ot_accesslist.h" | 28 | #include "ot_accesslist.h" |
| 29 | #include "ot_sync.h" | 29 | #include "ot_sync.h" |
| 30 | 30 | ||
| 31 | #ifndef WANT_TRACKER_SYNC | ||
| 32 | #define add_peer_to_torrent(A,B,C) add_peer_to_torrent(A,B) | ||
| 33 | #endif | ||
| 34 | |||
| 35 | #define OT_MAXMULTISCRAPE_COUNT 64 | 31 | #define OT_MAXMULTISCRAPE_COUNT 64 |
| 36 | static ot_hash multiscrape_buf[OT_MAXMULTISCRAPE_COUNT]; | 32 | static ot_hash multiscrape_buf[OT_MAXMULTISCRAPE_COUNT]; |
| 37 | extern char *g_redirecturl; | 33 | extern char *g_redirecturl; |
| @@ -103,7 +99,7 @@ ssize_t http_issue_error( const int64 client_socket, int code ) { | |||
| 103 | #ifdef _DEBUG_HTTPERROR | 99 | #ifdef _DEBUG_HTTPERROR |
| 104 | fprintf( stderr, "DEBUG: invalid request was: %s\n", debug_request ); | 100 | fprintf( stderr, "DEBUG: invalid request was: %s\n", debug_request ); |
| 105 | #endif | 101 | #endif |
| 106 | stats_issue_event( EVENT_FAILED, 1, code ); | 102 | stats_issue_event( EVENT_FAILED, FLAG_TCP, code ); |
| 107 | http_senddata( client_socket, static_outbuf, reply_size); | 103 | http_senddata( client_socket, static_outbuf, reply_size); |
| 108 | return -2; | 104 | return -2; |
| 109 | } | 105 | } |
| @@ -169,7 +165,7 @@ ssize_t http_sendiovecdata( const int64 client_socket, int iovec_entries, struct | |||
| 169 | return 0; | 165 | return 0; |
| 170 | } | 166 | } |
| 171 | 167 | ||
| 172 | #ifdef WANT_TRACKER_SYNC | 168 | #ifdef WANT_SYNC_BATCH |
| 173 | static ssize_t http_handle_sync( const int64 client_socket, char *data ) { | 169 | static ssize_t http_handle_sync( const int64 client_socket, char *data ) { |
| 174 | struct http_data* h = io_getcookie( client_socket ); | 170 | struct http_data* h = io_getcookie( client_socket ); |
| 175 | size_t len; | 171 | size_t len; |
| @@ -193,7 +189,7 @@ static ssize_t http_handle_sync( const int64 client_socket, char *data ) { | |||
| 193 | if( ( len = scan_urlencoded_query( &c, data = c, SCAN_SEARCHPATH_VALUE ) ) < 10 ) HTTPERROR_400_PARAM; | 189 | if( ( len = scan_urlencoded_query( &c, data = c, SCAN_SEARCHPATH_VALUE ) ) < 10 ) HTTPERROR_400_PARAM; |
| 194 | if( add_changeset_to_tracker( (uint8_t*)data, len ) ) HTTPERROR_400_PARAM; | 190 | if( add_changeset_to_tracker( (uint8_t*)data, len ) ) HTTPERROR_400_PARAM; |
| 195 | if( mode == SYNC_OUT ) { | 191 | if( mode == SYNC_OUT ) { |
| 196 | stats_issue_event( EVENT_SYNC_IN, 1, 0 ); | 192 | stats_issue_event( EVENT_SYNC_IN, FLAG_TCP, 0 ); |
| 197 | mode = SYNC_IN; | 193 | mode = SYNC_IN; |
| 198 | } | 194 | } |
| 199 | break; | 195 | break; |
| @@ -203,7 +199,7 @@ static ssize_t http_handle_sync( const int64 client_socket, char *data ) { | |||
| 203 | if( mode == SYNC_OUT ) { | 199 | if( mode == SYNC_OUT ) { |
| 204 | /* Pass this task to the worker thread */ | 200 | /* Pass this task to the worker thread */ |
| 205 | h->flag |= STRUCT_HTTP_FLAG_WAITINGFORTASK; | 201 | h->flag |= STRUCT_HTTP_FLAG_WAITINGFORTASK; |
| 206 | stats_issue_event( EVENT_SYNC_OUT_REQUEST, 1, 0 ); | 202 | stats_issue_event( EVENT_SYNC_OUT_REQUEST, FLAG_TCP, 0 ); |
| 207 | sync_deliver( client_socket ); | 203 | sync_deliver( client_socket ); |
| 208 | io_dontwantread( client_socket ); | 204 | io_dontwantread( client_socket ); |
| 209 | return -2; | 205 | return -2; |
| @@ -216,7 +212,6 @@ static ssize_t http_handle_sync( const int64 client_socket, char *data ) { | |||
| 216 | #endif | 212 | #endif |
| 217 | 213 | ||
| 218 | static ssize_t http_handle_stats( const int64 client_socket, char *data, char *d, size_t l ) { | 214 | static ssize_t http_handle_stats( const int64 client_socket, char *data, char *d, size_t l ) { |
| 219 | struct http_data* h = io_getcookie( client_socket ); | ||
| 220 | char *c = data; | 215 | char *c = data; |
| 221 | int mode = TASK_STATS_PEERS, scanon = 1, format = 0; | 216 | int mode = TASK_STATS_PEERS, scanon = 1, format = 0; |
| 222 | 217 | ||
| @@ -284,7 +279,11 @@ static ssize_t http_handle_stats( const int64 client_socket, char *data, char *d | |||
| 284 | } | 279 | } |
| 285 | } | 280 | } |
| 286 | 281 | ||
| 282 | /* Touch variable */ | ||
| 283 | d=d; | ||
| 284 | #ifdef WANT_FULLSCRAPE | ||
| 287 | if( mode == TASK_STATS_TPB ) { | 285 | if( mode == TASK_STATS_TPB ) { |
| 286 | struct http_data* h = io_getcookie( client_socket ); | ||
| 288 | tai6464 t; | 287 | tai6464 t; |
| 289 | #ifdef WANT_COMPRESSION_GZIP | 288 | #ifdef WANT_COMPRESSION_GZIP |
| 290 | d[l-1] = 0; | 289 | d[l-1] = 0; |
| @@ -292,9 +291,6 @@ static ssize_t http_handle_stats( const int64 client_socket, char *data, char *d | |||
| 292 | h->flag |= STRUCT_HTTP_FLAG_GZIP; | 291 | h->flag |= STRUCT_HTTP_FLAG_GZIP; |
| 293 | format |= TASK_FLAG_GZIP; | 292 | format |= TASK_FLAG_GZIP; |
| 294 | } | 293 | } |
| 295 | #else | ||
| 296 | /* Touch variable */ | ||
| 297 | d=d; | ||
| 298 | #endif | 294 | #endif |
| 299 | /* Pass this task to the worker thread */ | 295 | /* Pass this task to the worker thread */ |
| 300 | h->flag |= STRUCT_HTTP_FLAG_WAITINGFORTASK; | 296 | h->flag |= STRUCT_HTTP_FLAG_WAITINGFORTASK; |
| @@ -305,12 +301,14 @@ static ssize_t http_handle_stats( const int64 client_socket, char *data, char *d | |||
| 305 | io_dontwantread( client_socket ); | 301 | io_dontwantread( client_socket ); |
| 306 | return -2; | 302 | return -2; |
| 307 | } | 303 | } |
| 304 | #endif | ||
| 308 | 305 | ||
| 309 | /* default format for now */ | 306 | /* default format for now */ |
| 310 | if( !( l = return_stats_for_tracker( static_outbuf + SUCCESS_HTTP_HEADER_LENGTH, mode, 0 ) ) ) HTTPERROR_500; | 307 | if( !( l = return_stats_for_tracker( static_outbuf + SUCCESS_HTTP_HEADER_LENGTH, mode, 0 ) ) ) HTTPERROR_500; |
| 311 | return l; | 308 | return l; |
| 312 | } | 309 | } |
| 313 | 310 | ||
| 311 | #ifdef WANT_FULLSCRAPE | ||
| 314 | static ssize_t http_handle_fullscrape( const int64 client_socket, char *d, size_t l ) { | 312 | static ssize_t http_handle_fullscrape( const int64 client_socket, char *d, size_t l ) { |
| 315 | struct http_data* h = io_getcookie( client_socket ); | 313 | struct http_data* h = io_getcookie( client_socket ); |
| 316 | int format = 0; | 314 | int format = 0; |
| @@ -341,6 +339,7 @@ write( 2, debug_request, l ); | |||
| 341 | io_dontwantread( client_socket ); | 339 | io_dontwantread( client_socket ); |
| 342 | return -2; | 340 | return -2; |
| 343 | } | 341 | } |
| 342 | #endif | ||
| 344 | 343 | ||
| 345 | static ssize_t http_handle_scrape( const int64 client_socket, char *data ) { | 344 | static ssize_t http_handle_scrape( const int64 client_socket, char *data ) { |
| 346 | int scanon = 1, numwant = 0; | 345 | int scanon = 1, numwant = 0; |
| @@ -387,7 +386,7 @@ UTORRENT1600_WORKAROUND: | |||
| 387 | 386 | ||
| 388 | /* Enough for http header + whole scrape string */ | 387 | /* Enough for http header + whole scrape string */ |
| 389 | if( !( l = return_tcp_scrape_for_torrent( multiscrape_buf, numwant, SUCCESS_HTTP_HEADER_LENGTH + static_outbuf ) ) ) HTTPERROR_500; | 388 | if( !( l = return_tcp_scrape_for_torrent( multiscrape_buf, numwant, SUCCESS_HTTP_HEADER_LENGTH + static_outbuf ) ) ) HTTPERROR_500; |
| 390 | stats_issue_event( EVENT_SCRAPE, 1, l ); | 389 | stats_issue_event( EVENT_SCRAPE, FLAG_TCP, l ); |
| 391 | return l; | 390 | return l; |
| 392 | } | 391 | } |
| 393 | 392 | ||
| @@ -486,12 +485,12 @@ static ssize_t http_handle_announce( const int64 client_socket, char *data ) { | |||
| 486 | return sprintf( static_outbuf + SUCCESS_HTTP_HEADER_LENGTH, "d14:failure reason81:Your client forgot to send your torrent's info_hash. Please upgrade your client.e" ); | 485 | return sprintf( static_outbuf + SUCCESS_HTTP_HEADER_LENGTH, "d14:failure reason81:Your client forgot to send your torrent's info_hash. Please upgrade your client.e" ); |
| 487 | 486 | ||
| 488 | if( OT_FLAG( &peer ) & PEER_FLAG_STOPPED ) | 487 | if( OT_FLAG( &peer ) & PEER_FLAG_STOPPED ) |
| 489 | len = remove_peer_from_torrent( hash, &peer, SUCCESS_HTTP_HEADER_LENGTH + static_outbuf, 1 ); | 488 | len = remove_peer_from_torrent( hash, &peer, SUCCESS_HTTP_HEADER_LENGTH + static_outbuf, FLAG_TCP ); |
| 490 | else { | 489 | else { |
| 491 | torrent = add_peer_to_torrent( hash, &peer, 0 ); | 490 | torrent = add_peer_to_torrent( hash, &peer WANT_SYNC_PARAM( 0 ) ); |
| 492 | if( !torrent || !( len = return_peers_for_torrent( hash, numwant, SUCCESS_HTTP_HEADER_LENGTH + static_outbuf, 1 ) ) ) HTTPERROR_500; | 491 | if( !torrent || !( len = return_peers_for_torrent( hash, numwant, SUCCESS_HTTP_HEADER_LENGTH + static_outbuf, 1 ) ) ) HTTPERROR_500; |
| 493 | } | 492 | } |
| 494 | stats_issue_event( EVENT_ANNOUNCE, 1, len); | 493 | stats_issue_event( EVENT_ANNOUNCE, FLAG_TCP, len); |
| 495 | return len; | 494 | return len; |
| 496 | } | 495 | } |
| 497 | 496 | ||
| @@ -529,14 +528,16 @@ ssize_t http_handle_request( const int64 client_socket, char *data, size_t recv_ | |||
| 529 | /* This is the hardcore match for announce*/ | 528 | /* This is the hardcore match for announce*/ |
| 530 | if( ( *data == 'a' ) || ( *data == '?' ) ) | 529 | if( ( *data == 'a' ) || ( *data == '?' ) ) |
| 531 | reply_size = http_handle_announce( client_socket, c ); | 530 | reply_size = http_handle_announce( client_socket, c ); |
| 531 | #ifdef WANT_FULLSCRAPE | ||
| 532 | else if( !byte_diff( data, 12, "scrape HTTP/" ) ) | 532 | else if( !byte_diff( data, 12, "scrape HTTP/" ) ) |
| 533 | reply_size = http_handle_fullscrape( client_socket, recv_header, recv_length ); | 533 | reply_size = http_handle_fullscrape( client_socket, recv_header, recv_length ); |
| 534 | #endif | ||
| 534 | /* This is the hardcore match for scrape */ | 535 | /* This is the hardcore match for scrape */ |
| 535 | else if( !byte_diff( data, 2, "sc" ) ) | 536 | else if( !byte_diff( data, 2, "sc" ) ) |
| 536 | reply_size = http_handle_scrape( client_socket, c ); | 537 | reply_size = http_handle_scrape( client_socket, c ); |
| 537 | /* All the rest is matched the standard way */ | 538 | /* All the rest is matched the standard way */ |
| 538 | else switch( len ) { | 539 | else switch( len ) { |
| 539 | #ifdef WANT_TRACKER_SYNC | 540 | #ifdef WANT_SYNC_BATCH |
| 540 | case 4: /* sync ? */ | 541 | case 4: /* sync ? */ |
| 541 | if( byte_diff( data, 4, "sync") ) HTTPERROR_404; | 542 | if( byte_diff( data, 4, "sync") ) HTTPERROR_404; |
| 542 | reply_size = http_handle_sync( client_socket, c ); | 543 | reply_size = http_handle_sync( client_socket, c ); |
