RTBKit  0.9
Open-source framework to create real-time ad bidding systems.
soa/service/json_endpoint.cc
00001 /* json_endpoint.cc
00002    Jeremy Barnes, 22 February 2011
00003    Copyright (c) 2011 Datacratic.  All rights reserved.
00004 
00005 */
00006 
00007 #include "soa/service//json_endpoint.h"
00008 #include "jml/arch/exception.h"
00009 #include "soa/jsoncpp/json.h"
00010 
00011 
00012 using namespace ML;
00013 using namespace std;
00014 
00015 
00016 namespace Datacratic {
00017 
00018 
00019 /*****************************************************************************/
00020 /* JSON CONNECTION HANDLER                                                   */
00021 /*****************************************************************************/
00022 
00023 JsonConnectionHandler::
00024 JsonConnectionHandler()
00025 {
00026 }
00027 
00028 void
00029 JsonConnectionHandler::
00030 handleHttpHeader(const HttpHeader & header)
00031 {
00032     if (header.contentType.find("json") == string::npos
00033         && header.contentType.find("text") == string::npos)
00034         throw Exception("invalid content type '%s' for JSON",
00035                         header.contentType.c_str());
00036     if (header.verb != "POST")
00037         throw Exception("invalid verb");
00038 }
00039 
00040 void
00041 JsonConnectionHandler::
00042 handleHttpPayload(const HttpHeader & header,
00043                   const std::string & payload)
00044 {
00045     Json::Value request;
00046 
00047     const char * start = payload.c_str();
00048     const char * end = start + payload.length();
00049     
00050     while (end > start && end[-1] == '\n') --end;
00051     
00052     try {
00053         Json::Reader reader;
00054         if (!reader.parse(start, end, request, false)) {
00055             //cerr << "JSON parsing error" << endl;
00056             doError("parsing JSON payload: "
00057                     + reader.getFormattedErrorMessages());
00058             return;
00059         }
00060     } catch (const std::exception & exc) {
00061         doError("parsing JSON request: " + string(exc.what()));
00062         return;
00063     }
00064 
00065     addActivity("finishedJsonParsing");
00066 
00067     handleJson(header, request, string(start, end));
00068 }
00069 
00070 void
00071 JsonConnectionHandler::
00072 handleHttpChunk(const HttpHeader & header,
00073                 const std::string & chunkHeader,
00074                 const std::string & chunk)
00075 {
00076     Json::Value request;
00077 
00078     const char * start = chunk.c_str();
00079     const char * end = start + chunk.length();
00080     
00081     while (end > start && end[-1] == '\n') --end;
00082     
00083     try {
00084         Json::Reader reader;
00085         if (!reader.parse(start, end, request, false)) {
00086             //cerr << "JSON parsing error" << endl;
00087             doError("parsing JSON chunk: "
00088                     + reader.getFormattedErrorMessages());
00089             return;
00090         }
00091     } catch (const std::exception & exc) {
00092         doError("parsing JSON request: " + string(exc.what()));
00093         return;
00094     }
00095 
00096     addActivity("finishedJsonParsing");
00097 
00098     handleJson(header, request, string(start, end));
00099 }
00100 
00101 } // namespace Datacratic
00102 
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator