Skip to content

Commit

Permalink
http_request_get_url
Browse files Browse the repository at this point in the history
  • Loading branch information
MainKronos committed Aug 26, 2024
1 parent 87900ae commit 844387b
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 40 deletions.
55 changes: 22 additions & 33 deletions libs/http-server/http_server.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@

/*** PRIVATE *******************************************************************/

struct HttpParserTransferContext {
const char *at;
size_t length;
};

/**
* @brief Funzione chiamata quando il parser trova un url
* @param parser Istanza http_parser
Expand All @@ -23,7 +28,7 @@ static int http_parser_on_url(http_parser* parser, const char *at, size_t length
* @param at indirizzo inizio stringa url
* @param length Lunghezza stringa url
*/
static int http_get_url_field_on_url(http_parser* parser, const char *at, size_t length);
static int http_request_get_url_on_url(http_parser* parser, const char *at, size_t length);

/**
* @brief Funzione del server
Expand All @@ -45,55 +50,39 @@ static void http_server_cleanup(void* arg);

/******************************************************************************/

static int http_get_url_field_on_url(http_parser* parser, const char *at, size_t length){
struct {
const char *at;
size_t length
} *data = parser->data;

static int http_request_get_url_on_url(http_parser* parser, const char *at, size_t length){
struct HttpParserTransferContext* data = (struct HttpParserTransferContext*)parser->data;
data->at = at;
data->length = length;
return 0;
}

int http_get_url_field(int socket, enum http_parser_url_fields field, char* buffer, size_t buffer_size){
int ret;
char request[HTTP_MAX_HEADER_SIZE]; /* Buffer per la richiesta */
int http_request_get_url(const char** buffer, size_t* buffer_size){
http_parser parser; /* Istanza http parser */
http_parser_settings settings; /* Istanza settings del parser */
struct http_parser_url parser_url; /* Url parser */
struct {
const char *at;
size_t length
} data;
ssize_t recved; /* Bytes ricevuti */
size_t size;
struct HttpParserTransferContext data; /* Informazioni di trasferimento */

// Check iniziali
if(buffer == NULL) return -1;
if(*buffer == NULL) return -1;
if(buffer_size == NULL) return -1;
if(*buffer_size == 0) return -1;

// inizializzo i setting del parser
http_parser_settings_init(&settings);
settings.on_url = http_get_url_field_on_url;
settings.on_url = http_request_get_url_on_url;

// inizializzo il parser
http_parser_init(&parser, HTTP_REQUEST);
// passo il buffer dei dati al parser
parser.data = (void*)&data;

// ricevo i dati senza toglierli dallo stream
recved = recv(socket, request, sizeof(request), MSG_PEEK);
if(recved <= 0) return -1;

http_parser_execute(&parser, &settings, request, recved);
http_parser_execute(&parser, &settings, *buffer, *buffer_size);
if(HTTP_PARSER_ERRNO(&parser) != HPE_OK) return -1;

// inizializzo l'url parser
http_parser_url_init(&parser_url);
ret = http_parser_parse_url(data.at, data.length, false, &parser_url);
if(ret != 0) return -1;

memset(buffer, 0, buffer_size);
if(parser_url.field_data[field].len >= buffer_size) size = buffer_size-1;
else size = parser_url.field_data[field].len;
strncpy(buffer, data.at + parser_url.field_data[field].off, size);

*buffer = data.at;
*buffer_size = data.length;

return 0;
}

Expand Down
13 changes: 6 additions & 7 deletions libs/http-server/http_server.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,15 +112,14 @@ extern __attribute__((aligned(16))) __attribute__((nonstring)) const char sym[]
*/
int send_http_response(int socket, enum http_status status, const char* header, const char* content, size_t content_lenght);

/**
/**
* @ingroup Http_Utility
* @brief Recupera una parte dell' url da socket
* @param socket Socket tcp dove ricevere i dati
* @param field Campo dell'url
* @param buffer Buffer dove scrivere il campo trovato
* @param buffer_size Dimenzione massima del buffer
* @brief Trova l'url all'intero della richiesta http
* @param buffer Punatore al buffer in cui è contenuta la richiesta http (non è neccessario che sia completa, basta che ci sia almeno url), se l'operazione è andata a buon fine il puntatore punterà all'inizio della stringa dell'url
* @param buffer_size Puntatore alla dimenzione del buffer, se l'operazione è andata a buon fine il puntatore punterà alla dimenzione dell'url
* @return 0 se non ci sono stati errori
*/
int http_get_url_field(int socket, enum http_parser_url_fields field, char* buffer, size_t buffer_size);
int http_request_get_url(const char** buffer, size_t* buffer_size);

/* HTTP SERVER TYPES ***************************************************************************/

Expand Down

0 comments on commit 844387b

Please sign in to comment.