-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMiddlewarePipeline.cpp
More file actions
93 lines (82 loc) · 2 KB
/
Copy pathMiddlewarePipeline.cpp
File metadata and controls
93 lines (82 loc) · 2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include "MiddlewarePipeline.h"
#include "Logger.h"
#include "RequestInspector.h"
#include <typeinfo>
#include <cctype>
using namespace std;
MiddlewarePipeline::MiddlewarePipeline()
{
}
void MiddlewarePipeline::use(
shared_ptr<Middleware> middleware)
{
middlewares.push_back(
{
"",
middleware
});
}
void MiddlewarePipeline::use(
const string& prefix,
shared_ptr<Middleware> middleware)
{
middlewares.push_back(
{
prefix,
middleware
});
}
void MiddlewarePipeline::execute(
HttpRequest& request,
HttpResponse& response,
Next finalHandler)
{
executeMiddleware(
0,
request,
response,
finalHandler
);
}
void MiddlewarePipeline::executeMiddleware(
size_t index,
HttpRequest& request,
HttpResponse& response,
Next finalHandler)
{
while(index < middlewares.size())
{
MiddlewareEntry& entry = middlewares[index];
// Run only if:
// 1. Global middleware (prefix == "")
// 2. Request path starts with prefix
if(entry.prefix.empty() ||
request.getPath().rfind(entry.prefix, 0) == 0)
{
string name = typeid(*entry.middleware).name();
if(name.rfind("class ", 0) == 0) name = name.substr(6);
while(!name.empty() && isdigit(static_cast<unsigned char>(name.front()))) name.erase(0, 1);
RequestInspector::current().addPipelineStep(name);
entry.middleware->handle(
request,
response,
[this,
index,
&request,
&response,
finalHandler]()
{
executeMiddleware(
index + 1,
request,
response,
finalHandler
);
});
return;
}
// Skip this middleware
index++;
}
finalHandler();
}