Skip to content

Commit d2cb737

Browse files
committed
DefaultRoot functionality almost finished. Tasker added to the Looper
1 parent 2c17a9d commit d2cb737

20 files changed

+173
-20
lines changed

Diff for: Responses/responseblank.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ std::shared_ptr<std::string> ResponseBlank::getHeaderText() throw(BadResponse)
3333

3434
std::shared_ptr<std::string> ResponseBlank::getContentText()
3535
{
36-
36+
return content;
3737
}
3838
std::string ResponseBlank::getHttpVersion() const
3939
{

Diff for: Responses/responsebuilder.cpp

+32-3
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,53 @@
22

33
ResponseBuilder::ResponseBuilder()
44
{
5+
response200.reset(new ResponseBlank);
6+
response200->setConnection("close");
7+
response200->setHttpVersion("1.1");
8+
response200->setServer("HighLoadServer.0.1");
9+
response200->setResponseCode("200 OK");
10+
11+
response400.reset(new ResponseBlank);
12+
13+
response405.reset(new ResponseBlank);
14+
15+
response404.reset(new ResponseBlank);
16+
17+
518
}
619

7-
std::shared_ptr<Response> ResponseBuilder::getResponse404()
20+
std::shared_ptr<ResponseBlank> ResponseBuilder::getResponse404()
821
{
22+
std::shared_ptr<ResponseBlank> response(new ResponseBlank);
23+
*response = *response404;
924

25+
return response;
1026
}
1127

12-
std::shared_ptr<Response> ResponseBuilder::getResponse200()
28+
std::shared_ptr<ResponseBlank> ResponseBuilder::getResponse200()
1329
{
30+
std::shared_ptr<ResponseBlank> response(new ResponseBlank);
31+
*response = *response200;
1432

33+
return response;
1534
}
1635

17-
std::shared_ptr<Response> ResponseBuilder::getResponse405()
36+
std::shared_ptr<ResponseBlank> ResponseBuilder::getResponse405()
1837
{
38+
std::shared_ptr<ResponseBlank> response(new ResponseBlank);
39+
*response = *response405;
1940

41+
return response;
2042
}
2143

2244
std::shared_ptr<ResponseBlank> ResponseBuilder::getResponseBlank()
2345
{
2446
return std::shared_ptr<ResponseBlank>(new ResponseBlank);
2547
}
48+
std::shared_ptr<ResponseBlank> ResponseBuilder::getResponse403() const
49+
{
50+
return response403;
51+
}
52+
53+
54+

Diff for: Responses/responsebuilder.h

+11-3
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,18 @@ class ResponseBuilder
88
{
99
public:
1010
ResponseBuilder();
11-
std::shared_ptr<Response> getResponse404();
12-
std::shared_ptr<Response> getResponse200();
13-
std::shared_ptr<Response> getResponse405();
11+
std::shared_ptr<ResponseBlank> getResponse404();
12+
std::shared_ptr<ResponseBlank> getResponse200();
13+
std::shared_ptr<ResponseBlank> getResponse405();
1414
std::shared_ptr<ResponseBlank> getResponseBlank();
15+
std::shared_ptr<ResponseBlank> getResponse403() const;
16+
17+
private:
18+
std::shared_ptr<ResponseBlank> response200;
19+
std::shared_ptr<ResponseBlank> response404;
20+
std::shared_ptr<ResponseBlank> response403;
21+
std::shared_ptr<ResponseBlank> response405;
22+
std::shared_ptr<ResponseBlank> response400;
1523
};
1624

1725
#endif // RESPONSEBUILDER_H

Diff for: Tests/googletest/Mocks/mockparsedrequest.h

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class MockParsedRequest : public ParsedRequest
1414
MOCK_METHOD0(getUrl, std::string());
1515
MOCK_METHOD0(getHttpVersion, std::string());
1616
MOCK_METHOD1(getField, std::string(std::string));
17+
MOCK_METHOD0(getRequest, std::shared_ptr<Request>());
1718
};
1819

