Skip to content

Commit

Permalink
Merge pull request #97 from smatsuodev/refactor-request-reader
Browse files Browse the repository at this point in the history
RequestReader を state pattern で refactor
  • Loading branch information
harsssh authored Jan 10, 2025
2 parents ceee136 + eae4917 commit 90e56f8
Show file tree
Hide file tree
Showing 17 changed files with 681 additions and 334 deletions.
337 changes: 286 additions & 51 deletions .idea/editor.xml

Large diffs are not rendered by default.

12 changes: 10 additions & 2 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,6 @@ add_library(webserv_lib STATIC
lib/http/request/request_parser.hpp
lib/core/handler/read_request_handler.cpp
lib/core/handler/read_request_handler.hpp
lib/core/handler/request_reader.cpp
lib/core/handler/request_reader.hpp
lib/core/server_state.cpp
lib/core/server_state.hpp
lib/http/header.hpp
Expand Down Expand Up @@ -85,6 +83,16 @@ add_library(webserv_lib STATIC
lib/http/handler/delete_file_handler.cpp
lib/http/handler/delete_file_handler.hpp
lib/utils/auto_deleter.hpp
lib/http/request/reader/request_reader.cpp
lib/http/request/reader/request_reader.hpp
lib/http/request/reader/reading_request_line_state.cpp
lib/http/request/reader/reading_request_line_state.hpp
lib/http/request/reader/utils.cpp
lib/http/request/reader/utils.hpp
lib/http/request/reader/reading_headers_state.cpp
lib/http/request/reader/reading_headers_state.hpp
lib/http/request/reader/reading_body_state.cpp
lib/http/request/reader/reading_body_state.hpp
)
# lib/ を include path に追加
# PUBLIC にすると、依存するターゲットにも反映される
Expand Down
12 changes: 11 additions & 1 deletion src/lib/core/handler/read_request_handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ IEventHandler *writeResponseHandlerFactory(const http::Response &res) {
}

ReadRequestHandler::ReadRequestHandler(const VirtualServerResolver &vsResolver)
: resolver_(new RequestReader::ConfigResolver(vsResolver)), reqReader_(*resolver_) {}
: resolver_(new ConfigResolver(vsResolver)), reqReader_(*resolver_) {}

IEventHandler::InvokeResult ReadRequestHandler::invoke(const Context &ctx) {
LOG_DEBUG("start ReadRequestHandler");
Expand All @@ -31,3 +31,13 @@ IEventHandler::InvokeResult ReadRequestHandler::invoke(const Context &ctx) {

return Ok(actions);
}

ConfigResolver::ConfigResolver(const VirtualServerResolver &vsResolver) : resolver_(vsResolver) {}

Option<config::ServerContext> ConfigResolver::resolve(const std::string &host) const {
const Option<Ref<VirtualServer> > vs = resolver_.resolve(host);
if (vs.isNone()) {
return None;
}
return Some(vs.unwrap().get().getServerConfig());
}
16 changes: 13 additions & 3 deletions src/lib/core/handler/read_request_handler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
#define SRC_LIB_CORE_HANDLER_READ_REQUEST_HANDLER_HPP

#include "event/event_handler.hpp"
#include "request_reader.hpp"
#include "http/request/reader/request_reader.hpp"
#include "../virtual_server_resolver.hpp"
#include <memory>

class ReadRequestHandler : public IEventHandler {
Expand All @@ -11,8 +12,17 @@ class ReadRequestHandler : public IEventHandler {
InvokeResult invoke(const Context &ctx);

private:
std::auto_ptr<RequestReader::IConfigResolver> resolver_; // RequestReader に渡す参照先として必要
RequestReader reqReader_;
std::auto_ptr<http::IConfigResolver> resolver_; // RequestReader に渡す参照先として必要
http::RequestReader reqReader_;
};

class ConfigResolver : public http::IConfigResolver {
public:
explicit ConfigResolver(const VirtualServerResolver &vsResolver);
Option<config::ServerContext> resolve(const std::string &host) const;

private:
VirtualServerResolver resolver_;
};

#endif
197 changes: 0 additions & 197 deletions src/lib/core/handler/request_reader.cpp

This file was deleted.

69 changes: 0 additions & 69 deletions src/lib/core/handler/request_reader.hpp

This file was deleted.

23 changes: 23 additions & 0 deletions src/lib/http/request/reader/reading_body_state.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#include "reading_body_state.hpp"
#include "core/virtual_server.hpp"
#include "utils/logger.hpp"
#include "utils/types/try.hpp"

http::ReadingBodyState::ReadingBodyState(RequestReader &reader, const std::size_t contentLength)
: reader_(reader), contentLength_(contentLength) {}

Result<http::RequestReader::IState::HandleStatus, error::AppError> http::ReadingBodyState::handle(ReadBuffer &readBuf) {
while (body_.size() < contentLength_) {
const std::size_t want = contentLength_ - body_.size();
const std::string chunk = readBuf.consume(want);
if (chunk.empty()) {
return Ok(HandleStatus::kSuspend);
}
body_ += chunk;
}

reader_.setBody(body_);
reader_.changeState(NULL);

return Ok(HandleStatus::kDone);
}
19 changes: 19 additions & 0 deletions src/lib/http/request/reader/reading_body_state.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#ifndef SRC_LIB_HTTP_REQUEST_READER_READING_BODY_STATE_HPP
#define SRC_LIB_HTTP_REQUEST_READER_READING_BODY_STATE_HPP

#include "./request_reader.hpp"

namespace http {
class ReadingBodyState : public RequestReader::IState {
public:
ReadingBodyState(RequestReader &reader, std::size_t contentLength);
Result<HandleStatus, error::AppError> handle(ReadBuffer &readBuf);

private:
RequestReader &reader_;
std::size_t contentLength_;
std::string body_;
};
}

#endif
Loading

0 comments on commit 90e56f8

Please sign in to comment.