Skip to content

Commit

Permalink
🐛 fix: cgi file upload #27
Browse files Browse the repository at this point in the history
  • Loading branch information
kyoshong committed May 25, 2022
1 parent fe09df4 commit b38faaa
Show file tree
Hide file tree
Showing 12 changed files with 6,302 additions and 331 deletions.
13 changes: 11 additions & 2 deletions request/Request.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,10 @@ std::string Request::getServerName() const {

std::string Request::getContentType() const
{
if (_request_header.find("content-type") == _request_header.end()) {
if (_request_header.find("Content-Type") == _request_header.end()) {
return "text/plain";
}
return getRequestHeader()["content-type"];
return getRequestHeader()["Content-Type"];
}

std::string Request::getMethod() const { return _method; }
Expand Down Expand Up @@ -178,6 +178,7 @@ int Request::parseRequestLine()
size_t pos;

get_line = ft_fgets_line(getSocketReadFP());
_request_main += get_line;
if (get_line == "" || get_line == "\r\n")
return ERROR;

Expand Down Expand Up @@ -214,6 +215,8 @@ int Request::parseRequestHeader()
std::vector<std::string> key_value;

get_line = ft_fgets_line(getSocketReadFP());
_request_main += get_line;

if (get_line == "" || get_line == "\r\n")
{
_stage = READ_REQUEST_BODY;
Expand Down Expand Up @@ -245,6 +248,8 @@ int Request::parseRequestBody()
else
{
_request_body += (std::string(line));
_request_main += (std::string(line));

}
return SUCCESS;
}
Expand Down Expand Up @@ -305,3 +310,7 @@ void Request::setRoute(std::vector<ConfigLocation> const &locations)
}
}
}
std::string Request::getRequestMain() const
{
return _request_main;
}
2 changes: 2 additions & 0 deletions request/Request.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class Request
std::string _query;
std::string _protocol;
std::string _request_body;
std::string _request_main;
std::map<std::string, std::string> _request_header;
ConfigLocation *_route;
std::string _file; // 라우팅 경로를 제외한 파일 // _route->getUrl() + _file = _path;
Expand All @@ -47,6 +48,7 @@ class Request
std::string getContentType() const;
std::string getProtocol() const;
std::string getRequestBody() const;
std::string getRequestMain() const;
std::map<std::string, std::string> getRequestHeader() const;
RequestStage getRequestStage() const;
ConfigLocation *getRoute() const;
Expand Down
34 changes: 17 additions & 17 deletions response/CgiHandler.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include "CgiHandler.hpp"
#include "Server.hpp"
CgiHandler::CgiHandler(){}
CgiHandler::CgiHandler(ConfigLocation *location_info, ClientSocket *cs)
CgiHandler::CgiHandler(ConfigLocation *location_info, ClientSocket *cs)
: _location_info(location_info), _client_socket(cs)
{
cgiInitEnv();
Expand All @@ -25,36 +25,38 @@ std::string getIp(int fd)
void CgiHandler::cgiInitEnv()
{
std::string extension = _client_socket->getRequest()->getPath().substr(_client_socket->getRequest()->getPath().rfind(".") + 1);
if (_client_socket->getRequest()->getRequestHeader().count("Authorization") == 1)
{
_cgi_env["AUTH_TYPE"] = _client_socket->getRequest()->getRequestHeader()["Authorization"];
}
_cgi_env["SERVER_PROTOCOL"] = "HTTP/1.1";
_cgi_env["GATEWAY_INTERFACE"] = "CGI/1.1";
_cgi_env["SERVER_SOFTWARE"] = "nginx server designed by sma";
_cgi_env["REQUEST_METHOD"] = _client_socket->getRequest()->getMethod();
_cgi_env[std::string("LANG")] = std::string(std::getenv("LANG"));
_cgi_env[std::string("REQUEST_SCHEME")] = _client_socket->getRequest()->getMethod();
_cgi_env["REQUEST_SCHEME"] = _client_socket->getRequest()->getMethod();


_cgi_env["SERVER_PORT"] = _client_socket->getRequest()->getPort();
_cgi_env["SERVER_NAME"] = _client_socket->getRequest()->getServerName();
_cgi_env["PATH_INFO"] = _client_socket->getRequest()->getPath();
std::cerr << "PATH_INFO : " << _client_socket->getRequest()->getPath() << std::endl;;
_cgi_env[std::string("DOCUMENT_ROOT")] = _location_info->getCommonDirective()._cgi_path[extension];
std::cerr << "? : " << _client_socket->getRequest()->getQuery() << std::endl;;

_cgi_env[std::string("REQUEST_URI")] = _client_socket->getRequest()->getPath() + (_client_socket->getRequest()->getQuery().size() > 0 ? ("?" + _client_socket->getRequest()->getQuery()) : ""); // 리퀘스트에 명시된 전체 주소가 들어가야 함
std::cerr << "PATH_INFO : " << _cgi_env[std::string("REQUEST_URI")] << std::endl;
_cgi_env["DOCUMENT_ROOT"] = _location_info->getCommonDirective()._cgi_path[extension];

_cgi_env[std::string("DOCUMENT_URI")] = _client_socket->getRequest()->getPath() + (_client_socket->getRequest()->getQuery().size() > 0 ? ("?" + _client_socket->getRequest()->getQuery()) : "");; // 리퀘스트에 명시된 전체 주소가 들어가야 함
_cgi_env["DOCUMENT_URI"] = _client_socket->getRequest()->getPath() + (_client_socket->getRequest()->getQuery().size() > 0 ? ("?" + _client_socket->getRequest()->getQuery()) : "");; // 리퀘스트에 명시된 전체 주소가 들어가야 함
_cgi_env["REQUEST_URI"] = _client_socket->getRequest()->getPath() + (_client_socket->getRequest()->getQuery().size() > 0 ? ("?" + _client_socket->getRequest()->getQuery()) : ""); // 리퀘스트에 명시된 전체 주소가 들어가야 함
_cgi_env["SCRIPT_NAME"] = _client_socket->getRequest()->getRoute()->getCommonDirective()._root + _client_socket->getRequest()->getPath(); // 실행파일 전체 주소가 들어가야함
std::cerr << "SCRIPT_NAME : " << _cgi_env[std::string("SCRIPT_NAME")] << std::endl;

_cgi_env["SCRIPT_FILENAME"] = _client_socket->getRequest()->getRoute()->getCommonDirective()._root + _client_socket->getRequest()->getPath();// 실행파일 전체 주소가 들어가야함
_cgi_env["QUERY_STRING"] = _client_socket->getRequest()->getQuery();
_cgi_env["REMOTE_ADDR"] = getIp(_client_socket->getRequest()->getSocketFD());
_cgi_env["REDIRECT_STATUS"] = "200";
_cgi_env["PHP_SELF"] = _client_socket->getRequest()->getPath();
_cgi_env["CONTENT_LENGTH"] = _client_socket->getRequest()->getRequestHeader()["content_length"];
if (_client_socket->getRequest()->getRequestBody().size() > 0)
_cgi_env["CONTENT_LENGTH"] = std::to_string(_client_socket->getRequest()->getRequestBody().size());
// _cgi_env["CONTENT_LENGTH"] = _client_socket->getRequest()->getRequestHeader()["Content-Length"];

_cgi_env["CONTENT_TYPE"] = _client_socket->getRequest()->getContentType();
// _cgi_env["REQUEST_URI"] = _client_socket->getRequest()->getPath() + "?" + _client_socket->getRequest()->getQuery();
for (std::map<std::string, std::string>::iterator it = _cgi_env.begin(); it != _cgi_env.end(); it++)
{
std::cout << it->first << " : " << it->second << std::endl;
}
}

char **CgiHandler::convertEnv()
Expand Down Expand Up @@ -147,8 +149,6 @@ int CgiHandler::executeCgi()
close(read_fd[1]);
_client_socket->getResource()->setReadFd(read_fd[0]);
_client_socket->getResource()->setWriteFd(write_fd[1]);
std::cerr << "response read_fd: " << read_fd[0] << std::endl;
std::cerr << "response write_fd: " << write_fd[1] << std::endl;
}
return status;
}
Loading

0 comments on commit b38faaa

Please sign in to comment.