1920
#endif // MOCKPARSEDREQUEST_H

Diff for: Tests/googletest/Mocks/mockrequest.h

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class MockRequest : public Request
1818
MOCK_METHOD1(setOutputBuffer, void( bufferevent*));
1919
MOCK_METHOD0(getOutputBuffer, bufferevent*());
2020

21+
2122
};
2223

2324
#endif // MOCKREQUEST_H

Diff for: allForLibevent.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
#include "settings.h"
1515
#include "getid.h"
1616
#include "threadsafe_queque.h"
17-
#include "looper.h"
1817
#include "outputable.h"
1918
#include "request.h"
2019
#include "request_impl.h"
@@ -33,5 +32,6 @@
3332
#include "worker.h"
3433
#include "simpletask.h"
3534
#include "tasker.h"
35+
#include "looper.h"
3636

3737
#endif // ALLFORLIBEVENT_H

Diff for: defaultrule.cpp

+92-2
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,102 @@ void DefaultRule::operateRequest(std::shared_ptr<ParsedRequest> parsedRequest)
2323
std::string filePath = Settings::ROOT + parsedRequest->getUrl();
2424
boost::filesystem::path path(filePath);
2525

26-
27-
2826
if(path.compare(Settings::ROOT) == -1)
2927
{
28+
std::shared_ptr<ResponseBlank> response = getResponseBuilder()->getResponse403();
29+
std::shared_ptr<std::string> content(new std::string("403. Distanation is Forbidden: " + parsedRequest->getUrl()));
30+
response->setContentType("text/html");
31+
response->setContent(content);
32+
sendResponse(parsedRequest, response);
33+
}
34+
else
35+
{
36+
if(boost::filesystem::exists(path))
37+
{
38+
if(boost::filesystem::is_regular_file(path))
39+
{
40+
if(boost::filesystem::file_size(path)<Settings::MAX_FILE_SIZE)
41+
{
42+
std::ifstream is("/home/constantine/HTTProot/test.txt", std::ifstream::binary);
43+
if(is)
44+
{
45+
std::shared_ptr<ResponseBlank> response = (getResponseBuilder())->getResponse200();
46+
47+
is.seekg(0, is.end);
48+
int length = is.tellg();
49+
is.seekg(0, is.beg);
50+
51+
std::shared_ptr<std::string> content(new std::string);
52+
content->reserve(length);
53+
char* buffer = new char[length];
54+
is.read (buffer, length);
55+
*content = std::move(std::string(buffer));
56+
57+
response->setContent(content);
3058

59+
boost::regex ext_re(".?*/?(.*)$");
60+
boost::smatch matcher;
61+
boost::regex_search(parsedRequest->getUrl(),matcher,ext_re);
62+
63+
std::string ext = matcher[1].str();
64+
if(ext == ".html")
65+
response->setContentType("text/html");
66+
else if(ext == ".css")
67+
response->setContentType("text/css");
68+
else if(ext == ".js")
69+
response->setContentType("text/javascript");
70+
else if(ext == ".png")
71+
response->setContentType("text/png");
72+
else if(ext == ".gif")
73+
response->setContentType("text/gif");
74+
else if(ext == ".swf")
75+
response->setContentType("application/x-shockwave-flash");
76+
else if(ext == ".jpeg" || ext==".jpg")
77+
response->setContentType("image/jpeg");
78+
else
79+
response->setContentType("text/plain");
80+
81+
sendResponse(parsedRequest, response);
82+
}
83+
84+
//
85+
// std::shared_ptr<std::string> content(new std::string);
86+
//const char** str_buf = &content->c_str();
87+
// = buffer;
88+
}
89+
else
90+
{
91+
std::shared_ptr<ResponseBlank> response = (getResponseBuilder())->getResponse405();
92+
std::shared_ptr<std::string> content(new std::string("405. Method not allowed: "+ parsedRequest->getUrl()));
93+
response->setContent(content);
94+
response->setContentType("text/html");
95+
sendResponse(parsedRequest, response);
96+
}
97+
}
98+
else
99+
{
100+
std::shared_ptr<ResponseBlank> response = (getResponseBuilder())->getResponse405();
101+
std::shared_ptr<std::string> content(new std::string("405. Method not allowed: "+ parsedRequest->getUrl()));
102+
response->setContent(content);
103+
response->setContentType("text/html");
104+
sendResponse(parsedRequest, response);
105+
}
106+
}
107+
else
108+
{
109+
std::shared_ptr<ResponseBlank> response = getResponseBuilder()->getResponse404();
110+
std::shared_ptr<std::string> content(new std::string("404. Page not found: "+ parsedRequest->getUrl()));
111+
response->setContentType("text/html");
112+
response->setContent(content);
113+
sendResponse(parsedRequest, response);
114+
}
31115
}
32116

