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
0d2e65a1
Commit
0d2e65a1
authored
Sep 03, 2018
by
Ian Roddis
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Adding test case, moving max payload size to Tcp::Handler to try and help with cloning
parent
4e45bc59
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
177 additions
and
15 deletions
+177
-15
include/pistache/http.h
include/pistache/http.h
+0
-8
include/pistache/router.h
include/pistache/router.h
+5
-1
include/pistache/tcp.h
include/pistache/tcp.h
+10
-3
src/common/tcp.cc
src/common/tcp.cc
+7
-0
src/server/router.cc
src/server/router.cc
+14
-2
tests/CMakeLists.txt
tests/CMakeLists.txt
+2
-1
tests/payload_test.cc
tests/payload_test.cc
+139
-0
No files found.
include/pistache/http.h
View file @
0d2e65a1
...
...
@@ -791,12 +791,6 @@ namespace Private {
class
Handler
:
public
Tcp
::
Handler
{
public:
Handler
()
:
maxPayload_
(
Const
::
DefaultMaxPayload
)
{}
Handler
(
size_t
maxPayload
)
:
maxPayload_
(
maxPayload
)
{
}
size_t
getMaxPayload
()
{
return
maxPayload_
;
}
void
setMaxPayload
(
size_t
sz
)
{
maxPayload_
=
sz
;
}
void
onInput
(
const
char
*
buffer
,
size_t
len
,
const
std
::
shared_ptr
<
Tcp
::
Peer
>&
peer
);
void
onConnection
(
const
std
::
shared_ptr
<
Tcp
::
Peer
>&
peer
);
...
...
@@ -810,8 +804,6 @@ public:
private:
Private
::
Parser
<
Http
::
Request
>&
getParser
(
const
std
::
shared_ptr
<
Tcp
::
Peer
>&
peer
)
const
;
protected:
size_t
maxPayload_
;
};
template
<
typename
H
,
typename
...
Args
>
...
...
include/pistache/router.h
View file @
0d2e65a1
...
...
@@ -155,6 +155,9 @@ public:
void
addCustomHandler
(
Route
::
Handler
handler
);
void
setMaxPayload
(
size_t
maxPayload
);
size_t
getMaxPayload
()
const
;
void
addNotFoundHandler
(
Route
::
Handler
handler
);
inline
bool
hasNotFoundHandler
()
{
return
notFoundHandler
!=
nullptr
;
}
void
invokeNotFoundHandler
(
const
Http
::
Request
&
req
,
Http
::
ResponseWriter
resp
)
const
;
...
...
@@ -166,6 +169,7 @@ private:
std
::
unordered_map
<
Http
::
Method
,
std
::
vector
<
Route
>>
routes
;
std
::
vector
<
Route
::
Handler
>
customHandlers
;
size_t
maxPayload_
;
Route
::
Handler
notFoundHandler
;
};
...
...
@@ -182,7 +186,7 @@ namespace Private {
private:
std
::
shared_ptr
<
Tcp
::
Handler
>
clone
()
const
{
return
std
::
make_shared
<
RouterHandler
>
(
router
);
return
std
::
make_shared
<
RouterHandler
>
(
*
this
);
}
Rest
::
Router
router
;
...
...
include/pistache/tcp.h
View file @
0d2e65a1
...
...
@@ -11,6 +11,7 @@
#include <pistache/flags.h>
#include <pistache/prototype.h>
#include <pistache/common.h>
namespace
Pistache
{
namespace
Tcp
{
...
...
@@ -36,23 +37,29 @@ public:
friend
class
Transport
;
Handler
();
Handler
(
const
Handler
&
rhs
);
~
Handler
();
size_t
getMaxPayload
()
{
return
maxPayload_
;
}
void
setMaxPayload
(
size_t
sz
)
{
maxPayload_
=
sz
;
}
virtual
void
onInput
(
const
char
*
buffer
,
size_t
len
,
const
std
::
shared_ptr
<
Tcp
::
Peer
>&
peer
)
=
0
;
virtual
void
onConnection
(
const
std
::
shared_ptr
<
Tcp
::
Peer
>&
peer
);
virtual
void
onDisconnection
(
const
std
::
shared_ptr
<
Tcp
::
Peer
>&
peer
);
private:
void
associateTransport
(
Transport
*
transport
);
Transport
*
transport_
;
protected:
Transport
*
transport
()
{
if
(
!
transport_
)
throw
std
::
logic_error
(
"Orphaned handler"
);
return
transport_
;
}
size_t
maxPayload_
;
private:
void
associateTransport
(
Transport
*
transport
);
Transport
*
transport_
;
};
}
// namespace Tcp
...
...
src/common/tcp.cc
View file @
0d2e65a1
...
...
@@ -12,6 +12,13 @@ namespace Tcp {
Handler
::
Handler
()
:
transport_
(
nullptr
)
,
maxPayload_
(
Const
::
DefaultMaxPayload
)
{
}
Handler
::
Handler
(
const
Handler
&
rhs
)
:
transport_
(
nullptr
)
,
maxPayload_
(
rhs
.
maxPayload_
)
{
}
Handler
::~
Handler
()
...
...
src/server/router.cc
View file @
0d2e65a1
...
...
@@ -244,7 +244,9 @@ Router::fromDescription(const Rest::Description& desc) {
std
::
shared_ptr
<
Private
::
RouterHandler
>
Router
::
handler
()
const
{
return
std
::
make_shared
<
Private
::
RouterHandler
>
(
*
this
);
auto
handler
=
std
::
make_shared
<
Private
::
RouterHandler
>
(
*
this
);
handler
->
setMaxPayload
(
maxPayload_
);
return
std
::
move
(
handler
);
}
void
...
...
@@ -258,7 +260,6 @@ Router::initFromDescription(const Rest::Description& desc) {
oss
<<
"Path '"
<<
path
.
value
<<
"' is not bound"
;
throw
std
::
runtime_error
(
oss
.
str
());
}
addRoute
(
path
.
method
,
std
::
move
(
path
.
value
),
std
::
move
(
path
.
handler
));
}
}
...
...
@@ -299,6 +300,17 @@ Router::addCustomHandler(Route::Handler handler) {
customHandlers
.
push_back
(
std
::
move
(
handler
));
}
void
Router
::
setMaxPayload
(
size_t
maxPayload
)
{
maxPayload_
=
maxPayload
;
}
size_t
Router
::
getMaxPayload
()
const
{
return
maxPayload_
;
}
void
Router
::
addNotFoundHandler
(
Route
::
Handler
handler
)
{
notFoundHandler
=
std
::
move
(
handler
);
...
...
tests/CMakeLists.txt
View file @
0d2e65a1
...
...
@@ -18,3 +18,4 @@ pistache_test(view_test)
pistache_test
(
http_parsing_test
)
pistache_test
(
http_client_test
)
pistache_test
(
net_test
)
pistache_test
(
payload_test
)
tests/payload_test.cc
0 → 100644
View file @
0d2e65a1
#include "gtest/gtest.h"
#include <pistache/http.h>
#include <pistache/description.h>
#include <pistache/client.h>
#include <pistache/endpoint.h>
using
namespace
std
;
using
namespace
Pistache
;
struct
TestParameter
{
size_t
payloadBytes
;
Http
::
Code
expectedResponseCode
;
};
typedef
std
::
vector
<
TestParameter
>
PayloadTestSizes
;
void
testPayloads
(
std
::
string
url
,
PayloadTestSizes
&
testPayloads
)
{
// Client tests to make sure the payload is enforced
Http
::
Client
client
;
auto
client_opts
=
Http
::
Client
::
options
().
threads
(
1
).
maxConnectionsPerHost
(
1
);
client
.
init
(
client_opts
);
std
::
vector
<
Async
::
Promise
<
Http
::
Response
>>
responses
;
size_t
tests_passed
=
0
;
for
(
auto
&
t
:
testPayloads
)
{
auto
rb
=
client
.
post
(
url
);
std
::
string
payload
(
t
.
payloadBytes
,
'A'
);
auto
response
=
rb
.
body
(
payload
).
send
();
response
.
then
([
t
,
&
tests_passed
](
Http
::
Response
rsp
)
{
if
(
rsp
.
code
()
==
t
.
expectedResponseCode
)
++
tests_passed
;
},
Async
::
IgnoreException
);
responses
.
push_back
(
std
::
move
(
response
));
}
auto
sync
=
Async
::
whenAll
(
responses
.
begin
(),
responses
.
end
());
Async
::
Barrier
<
std
::
vector
<
Http
::
Response
>>
barrier
(
sync
);
barrier
.
wait_for
(
std
::
chrono
::
seconds
(
5
));
client
.
shutdown
();
ASSERT_TRUE
(
tests_passed
==
testPayloads
.
size
());
}
void
handleEcho
(
const
Rest
::
Request
&
req
,
Http
::
ResponseWriter
response
)
{
response
.
send
(
Http
::
Code
::
Ok
,
req
.
body
(),
MIME
(
Text
,
Plain
));
}
TEST
(
payload_test
,
from_description
)
{
Address
addr
(
Ipv4
::
any
(),
9084
);
const
size_t
threads
=
2
;
const
size_t
max_payload
=
1024
;
// very small
std
::
shared_ptr
<
Http
::
Endpoint
>
endpoint
;
Rest
::
Description
desc
(
"Rest Description Test"
,
"v1"
);
Rest
::
Router
router
;
desc
.
route
(
desc
.
post
(
"/echo"
))
.
bind
(
&
handleEcho
)
.
response
(
Http
::
Code
::
Ok
,
"Response to the /ready call"
);
router
.
initFromDescription
(
desc
);
router
.
setMaxPayload
(
max_payload
);
auto
flags
=
Tcp
::
Options
::
InstallSignalHandler
|
Tcp
::
Options
::
ReuseAddr
;
auto
opts
=
Http
::
Endpoint
::
options
()
.
threads
(
threads
)
.
flags
(
flags
);
endpoint
=
std
::
make_shared
<
Pistache
::
Http
::
Endpoint
>
(
addr
);
endpoint
->
init
(
opts
);
endpoint
->
setHandler
(
router
.
handler
());
ASSERT_EQ
(
router
.
handler
()
->
getMaxPayload
(),
max_payload
);
endpoint
->
serveThreaded
();
PayloadTestSizes
payloads
{
{
1024
,
Http
::
Code
::
Ok
}
,{
2048
,
Http
::
Code
::
Request_Entity_Too_Large
}
};
testPayloads
(
"127.0.0.1:9084/echo"
,
payloads
);
endpoint
->
shutdown
();
}
TEST
(
payload_test
,
manual_construction
)
{
class
MyHandler
:
public
Http
::
Handler
{
HTTP_PROTOTYPE
(
MyHandler
)
void
onRequest
(
const
Http
::
Request
&
req
,
Http
::
ResponseWriter
response
)
{
if
(
req
.
resource
()
==
"/echo"
)
{
if
(
req
.
method
()
==
Http
::
Method
::
Post
)
{
response
.
send
(
Http
::
Code
::
Ok
,
req
.
body
(),
MIME
(
Text
,
Plain
));
}
else
{
response
.
send
(
Http
::
Code
::
Method_Not_Allowed
);
}
}
else
{
response
.
send
(
Http
::
Code
::
Not_Found
);
}
}
private:
tag
garbage
;
};
Port
port
(
9080
);
int
thr
=
2
;
Address
addr
(
Ipv4
::
any
(),
port
);
auto
server
=
std
::
make_shared
<
Http
::
Endpoint
>
(
addr
);
size_t
maxPayload
=
2048
;
auto
opts
=
Http
::
Endpoint
::
options
()
.
threads
(
thr
)
.
flags
(
Tcp
::
Options
::
InstallSignalHandler
)
.
maxPayload
(
maxPayload
);
server
->
init
(
opts
);
server
->
setHandler
(
Http
::
make_handler
<
MyHandler
>
());
server
->
serveThreaded
();
PayloadTestSizes
payloads
{
{
1024
,
Http
::
Code
::
Ok
}
,
{
1800
,
Http
::
Code
::
Ok
}
,
{
2048
,
Http
::
Code
::
Request_Entity_Too_Large
}
};
testPayloads
(
"127.0.0.1:9080/echo"
,
payloads
);
}
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