From a056a923e09bf74b76678907e5475159725e1ac9 Mon Sep 17 00:00:00 2001 From: Talyx Date: Mon, 7 Feb 2022 22:43:14 +0300 Subject: [PATCH] add: download files --- src/Client/Client.cpp | 11 ++++++++++- src/Client/Client.hpp | 3 ++- src/Client/Request.cpp | 19 +++++++++++-------- src/Client/Request.hpp | 7 ++++++- src/Client/Response.cpp | 18 ++++++++++++------ src/Server/Server.cpp | 11 +++++++---- 6 files changed, 48 insertions(+), 21 deletions(-) diff --git a/src/Client/Client.cpp b/src/Client/Client.cpp index aaf65e3..23a1ca9 100644 --- a/src/Client/Client.cpp +++ b/src/Client/Client.cpp @@ -71,6 +71,11 @@ void Client::setRawData(char *str) this->_buff = str; } +void Client::setRawData(std::string &buf) +{ + _stringBUF = buf; +} + void Client::setFd(int fd) { this->_fd = fd; @@ -80,7 +85,8 @@ void Client::setFd(int fd) int Client::parseRequest(void) { - _request.setData(_buff); + // _request.setData(_buff); + _request.setData(_stringBUF); _ret = _request.parseRequest(); return (_ret); @@ -154,6 +160,9 @@ std::string Client::generateRespons(void) _to_send_char = new char[len + 1]; std::memcpy(_to_send_char, _toSend.c_str(), len + 1); + // DBOUT << "len = " << len << ENDL; + // DBOUT << "strlen = " << strlen(_to_send_char) << ENDL; + // DBOUT << "content_lenth = " << _request.getContentLength() << ENDL; return (_toSend); } diff --git a/src/Client/Client.hpp b/src/Client/Client.hpp index 16c2b79..7de17aa 100644 --- a/src/Client/Client.hpp +++ b/src/Client/Client.hpp @@ -23,7 +23,7 @@ private: unsigned int _sended; char *_buff; - + std::string _stringBUF; std::string _bodyToSend; std::string _headerToSend; std::string _toSend; @@ -51,6 +51,7 @@ public: char *getStrToSend(void); unsigned int getCounter(void) const; void setRawData(char *); + void setRawData(std::string &); void setFd(int); int getFd(void); unsigned int getRecvCounter(void) const; diff --git a/src/Client/Request.cpp b/src/Client/Request.cpp index 78a9b74..7130787 100644 --- a/src/Client/Request.cpp +++ b/src/Client/Request.cpp @@ -105,6 +105,12 @@ void Request::setData(char *str) { this->_data = str; } + +void Request::setData(std::string &str) +{ + _stringBUF = str; +} + void Request::setData(char *str, ServerConfig *config) { _data = str; @@ -152,16 +158,12 @@ int Request::parseStartLine(std::string str) if (_version != "HTTP/1.1") _ret = 505; - else if (_method != "GET" && _method != "POST" - && _method != "DELETE") - _ret = 405; return (_ret); } -void Request::splitData(char *data) +void Request::splitData(std::string &data) { int pos; - std::stringstream ss; std::string str; str = std::string(data); @@ -175,7 +177,7 @@ void Request::splitData(char *data) } _head = str.substr(0, pos) + "\n"; _headerSize = _head.size() + 3; - str.erase(0, pos + 4); + data.erase(0, pos + 4); _head_ok = true; parseHeader(); if (_contentLength == 0) @@ -185,7 +187,8 @@ void Request::splitData(char *data) return ; else if (!_body_ok) { - _body += str; + + _body.insert(_body.end(), data.begin(), data.end()); if ((_received - _headerSize) == _contentLength) { _body_ok = true; @@ -241,7 +244,7 @@ int Request::parseHeader(void) int Request::parseRequest(void) { if (!_head_ok || !_body_ok) - splitData(_data); + splitData(_stringBUF); return (_ret); } diff --git a/src/Client/Request.hpp b/src/Client/Request.hpp index 6bae5ca..241f5df 100644 --- a/src/Client/Request.hpp +++ b/src/Client/Request.hpp @@ -9,6 +9,7 @@ class Request { private: char *_data; + char *_pointerBody; int _ret; int _row; @@ -29,6 +30,7 @@ private: std::string _connection; std::map _headerField; + std::string _stringBUF; ServerConfig *_config; bool _head_ok; bool _body_ok; @@ -49,11 +51,14 @@ public: unsigned int getContentLength(void) const; unsigned int getHeaderSize(void) const; unsigned int getRecved(void)const; + char *getPointerBody(void)const; + std::map getClientFields(void); bool getChunked(void); void setConfig(ServerConfig *config); void setData(char *); + void setData(std::string &); void setData(char *, ServerConfig *); public: @@ -75,7 +80,7 @@ public: bool autoindexOn(void); void copyFromMap(void); void clear(void); - void splitData(char *); + void splitData(std::string &); void increaseRecvCounter(unsigned int n); ~Request(); diff --git a/src/Client/Response.cpp b/src/Client/Response.cpp index 93006f2..2014773 100644 --- a/src/Client/Response.cpp +++ b/src/Client/Response.cpp @@ -49,7 +49,9 @@ void Response::setHeaderBlocks(void) } void Response::setContentType(void) { - if (_request.badCode(_code)) + if (_code == 204) + return ; + else if (_request.badCode(_code)) _contentType = "text/html"; else _contentType = getContentType(); @@ -254,7 +256,8 @@ void Response::generateHeader(void) std::string tmp; ss << "HTTP/1.1" << " " << _code << " " << getReasonPhrase(_code) << "\r\n"; - ss << "Content-Type: " << _contentType << "\r\n"; + if (!_contentType.empty()) + ss << "Content-Type: " << _contentType << "\r\n"; ss << "Content-Length: " << _contentLength << "\r\n"; ss << "Server: " << _server << "\r\n"; if (!_keepAlive.empty()) @@ -273,10 +276,10 @@ void Response::generate() invalidClient(); else if (_request.getMethod() == "GET") methodGet(); - // else if (_request.getMethod() == "POST") - // methodPost(); - // else - // methodDelete(); + else if (_request.getMethod() == "DELETE") + methodDelete(); + else + methodPost(); } void Response::generate2(void) @@ -325,6 +328,9 @@ void Response::methodGet(void) } void Response::methodPost(void) { + std::ofstream outfile(_fullURI.c_str(), std::ios::out | std::ios::binary); + + outfile.write(_request.getBody().data(), _request.getBody().size()); _code = 204; setHeaderBlocks(); generateHeader(); diff --git a/src/Server/Server.cpp b/src/Server/Server.cpp index dbdeabd..30c51b9 100644 --- a/src/Server/Server.cpp +++ b/src/Server/Server.cpp @@ -87,18 +87,21 @@ void Server::readSocket(Client &client, int fd) int status; int bytes_read; - char buf[BUFFSIZE + 1]; + // char buf[BUFFSIZE + 1]; + std::string stringBUF(BUFFSIZE, 0); DBOUT << TURQ << "IN readSocket" << ENDL; DBOUT << "client in readSocket "<< &client << ENDL; - bytes_read = recv(fd, buf, BUFFSIZE, 0); + bytes_read = recv(fd, &stringBUF[0], BUFFSIZE, 0); if (bytes_read == 0) { client.allRead = true; return; } - buf[bytes_read + 1] = '\0'; - client.setRawData(buf); + // buf[bytes_read + 1] = '\0'; + stringBUF.erase(bytes_read, stringBUF.size()); + client.setRawData(stringBUF); + // client.setRawData(buf); client.increaseRecvCounter(bytes_read); status = client.parseRequest(); // client_map[fd].printClientInfo();