summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--icespider/core/core.cpp2
-rw-r--r--icespider/core/core.h2
-rw-r--r--icespider/core/ihttpRequest.cpp13
-rw-r--r--icespider/unittests/testApp.cpp23
4 files changed, 36 insertions, 4 deletions
diff --git a/icespider/core/core.cpp b/icespider/core/core.cpp
index 58619aa..096b367 100644
--- a/icespider/core/core.cpp
+++ b/icespider/core/core.cpp
@@ -5,9 +5,11 @@
namespace IceSpider {
const boost::filesystem::path Core::defaultConfig("config/ice.properties");
+ DefineHttpEx(Http400_BadRequest, 400, "Bad Request");
DefineHttpEx(Http404_NotFound, 404, "Not found");
DefineHttpEx(Http405_MethodNotAllowed, 405, "Method Not Allowed");
DefineHttpEx(Http406_NotAcceptable, 406, "Not Acceptable");
+ DefineHttpEx(Http415_UnsupportedMediaType, 415, "Unsupported Media Type");
static
bool
diff --git a/icespider/core/core.h b/icespider/core/core.h
index 74c9108..c7c762f 100644
--- a/icespider/core/core.h
+++ b/icespider/core/core.h
@@ -20,9 +20,11 @@
const std::string Name::message(Message);
namespace IceSpider {
+ DeclareHttpEx(Http400_BadRequest);
DeclareHttpEx(Http404_NotFound);
DeclareHttpEx(Http405_MethodNotAllowed);
DeclareHttpEx(Http406_NotAcceptable);
+ DeclareHttpEx(Http415_UnsupportedMediaType);
class DLL_PUBLIC Core {
public:
diff --git a/icespider/core/ihttpRequest.cpp b/icespider/core/ihttpRequest.cpp
index 73da7ae..a49df42 100644
--- a/icespider/core/ihttpRequest.cpp
+++ b/icespider/core/ihttpRequest.cpp
@@ -19,10 +19,15 @@ namespace IceSpider {
Slicer::DeserializerPtr
IHttpRequest::getDeserializer() const
{
- return Slicer::StreamDeserializerFactory::createNew(
- getHeaderParam("Content-Type") / []() -> std::string {
- throw std::runtime_error("Content-Type must be specified to deserialize payload");
- }, getInputStream());
+ try {
+ return Slicer::StreamDeserializerFactory::createNew(
+ getHeaderParam("Content-Type") / []() -> std::string {
+ throw Http400_BadRequest();
+ }, getInputStream());
+ }
+ catch (const AdHoc::NoSuchPluginException &) {
+ throw Http415_UnsupportedMediaType();
+ }
}
ContentTypeSerializer
diff --git a/icespider/unittests/testApp.cpp b/icespider/unittests/testApp.cpp
index 4e32ddd..087d95d 100644
--- a/icespider/unittests/testApp.cpp
+++ b/icespider/unittests/testApp.cpp
@@ -292,6 +292,29 @@ BOOST_AUTO_TEST_CASE( testCallPost1234 )
BOOST_REQUIRE(requestUpdateItem.output.eof());
}
+BOOST_AUTO_TEST_CASE( testCallPost1234NoContentType )
+{
+ TestRequest requestUpdateItem(this, HttpMethod::POST, "/1234");
+ requestUpdateItem.input << "{\"value\": \"some value\"}";
+ process(&requestUpdateItem);
+ auto h = parseHeaders(requestUpdateItem.output);
+ BOOST_REQUIRE_EQUAL(h["Status"], "400 Bad Request");
+ requestUpdateItem.output.get();
+ BOOST_REQUIRE(requestUpdateItem.output.eof());
+}
+
+BOOST_AUTO_TEST_CASE( testCallPost1234UnsupportedMediaType )
+{
+ TestRequest requestUpdateItem(this, HttpMethod::POST, "/1234");
+ requestUpdateItem.hdr["Content-Type"] = "application/notathing";
+ requestUpdateItem.input << "value=\"some value\"";
+ process(&requestUpdateItem);
+ auto h = parseHeaders(requestUpdateItem.output);
+ BOOST_REQUIRE_EQUAL(h["Status"], "415 Unsupported Media Type");
+ requestUpdateItem.output.get();
+ BOOST_REQUIRE(requestUpdateItem.output.eof());
+}
+
BOOST_AUTO_TEST_CASE( testCallIndexAcceptJson )
{
TestRequest requestJson(this, HttpMethod::GET, "/");