patata
This commit is contained in:
parent
5236d71e7e
commit
9d94c4d4e2
5 changed files with 97 additions and 7 deletions
|
|
@ -10,7 +10,7 @@ UTILS_SRCS = src/utils/string/string.c \
|
||||||
src/utils/time/fmt_time.c \
|
src/utils/time/fmt_time.c \
|
||||||
src/utils/parsing/words.c \
|
src/utils/parsing/words.c \
|
||||||
src/utils/parsing/blanks.c \
|
src/utils/parsing/blanks.c \
|
||||||
utils/files/files.c
|
src/utils/files/files.c
|
||||||
MODULES_SRCS = src/config/config.c \
|
MODULES_SRCS = src/config/config.c \
|
||||||
src/server/server.c \
|
src/server/server.c \
|
||||||
src/http/http.c \
|
src/http/http.c \
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,14 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "../utils/files/files.h"
|
||||||
#include "../utils/parsing/words.h"
|
#include "../utils/parsing/words.h"
|
||||||
#include "headers.h"
|
#include "headers.h"
|
||||||
|
|
||||||
|
// === Static variables
|
||||||
|
|
||||||
|
static struct config *config;
|
||||||
|
|
||||||
// === Static functions
|
// === Static functions
|
||||||
|
|
||||||
// Parses the status line of req, stores the result in res and returns the
|
// Parses the status line of req, stores the result in res and returns the
|
||||||
|
|
@ -60,8 +65,29 @@ static ssize_t parse_reqline(struct http_request *res, struct string *req)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void split_target(struct http_request *req)
|
||||||
|
{
|
||||||
|
size_t i = 0;
|
||||||
|
while (i < req->path->size)
|
||||||
|
{
|
||||||
|
if (req->path->data[i] == '?')
|
||||||
|
{
|
||||||
|
req->queries =
|
||||||
|
string_create(req->path->data + i, req->path->size - i);
|
||||||
|
req->path->size = i;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// === Functions
|
// === Functions
|
||||||
|
|
||||||
|
void http_init(struct config *cfg)
|
||||||
|
{
|
||||||
|
config = cfg;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO handle logs and free adequately
|
// TODO handle logs and free adequately
|
||||||
struct http_request *parse_request(struct string *req)
|
struct http_request *parse_request(struct string *req)
|
||||||
{
|
{
|
||||||
|
|
@ -75,6 +101,9 @@ struct http_request *parse_request(struct string *req)
|
||||||
if (nread <= 0)
|
if (nread <= 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
// Split path and query
|
||||||
|
split_target(res);
|
||||||
|
|
||||||
i += nread;
|
i += nread;
|
||||||
|
|
||||||
// Headers
|
// Headers
|
||||||
|
|
@ -85,8 +114,24 @@ struct http_request *parse_request(struct string *req)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
// struct http_response *generate_response(struct http_request *req)
|
// TODO handle logs and free adequately
|
||||||
// {}
|
struct http_response *generate_response(struct http_request *req)
|
||||||
|
{
|
||||||
|
// Check filename
|
||||||
|
if (!check_filename(req->path))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
int err = is_directory(req->path->data);
|
||||||
|
if (err == -1)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (err == 1)
|
||||||
|
{
|
||||||
|
string_concat_str(req->path, "/", 1);
|
||||||
|
string_concat_str(req->path, config->servers->default_file,
|
||||||
|
strlen(config->servers->default_file));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// struct string *format_response(struct http_response *resp)
|
// struct string *format_response(struct http_response *resp)
|
||||||
// {}
|
// {}
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@
|
||||||
// === Includes
|
// === Includes
|
||||||
|
|
||||||
#include "../utils/string/string.h"
|
#include "../utils/string/string.h"
|
||||||
|
#include "../config/config.h"
|
||||||
|
|
||||||
// === Enums
|
// === Enums
|
||||||
|
|
||||||
|
|
@ -43,6 +44,7 @@ struct http_request
|
||||||
{
|
{
|
||||||
enum http_method method;
|
enum http_method method;
|
||||||
struct string *path;
|
struct string *path;
|
||||||
|
struct string *queries;
|
||||||
struct string *protocol;
|
struct string *protocol;
|
||||||
struct http_header *headers; // Headers linked list
|
struct http_header *headers; // Headers linked list
|
||||||
};
|
};
|
||||||
|
|
@ -57,6 +59,14 @@ struct http_response
|
||||||
|
|
||||||
// === Functions
|
// === Functions
|
||||||
|
|
||||||
|
/* @brief Initializes the HTTP module with the given configuration
|
||||||
|
*
|
||||||
|
* @warning Do no use any other function of this module before calling that one
|
||||||
|
*
|
||||||
|
* @param cfg
|
||||||
|
*/
|
||||||
|
void http_init(struct config* cfg);
|
||||||
|
|
||||||
/* @brief Parses the HTTP request and splits it into a request structure
|
/* @brief Parses the HTTP request and splits it into a request structure
|
||||||
*
|
*
|
||||||
* @param req
|
* @param req
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,21 @@
|
||||||
#include "files.h"
|
#include "files.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#include "../string/string.h"
|
#include "../string/string.h"
|
||||||
|
|
||||||
bool file_exists(const char *path)
|
bool file_exists(const char *path)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
bool is_directory(const char *path)
|
int is_directory(const char *path)
|
||||||
{}
|
{
|
||||||
|
struct stat path_stat;
|
||||||
|
if (stat(path, &path_stat) != 0)
|
||||||
|
return S_ISDIR(path_stat.st_mode);
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO handle logging
|
// TODO handle logging
|
||||||
struct string *get_file_content(const char *path)
|
struct string *get_file_content(const char *path)
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,16 @@
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
bool file_exists(const char *path);
|
// bool file_exists(const char *path);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief
|
||||||
|
*
|
||||||
|
* @param path
|
||||||
|
*
|
||||||
|
* @return 1 if path is a directory, 0 if it is not and -1 if path is not valid
|
||||||
|
*/
|
||||||
|
int is_directory(const char* path);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @brief
|
* @brief
|
||||||
|
|
@ -28,7 +37,8 @@ bool file_exists(const char *path);
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
bool is_directory(const char* path);
|
char* get_file(const char* path);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @brief
|
* @brief
|
||||||
|
|
@ -39,4 +49,22 @@ bool is_directory(const char* path);
|
||||||
*/
|
*/
|
||||||
struct string* get_file_content(const char *path);
|
struct string* get_file_content(const char *path);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief
|
||||||
|
*
|
||||||
|
* @param path
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
bool check_filename(struct string* path);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief
|
||||||
|
*
|
||||||
|
* @param path
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
bool sanitize_filename(struct string* filename);
|
||||||
|
|
||||||
#endif // ! FILES_H
|
#endif // ! FILES_H
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue