Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
P
pistache
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Libraries
pistache
Commits
01eb1fbf
Commit
01eb1fbf
authored
Aug 14, 2018
by
Nico Caprioli
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'upstream/master'
parents
c20e9ef8
efe54d9e
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
89 additions
and
17 deletions
+89
-17
include/pistache/async.h
include/pistache/async.h
+2
-2
include/pistache/client.h
include/pistache/client.h
+1
-1
include/pistache/date.h
include/pistache/date.h
+3
-2
include/pistache/http.h
include/pistache/http.h
+23
-0
include/pistache/router.h
include/pistache/router.h
+10
-1
src/common/http_header.cc
src/common/http_header.cc
+4
-6
src/common/peer.cc
src/common/peer.cc
+4
-4
src/server/router.cc
src/server/router.cc
+42
-1
No files found.
include/pistache/async.h
View file @
01eb1fbf
...
...
@@ -253,9 +253,9 @@ namespace Async {
template
<
typename
T
>
struct
Continuable
:
public
Request
{
Continuable
(
const
std
::
shared_ptr
<
Core
>&
chain
)
:
chain_
(
chain
)
,
resolveCount_
(
0
)
:
resolveCount_
(
0
)
,
rejectCount_
(
0
)
,
chain_
(
chain
)
{
}
void
resolve
(
const
std
::
shared_ptr
<
Core
>&
core
)
{
...
...
include/pistache/client.h
View file @
01eb1fbf
...
...
@@ -34,9 +34,9 @@ struct Connection : public std::enable_shared_from_this<Connection> {
Connection
()
:
fd
(
-
1
)
,
connectionState_
(
NotConnected
)
,
inflightCount
(
0
)
,
responsesReceived
(
0
)
,
connectionState_
(
NotConnected
)
{
state_
.
store
(
static_cast
<
uint32_t
>
(
State
::
Idle
));
}
...
...
include/pistache/date.h
View file @
01eb1fbf
...
...
@@ -52,6 +52,7 @@
#include <string>
#include <utility>
#include <type_traits>
#include <memory>
#ifdef __GNUC__
# pragma GCC diagnostic push
...
...
@@ -4232,7 +4233,7 @@ struct fields
weekday
wd
{
7u
};
time_of_day
<
Duration
>
tod
{};
fields
()
=
default
;
fields
()
{}
// = default; // Note: doesn't compile with default
fields
(
year_month_day
ymd_
)
:
ymd
(
ymd_
)
{}
fields
(
weekday
wd_
)
:
wd
(
wd_
)
{}
...
...
@@ -4370,7 +4371,7 @@ scan_keyword(std::basic_istream<CharT, Traits>& is, FwdIter kb, FwdIter ke)
const
unsigned
char
does_match
=
'\2'
;
unsigned
char
statbuf
[
100
];
unsigned
char
*
status
=
statbuf
;
unique_ptr
<
unsigned
char
,
void
(
*
)(
void
*
)
>
stat_hold
(
0
,
free
);
std
::
unique_ptr
<
unsigned
char
,
void
(
*
)(
void
*
)
>
stat_hold
(
0
,
free
);
if
(
nkw
>
sizeof
(
statbuf
))
{
status
=
(
unsigned
char
*
)
malloc
(
nkw
);
...
...
include/pistache/http.h
View file @
01eb1fbf
...
...
@@ -9,7 +9,9 @@
#include <type_traits>
#include <stdexcept>
#include <array>
#include <vector>
#include <sstream>
#include <algorithm>
#include <sys/timerfd.h>
...
...
@@ -103,6 +105,27 @@ namespace Uri {
params
.
clear
();
}
// \brief Return iterator to the beginning of the parameters map
std
::
unordered_map
<
std
::
string
,
std
::
string
>::
const_iterator
parameters_begin
()
const
{
return
params
.
begin
();
}
// \brief Return iterator to the end of the parameters map
std
::
unordered_map
<
std
::
string
,
std
::
string
>::
const_iterator
parameters_end
()
const
{
return
params
.
begin
();
}
// \brief returns all parameters given in the query
std
::
vector
<
std
::
string
>
parameters
()
const
{
std
::
vector
<
std
::
string
>
keys
;
std
::
transform
(
params
.
begin
(),
params
.
end
(),
std
::
back_inserter
(
keys
),
[](
const
std
::
unordered_map
<
std
::
string
,
std
::
string
>::
value_type
&
pair
)
{
return
pair
.
first
;});
return
keys
;
}
private:
//first is key second is value
std
::
unordered_map
<
std
::
string
,
std
::
string
>
params
;
...
...
include/pistache/router.h
View file @
01eb1fbf
...
...
@@ -146,14 +146,21 @@ public:
void
removeRoute
(
Http
::
Method
method
,
std
::
string
resource
);
void
addCustomHandler
(
Route
::
Handler
handler
);
void
addNotFoundHandler
(
Route
::
Handler
handler
);
inline
bool
hasNotFoundHandler
()
{
return
notFoundHandler
!=
nullptr
;
}
void
invokeNotFoundHandler
(
const
Http
::
Request
&
req
,
Http
::
ResponseWriter
resp
)
const
;
Route
::
Status
route
(
const
Http
::
Request
&
request
,
Http
::
ResponseWriter
response
);
Route
::
Status
route
(
const
Http
::
Request
&
request
,
Http
::
ResponseWriter
response
);
Status
route
(
const
Http
::
Request
&
request
,
Http
::
ResponseWriter
response
);
private:
void
addRoute
(
Http
::
Method
method
,
std
::
string
resource
,
Route
::
Handler
handler
);
std
::
unordered_map
<
Http
::
Method
,
FragmentTreeNode
>
routes
;
std
::
vector
<
Route
::
Handler
>
customHandlers
;
Route
::
Handler
notFoundHandler
;
};
namespace
Private
{
...
...
@@ -207,6 +214,8 @@ namespace Routes {
void
Options
(
Router
&
router
,
std
::
string
resource
,
Route
::
Handler
handler
);
void
Remove
(
Router
&
router
,
Http
::
Method
method
,
std
::
string
resource
);
void
NotFound
(
Router
&
router
,
Route
::
Handler
handler
);
namespace
details
{
template
<
class
...
Args
>
struct
TypeList
...
...
src/common/http_header.cc
View file @
01eb1fbf
...
...
@@ -122,11 +122,6 @@ CacheControl::parseRaw(const char* str, size_t len) {
RawStreamBuf
<>
buf
(
const_cast
<
char
*>
(
str
),
len
);
StreamCursor
cursor
(
&
buf
);
const
char
*
begin
=
str
;
auto
memsize
=
[
&
](
size_t
s
)
{
return
std
::
min
(
s
,
cursor
.
remaining
());
};
do
{
bool
found
=
false
;
...
...
@@ -143,7 +138,6 @@ CacheControl::parseRaw(const char* str, size_t len) {
if
(
!
found
)
{
for
(
const
auto
&
d
:
TimedDirectives
)
{
if
(
match_raw
(
d
.
str
,
d
.
size
,
cursor
))
{
int
c
;
if
(
!
cursor
.
advance
(
1
))
{
throw
std
::
runtime_error
(
"Invalid caching directive, missing delta-seconds"
);
}
...
...
@@ -211,6 +205,7 @@ CacheControl::write(std::ostream& os) const {
case
CacheDirective
:
:
Ext
:
return
""
;
}
return
""
;
};
auto
hasDelta
=
[](
CacheDirective
directive
)
{
...
...
@@ -282,6 +277,9 @@ Connection::write(std::ostream& os) const {
case
ConnectionControl
:
:
KeepAlive
:
os
<<
"Keep-Alive"
;
break
;
case
ConnectionControl
:
:
Ext
:
os
<<
"Ext"
;
break
;
}
}
...
...
src/common/peer.cc
View file @
01eb1fbf
...
...
@@ -18,14 +18,14 @@ namespace Tcp {
using
namespace
std
;
Peer
::
Peer
()
:
fd_
(
-
1
)
,
transport_
(
nullptr
)
:
transport_
(
nullptr
)
,
fd_
(
-
1
)
{
}
Peer
::
Peer
(
const
Address
&
addr
)
:
addr
(
addr
)
:
transport_
(
nullptr
)
,
addr
(
addr
)
,
fd_
(
-
1
)
,
transport_
(
nullptr
)
{
}
Address
...
...
src/server/router.cc
View file @
01eb1fbf
...
...
@@ -286,6 +286,32 @@ Pistache::Rest::FragmentTreeNode::invokeRouteHandler(const Http::Request& req, H
return
invokeRouteHandler
(
path
,
req
,
std
::
move
(
response
),
params
,
splats
);
}
catch
(
std
::
runtime_error
&
)
{
return
Route
::
Status
::
NotFound
;
namespace
Private
{
RouterHandler
::
RouterHandler
(
const
Rest
::
Router
&
router
)
:
router
(
router
)
{
}
void
RouterHandler
::
onRequest
(
const
Http
::
Request
&
req
,
Http
::
ResponseWriter
response
)
{
auto
resp
=
response
.
clone
();
auto
result
=
router
.
route
(
req
,
std
::
move
(
resp
));
/* @Feature: add support for a custom NotFound handler */
if
(
result
==
Router
::
Status
::
NotFound
)
{
if
(
router
.
hasNotFoundHandler
())
{
auto
resp2
=
response
.
clone
();
router
.
invokeNotFoundHandler
(
req
,
std
::
move
(
resp2
));
}
else
response
.
send
(
Http
::
Code
::
Not_Found
,
"Could not find a matching route"
);
}
}
...
...
@@ -359,7 +385,18 @@ Router::addCustomHandler(Route::Handler handler) {
customHandlers
.
push_back
(
std
::
move
(
handler
));
}
Route
::
Status
void
Router
::
addNotFoundHandler
(
Route
::
Handler
handler
)
{
notFoundHandler
=
std
::
move
(
handler
);
}
void
Router
::
invokeNotFoundHandler
(
const
Http
::
Request
&
req
,
Http
::
ResponseWriter
resp
)
const
{
notFoundHandler
(
Rest
::
Request
(
std
::
move
(
req
),
std
::
vector
<
TypedParam
>
(),
std
::
vector
<
TypedParam
>
()),
std
::
move
(
resp
));
}
Router
::
Status
Router
::
route
(
const
Http
::
Request
&
req
,
Http
::
ResponseWriter
response
)
{
auto
&
r
=
routes
[
req
.
method
()];
try
{
...
...
@@ -410,8 +447,12 @@ void Options(Router& router, std::string resource, Route::Handler handler) {
router
.
options
(
std
::
move
(
resource
),
std
::
move
(
handler
));
}
void
Remove
(
Router
&
router
,
Http
::
Method
method
,
std
::
string
resource
)
{
router
.
removeRoute
(
method
,
resource
);
void
NotFound
(
Router
&
router
,
Route
::
Handler
handler
)
{
router
.
addNotFoundHandler
(
std
::
move
(
handler
));
}
}
// namespace Routes
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment