Skip to content

Commit

Permalink
Merge pull request #11 from san-ghun/dev/multi-host
Browse files Browse the repository at this point in the history
Dev/multi host
  • Loading branch information
Taekeundo authored Oct 30, 2024
2 parents 08931a4 + aeed324 commit 214300e
Show file tree
Hide file tree
Showing 36 changed files with 2,317 additions and 1,030 deletions.
5 changes: 4 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,9 @@
"random": "cpp",
"type_traits": "cpp",
"utility": "cpp",
"numbers": "cpp"
"numbers": "cpp",
"ranges": "cpp",
"span": "cpp",
"cinttypes": "cpp"
}
}
3 changes: 3 additions & 0 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,13 @@
"${workspaceFolder}/src/server/Server.cpp",
"${workspaceFolder}/src/server/HttpRequest.cpp",
"${workspaceFolder}/src/server/HttpResponse.cpp",
"${workspaceFolder}/src/server/ErrorResponse.cpp",
"${workspaceFolder}/src/server/Context.cpp",
"${workspaceFolder}/src/server/RequestHandler.cpp",
"${workspaceFolder}/src/server/StaticFileHandler.cpp",
"${workspaceFolder}/src/util/Location.cpp",
"${workspaceFolder}/src/util/Config.cpp",
"${workspaceFolder}/src/util/Util.cpp",
"-o",
"${workspaceFolder}/webserv_test"
],
Expand Down
5 changes: 4 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,12 @@ SRC_NAME = ./src/main.cpp \
./src/server/RequestHandler.cpp \
./src/server/HttpRequest.cpp \
./src/server/HttpResponse.cpp \
./src/server/ErrorResponse.cpp \
./src/server/Context.cpp \
./src/server/StaticFileHandler.cpp \
./src/util/Config.cpp \
./src/util/Location.cpp
./src/util/Location.cpp \
./src/util/Util.cpp

# SRC_NAME = $(shell find ./src -iname "*.cpp")
OBJ_NAME = $(SRC_NAME:.cpp=.o)
Expand Down
79 changes: 62 additions & 17 deletions include/Config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
/* ::: :::::::: */
/* Config.hpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: sanghupa <sanghupa@student.42berlin.de> +#+ +:+ +#+ */
/* By: minakim <minakim@student.42berlin.de> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/06/30 16:23:00 by sanghupa #+# #+# */
/* Updated: 2024/07/22 21:45:18 by sanghupa ### ########.fr */
/* Updated: 2024/08/07 17:26:39 by minakim ### ########.fr */
/* */
/* ************************************************************************** */

Expand All @@ -20,6 +20,37 @@

class Location;

struct LocationConfig
{
std::string path;
std::string root;
std::vector<std::string> allowed_methods;
std::string upload_dir;
bool lsdir;
std::string cgi_ext;
std::string redirection;
std::string default_file;
};

struct ServerConfig
{
std::string server_name;
std::string listen;
std::string host;
int port;
size_t max_body_size;
std::string root;
std::string default_file;
std::string upload_dir;
std::string cgi_dir;
std::map<int, std::string> error_pages;
std::map<std::string, LocationConfig*> map_locations;
std::map<std::string, Location*> map_locationObjs;
};

LocationConfig* new_locationConfig();
ServerConfig* new_serverConfig();

class Config
{
public:
Expand All @@ -35,37 +66,51 @@ class Config
std::string get(const std::string key) const;
int getInt(const std::string key) const;
bool getBool(const std::string key) const;
std::string getServerHost() const;
int getPort() const;
std::string getErrorPage(const int code) const;
Location* getLocation(const std::string key) const;

// TODO: Implement
ServerConfig* getServerByName(const std::string serverName) const;
ServerConfig* getServerByListen(const std::string serverListen) const;
ServerConfig* getServerByHost(const std::string serverHost) const;
ServerConfig* getServerByPort(const int serverPort) const;

// to server class ...?
// std::string getServerHost() const;
// int getPort() const;
// std::string getErrorPage(const int code) const;
// Location* getLocation(const std::string key) const;

std::vector<ServerConfig*> getServers() const;
std::map<std::string, std::string> getMimeTypeMap() const;
std::map<int, std::string> getErrorPageMap() const;
std::map<std::string, std::string> getServerSettingMap() const;
std::map<std::string, Location*> getLocationMap() const;
std::map<std::string, std::string> getConfigMap() const;

// to server class ...?
// std::map<int, std::string> getErrorPageMap() const;
// std::map<std::string, std::string> getServerSettingMap() const;
// std::map<std::string, Location*> getLocationMap() const;

// TODO: Implement
void setServer(ServerConfig* server, std::string line);
void setLocation(Location* location, std::string line);

private:
// Singleton: Private constructor and destructor
Config();
~Config();

void _parseKeyValuePair(const std::string line);
void _parseBlock(std::istream& stream, const std::string& blockName);
void _parseConfigFile(const std::string& filename);
void _setHostPort();
// void _setHostPort();

std::vector<ServerConfig*> _servers;
std::map<std::string, std::string> _mimeTypeMap;
std::map<int, std::string> _errorPageMap;
std::map<std::string, std::string> _serverSettingMap;
std::map<std::string, Location*> _locationMap;
std::map<std::string, std::string> _configMap;

int _port;
std::string _host;
// to server class ...?
// std::map<int, std::string> _errorPageMap;
// std::map<std::string, std::string> _serverSettingMap;
// std::map<std::string, Location*> _locationMap;

// int _port;
// std::string _host;
};