33117

34118
}
119+
120+
void DefaultRule::sendResponse(std::shared_ptr<ParsedRequest> parsedRequest, std::shared_ptr<Response> response)
121+
{
122+
bufferevent_write(parsedRequest->getRequest()->getOutputBuffer(),response->getHeaderText()->c_str(),response->getHeaderText()->length());
123+
bufferevent_write(parsedRequest->getRequest()->getOutputBuffer(),response->getContentText()->c_str(),response->getContentText()->length());
124+
}

Diff for: defaultrule.h

+3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#ifndef DEFAULTRULE_H
22
#define DEFAULTRULE_H
33
#include "allForLibevent.h"
4+
#include <boost/regex.hpp>
45
#include <boost/filesystem.hpp>
56

67
class DefaultRule : public Rule
@@ -11,6 +12,8 @@ class DefaultRule : public Rule
1112
virtual bool isMatching(std::string url);
1213
virtual bool isFinal();
1314
virtual void operateRequest(std::shared_ptr<ParsedRequest> parsedRequest);
15+
private:
16+
void sendResponse(std::shared_ptr<ParsedRequest> parsedRequest, std::shared_ptr<Response> response);
1417
};
1518

1619
#endif // DEFAULTRULE_H

Diff for: looper.cpp

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "looper.h"
22

3+
Tasker* Looper::tasker = new Tasker;
34

45
const Looper *Looper::Instance(int port)
56
{
@@ -38,6 +39,7 @@ base = event_base_new();
3839

3940

4041

42+
4143
}
4244

4345

