RTBKit
0.9
Open-source framework to create real-time ad bidding systems.
|
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