#endif
35 changes: 35 additions & 0 deletions include/Context.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#ifndef CONTEXT_H
#define CONTEXT_H

#include "Config.hpp"
#include "Location.hpp"
#include "HttpRequest.hpp"

std::string getMatchedLocation(const std::string& path, const std::map<std::string, Location*>& locations);
std::string getParentPath(const std::string& path);
std::string normalisePath(const std::string& path);

class Context {
public:
Context(ServerConfig& config, HttpRequest& request);
Context(const Context& other);
~Context();
Context& operator=(const Context& other);
;
const ServerConfig& getServer() const;
const Location& getLocation() const;
const HttpRequest& getRequest() const;

void setRequest(HttpRequest& request);
void setServer(ServerConfig& config);
void setLocation(Location& location);

private:
ServerConfig& _serverConfig;
HttpRequest& _request;
Location& _location;

Location& _findLocation(Context& context) const;
};

#endif // CONTEXT_H
31 changes: 31 additions & 0 deletions include/ErrorResponse.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#ifndef ERRORRESPONSE_HPP
#define ERRORRESPONSE_HPP

#include <string>
#include <map>
#include "Location.hpp"
#include "HttpResponse.hpp"

class Location;
class HttpResponse;
class Context;

struct t_page_detail;

class ErrorResponse : public HttpResponse {
public:
ErrorResponse(const Context& context);
~ErrorResponse();
HttpResponse generateErrorResponse(int code);

private:
std::map<int, t_page_detail> _pageCache;


std::string _getErrorPagePath(int code) const;
std::string _getFullErrorPath(const std::string& path) const;
t_page_detail _fetchPageData(int code);

};

#endif
95 changes: 63 additions & 32 deletions include/HttpRequest.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
/* By: minakim <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/06/30 16:23:00 by sanghupa #+# #+# */
/* Updated: 2024/07/26 12:30:28 by minakim ### ########.fr */
/* Updated: 2024/10/23 11:19:30 by minakim ### ########.fr */
/* */
/* ************************************************************************** */

Expand All @@ -17,51 +17,82 @@
# include <map>
# include <vector>

# include "Util.hpp"

class HttpResponse;


# define WHITESPACE " \t\r\n"
# define NOT_SET 0

struct t_readed_parts {
struct ReadedLines
{
std::string request;
std::vector<std ::string> headers;
std::string body;
bool iscomplete;
t_readed_parts() : iscomplete(false) {}
std::vector<std::string> headers;
std::string bodyLines;
};


class HttpRequest
{
public:
HttpRequest();
~HttpRequest();

bool parse(const std::string& requestData);

std::string getMethod() const;
std::string getUri() const;
std::string getVersion() const;
public:
enum e_body_type
{
RAW,
CHUNKED,
FORM_DATA,
NONE
};

std::map<std::string, std::string> getHeaders() const;
std::string getBody() const;
public:

void setUri(std::string uri);
HttpRequest();
HttpRequest(std::string& data);
~HttpRequest();
bool parse(const std::string& requestData);

std::string getMethod() const;
std::string getUri() const;
std::string getVersion() const;
std::map<std::string, std::string> getHeaders() const;
std::string getBody() const;

size_t getContentLength() const;

void setUri(const std::string& uri);
void setMethod(const std::string& method);
void setVersion(const std::string& version);
void setHeaders(const std::map<std::string, std::string>& headers);
void setBody(const std::vector<std::string>& bodyLines, e_body_type type);
void setBody(const std::string& bodyLines, e_body_type type);
void setContentLength(const ssize_t& contentLength);

bool hasBody() const;

bool isConnectionClose() const;
static std::string trim(const std::string& str);
private:
std::string _method;
std::string _uri;
std::string _version;
std::map<std::string, std::string> _headers;
std::string _body;
bool isConnectionClose() const;
static std::string trim(const std::string& str);

private:
std::string _method; // GET, POST, DELETE
std::string _uri; //
std::string _version; // HTTP/1.1
std::map<std::string, std::string> _headers; // key: value
std::string _body; // raw, chunked, formdata
e_body_type _type; // type of body @see e_body_type
std::pair<bool, size_t> _content; // from Headers["Content-Length"], if not found NOT_SET -1

t_readed_parts _splitRequestData(const std::string& requestData);
bool _parseRequestLine(const std::string requestLine);
bool _parseHeaders(const std::vector<std ::string> headerLines);
bool _parseBody(const std::string bodylines);
std::vector<std ::string> _convertPartToHeaders(std::istringstream& iss);
std::string _convertPartToBody(std::istringstream& iss);

ReadedLines _splitRequestData(const std::string& requestData);

bool _processRequestBody(const std::string& bodyLines);
bool _parseRequestLine(const std::string& requestLine);
bool _parseHeaders(const std::vector<std ::string>& headerLines);

std::vector<std ::string> _convertPartToHeaders(std::istringstream& iss);
std ::string _convertPartToBodyLines(std::istringstream& iss);

};

// TODO: implement "<< operator" for HttpRequest
// std::ostream& operator<<(std::ostream& os, const HttpRequest& request);
#endif
Loading

0 comments on commit 214300e

Please sign in to comment.