@@ -65,10 +67,13 @@ void Looper::accept_connection_cb( struct evconnlistener *listener,
6567

6668
void Looper::echo_read_cb( struct bufferevent *buf_ev, void *arg )
6769
{
68-
struct evbuffer *buf_input = bufferevent_get_input( buf_ev );
69-
struct evbuffer *buf_output = bufferevent_get_output( buf_ev );
70+
//struct evbuffer *buf_input = bufferevent_get_input( buf_ev );
71+
//struct evbuffer *buf_output = bufferevent_get_output( buf_ev );
72+
7073
/* Данные просто копируются из буфера ввода в буфер вывода */
71-
evbuffer_add_buffer( buf_output, buf_input );
74+
//evbuffer_add_buffer( buf_output, buf_input );
75+
76+
tasker->pushTask(new SimpleTask(buf_ev));
7277
}
7378

7479
void Looper::echo_event_cb( struct bufferevent *buf_ev, short events, void *arg )

Diff for: looper.h

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "allForLibevent.h"
55

66

7+
class Tasker;
78
//extern struct evbuffer *bufferevent_get_input(struct bufferevent *bufev);
89

910
class Looper
@@ -14,6 +15,7 @@ class Looper
1415

1516
private:
1617
Looper(int port);
18+
static Tasker* tasker;
1719
static void accept_error_cb( struct evconnlistener *listener, void *arg );
1820
static void accept_connection_cb( struct evconnlistener *listener,
1921
evutil_socket_t fd, struct sockaddr *addr, int sock_len,

Diff for: parsedrequest.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
#ifndef PARSEDREQUEST_H
22
#define PARSEDREQUEST_H
33
#include <string>
4-
4+
#include <memory>
5+
#include "request.h"
56
class ParsedRequest
67
{
78
public:
@@ -12,6 +13,7 @@ class ParsedRequest
1213
virtual std::string getMethod()=0;
1314
virtual std::string getUrl()=0;
1415
virtual std::string getHttpVersion()=0;
16+
virtual std::shared_ptr<Request> getRequest() = 0;
1517
};
1618

1719
#endif // PARSEDREQUEST_H

Diff for: parsedrequest_impl.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,8 @@ std::string ParsedRequest_impl::getHttpVersion()
8787
{
8888
return http_version;
8989
}
90+
91+
std::shared_ptr<Request> ParsedRequest_impl::getRequest()
92+
{
93+
return request;
94+
}

Diff for: parsedrequest_impl.h

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class ParsedRequest_impl : public ParsedRequest
1818
std::string getMethod();
1919
std::string getUrl();
2020
std::string getHttpVersion();
21+
std::shared_ptr<Request> getRequest();
2122
private:
2223
void parse()throw(WrongRequestFormat);
2324
void validate() throw (BadMethod, ForbiddenSimbols);

Diff for: rule.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
#include "rule.h"
22

3+
ResponseBuilder Rule::responseBuilder;

Diff for: rule.h

+6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#ifndef RULE_H
22
#define RULE_H
33
#include "parsedrequest.h"
4+
#include "responsebuilder.h"
45
#include <string>
56
#include <memory>
67

@@ -12,6 +13,11 @@ class Rule
1213
virtual bool isMatching(std::string URL) = 0;
1314
virtual bool isFinal()=0;
1415
virtual void operateRequest(std::shared_ptr<ParsedRequest> parsedRequest) = 0;
16+
ResponseBuilder* getResponseBuilder(){return &responseBuilder;}
17+
18+
private:
19+
static ResponseBuilder responseBuilder;
20+
1521
};
1622

1723
#endif // RULE_H

Diff for: settings.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
std::set<std::string> Settings::ALLOWED_METHODS = {"GET"};
44
std::string Settings::ROOT="/home/constantine/HTTProot";
55
std::string Settings::SERVER_NAME = "HighLoadServer.0.1";
6+
size_t Settings::MAX_FILE_SIZE = 8388608;
67

78
Settings::Settings()
89
{

Diff for: settings.h

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class Settings
2222
//static set<std::string> ALLOWED_REQUEST_HEADERS = {};
2323
static std::string ROOT;
2424
static std::string SERVER_NAME;
25+
static size_t MAX_FILE_SIZE;
2526

2627
};
2728

Diff for: simpletask.cpp

+2-5
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,10 @@ void SimpleTask::operateCompliteRequest(std::shared_ptr<Request> request, Worker
3434
{
3535
std::shared_ptr<ParsedRequestFactory> requestFactory = worker->getParsedRequestFactory();
3636
std::shared_ptr<ParsedRequest> parsedRequest(requestFactory->getParsedRequest(request));
37-
37+
std::shared_ptr<Matcher> matcher = worker->getMatcher();
38+
matcher->execMatchedRules(parsedRequest);
3839
}
3940

40-
void SimpleTask::sendResponse(Response* response)
41-
{
42-
43-
}
4441

4542
size_t SimpleTask::getClientId()
4643
{

Diff for: simpletask.h

-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ class SimpleTask : public Task, public Outputable
1717

1818
private:
1919
void operateCompliteRequest(std::shared_ptr<Request> request, Worker *worker);
20-
void sendResponse(Response* response);
2120
struct bufferevent *buf_ev;
2221
getId<bufferevent> counter;
2322

Diff for: tasker.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Tasker::Tasker()
1616

1717
}
1818
workerIterator = workers.begin();
19+
(*workerIterator)->run();
1920
}
2021

2122
void Tasker::pushTask(Task *task)

0 commit comments

Comments
 (0)