|
|
|
@ -10,6 +10,7 @@
@@ -10,6 +10,7 @@
|
|
|
|
|
#include <stdio.h> |
|
|
|
|
#include <string.h> |
|
|
|
|
#include <unistd.h> |
|
|
|
|
#include <pthread.h> |
|
|
|
|
|
|
|
|
|
/* Libowfat */ |
|
|
|
|
#include "byte.h" |
|
|
|
@ -79,11 +80,12 @@ static void http_senddata( const int64 sock, struct ot_workstruct *ws ) {
@@ -79,11 +80,12 @@ static void http_senddata( const int64 sock, struct ot_workstruct *ws ) {
|
|
|
|
|
#define HTTPERROR_400_PARAM return http_issue_error( sock, ws, CODE_HTTPERROR_400_PARAM ) |
|
|
|
|
#define HTTPERROR_400_COMPACT return http_issue_error( sock, ws, CODE_HTTPERROR_400_COMPACT ) |
|
|
|
|
#define HTTPERROR_400_DOUBLEHASH return http_issue_error( sock, ws, CODE_HTTPERROR_400_PARAM ) |
|
|
|
|
#define HTTPERROR_402_NOTMODEST return http_issue_error( sock, ws, CODE_HTTPERROR_402_NOTMODEST ) |
|
|
|
|
#define HTTPERROR_403_IP return http_issue_error( sock, ws, CODE_HTTPERROR_403_IP ) |
|
|
|
|
#define HTTPERROR_404 return http_issue_error( sock, ws, CODE_HTTPERROR_404 ) |
|
|
|
|
#define HTTPERROR_500 return http_issue_error( sock, ws, CODE_HTTPERROR_500 ) |
|
|
|
|
ssize_t http_issue_error( const int64 sock, struct ot_workstruct *ws, int code ) { |
|
|
|
|
char *error_code[] = { "302 Found", "400 Invalid Request", "400 Invalid Request", "400 Invalid Request", |
|
|
|
|
char *error_code[] = { "302 Found", "400 Invalid Request", "400 Invalid Request", "400 Invalid Request", "402 Payment Required", |
|
|
|
|
"403 Access Denied", "404 Not Found", "500 Internal Server Error" }; |
|
|
|
|
char *title = error_code[code]; |
|
|
|
|
|
|
|
|
@ -234,12 +236,39 @@ static const ot_keywords keywords_format[] =
@@ -234,12 +236,39 @@ static const ot_keywords keywords_format[] =
|
|
|
|
|
return ws->reply_size; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef WANT_MODEST_FULLSCRAPES |
|
|
|
|
static pthread_mutex_t g_modest_fullscrape_mutex = PTHREAD_MUTEX_INITIALIZER; |
|
|
|
|
static ot_vector g_modest_fullscrape_timeouts; |
|
|
|
|
typedef struct { ot_ip6 ip; ot_time last_fullscrape; } ot_scrape_log; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef WANT_FULLSCRAPE |
|
|
|
|
static ssize_t http_handle_fullscrape( const int64 sock, struct ot_workstruct *ws ) { |
|
|
|
|
struct http_data* cookie = io_getcookie( sock ); |
|
|
|
|
int format = 0; |
|
|
|
|
tai6464 t; |
|
|
|
|
|
|
|
|
|
#ifdef WANT_MODEST_FULLSCRAPES |
|
|
|
|
{ |
|
|
|
|
ot_scrape_log this_peer, *new_peer; |
|
|
|
|
int exactmatch; |
|
|
|
|
memcpy( this_peer.ip, cookie->ip, sizeof(ot_ip6)); |
|
|
|
|
this_peer.last_fullscrape = g_now_seconds; |
|
|
|
|
pthread_mutex_lock(&g_modest_fullscrape_mutex); |
|
|
|
|
new_peer = vector_find_or_insert( &g_modest_fullscrape_timeouts, &this_peer, sizeof(ot_scrape_log), sizeof(ot_ip6), &exactmatch ); |
|
|
|
|
if( !new_peer ) { |
|
|
|
|
pthread_mutex_unlock(&g_modest_fullscrape_mutex); |
|
|
|
|
HTTPERROR_500; |
|
|
|
|
} |
|
|
|
|
if( exactmatch && ( this_peer.last_fullscrape - new_peer->last_fullscrape ) < OT_MODEST_PEER_TIMEOUT ) { |
|
|
|
|
pthread_mutex_unlock(&g_modest_fullscrape_mutex); |
|
|
|
|
HTTPERROR_402_NOTMODEST; |
|
|
|
|
} |
|
|
|
|
memcpy( new_peer, &this_peer, sizeof(ot_scrape_log)); |
|
|
|
|
pthread_mutex_unlock(&g_modest_fullscrape_mutex); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef WANT_COMPRESSION_GZIP |
|
|
|
|
ws->request[ws->request_size-1] = 0; |
|
|
|
|
if( strstr( ws->request, "gzip" ) ) { |
|
|
|
@ -476,7 +505,6 @@ ssize_t http_handle_request( const int64 sock, struct ot_workstruct *ws ) {
@@ -476,7 +505,6 @@ ssize_t http_handle_request( const int64 sock, struct ot_workstruct *ws ) {
|
|
|
|
|
struct http_data *cookie = io_getcookie( sock ); |
|
|
|
|
if( loglist_check_address( cookie->ip ) ) { |
|
|
|
|
ot_log *log = malloc( sizeof( ot_log ) ); |
|
|
|
|
printf( "Hello World\n" ); |
|
|
|
|
if( log ) { |
|
|
|
|
log->size = ws->request_size; |
|
|
|
|
log->data = malloc( ws->request_size ); |
|
|
|
|