// returns null array on error QByteArray makeJsonpStart(int code, const QByteArray &reason, const HttpHeaders &headers) { QByteArray out = "/**/" + jsonpCallback + "("; if(jsonpExtendedResponse) { QByteArray reasonJson = serializeJsonString(QString::fromUtf8(reason)); if(reasonJson.isNull()) return QByteArray(); QVariantMap vheaders; foreach(const HttpHeader h, headers) { if(!vheaders.contains(h.first)) vheaders[h.first] = h.second; } QByteArray headersJson = QJsonDocument(QJsonObject::fromVariantMap(vheaders)).toJson(QJsonDocument::Compact); if(headersJson.isNull()) return QByteArray(); out += "{\"code\": " + QByteArray::number(code) + ", \"reason\": " + reasonJson + ", \"headers\": " + headersJson + ", \"body\": \""; } return out; }
void flush() { infostream<<"RollbackManager::flush()"<<std::endl; std::ofstream of(m_filepath.c_str(), std::ios::app); if(!of.good()){ errorstream<<"RollbackManager::flush(): Could not open file " <<"for appending: \""<<m_filepath<<"\""<<std::endl; return; } for(std::list<RollbackAction>::const_iterator i = m_action_todisk_buffer.begin(); i != m_action_todisk_buffer.end(); i++) { // Do not save stuff that does not have an actor if(i->actor == "") continue; of<<i->unix_time; of<<" "; of<<serializeJsonString(i->actor); of<<" "; std::string action_s = i->toString(); of<<action_s<<std::endl; } m_action_todisk_buffer.clear(); }
void ClientEnvironment::addActiveObject(u16 id, u8 type, const std::string &init_data) { ClientActiveObject* obj = ClientActiveObject::create((ActiveObjectType) type, m_client, this); if(obj == NULL) { infostream<<"ClientEnvironment::addActiveObject(): " <<"id="<<id<<" type="<<type<<": Couldn't create object" <<std::endl; return; } obj->setId(id); try { obj->initialize(init_data); } catch(SerializationError &e) { errorstream<<"ClientEnvironment::addActiveObject():" <<" id="<<id<<" type="<<type <<": SerializationError in initialize(): " <<e.what() <<": init_data="<<serializeJsonString(init_data) <<std::endl; } addActiveObject(obj); }
std::string RollbackAction::toString() const { std::ostringstream os(std::ios::binary); switch (type) { case TYPE_SET_NODE: os << "set_node " << PP(p); os << ": (" << serializeJsonString(n_old.name); os << ", " << itos(n_old.param1); os << ", " << itos(n_old.param2); os << ", " << serializeJsonString(n_old.meta); os << ") -> (" << serializeJsonString(n_new.name); os << ", " << itos(n_new.param1); os << ", " << itos(n_new.param2); os << ", " << serializeJsonString(n_new.meta); os << ')'; case TYPE_MODIFY_INVENTORY_STACK: os << "modify_inventory_stack ("; os << serializeJsonString(inventory_location); os << ", " << serializeJsonString(inventory_list); os << ", " << inventory_index; os << ", " << (inventory_add ? "add" : "remove"); os << ", " << serializeJsonString(inventory_stack.getItemString()); os << ')'; default: return "<unknown action>"; } return os.str(); }
// If the string contains spaces, quotes or control characters, encodes as JSON. // Else returns the string unmodified. static std::string serializeJsonStringIfNeeded(const std::string &s) { for(size_t i = 0; i < s.size(); ++i) { if(s[i] <= 0x1f || s[i] >= 0x7f || s[i] == ' ' || s[i] == '\"') return serializeJsonString(s); } return s; }
void FurnaceNodeMetadata::serializeBody(std::ostream &os) { m_inventory->serialize(os); os<<itos(m_fuel_totaltime*10)<<" "; os<<itos(m_fuel_time*10)<<" "; os<<itos(m_src_totaltime*10)<<" "; os<<itos(m_src_time*10)<<" "; os<<serializeJsonString(m_infotext); }
void TestSerialization::testSerializeJsonString() { // Test blank string UASSERT(serializeJsonString("") == "\"\""); // Test basic string UASSERT(serializeJsonString("Hello world!") == "\"Hello world!\""); // MSVC fails when directly using "\\\\" std::string backslash = "\\"; UASSERT(serializeJsonString(teststring2) == mkstr("\"") + "\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007" + "\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f" + "\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017" + "\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f" + " !\\\"" + teststring2.substr(0x23, 0x2f-0x23) + "\\/" + teststring2.substr(0x30, 0x5c-0x30) + backslash + backslash + teststring2.substr(0x5d, 0x7f-0x5d) + "\\u007f" + "\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087" + "\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f" + "\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097" + "\\u0098\\u0099\\u009a\\u009b\\u009c\\u009d\\u009e\\u009f" + "\\u00a0\\u00a1\\u00a2\\u00a3\\u00a4\\u00a5\\u00a6\\u00a7" + "\\u00a8\\u00a9\\u00aa\\u00ab\\u00ac\\u00ad\\u00ae\\u00af" + "\\u00b0\\u00b1\\u00b2\\u00b3\\u00b4\\u00b5\\u00b6\\u00b7" + "\\u00b8\\u00b9\\u00ba\\u00bb\\u00bc\\u00bd\\u00be\\u00bf" + "\\u00c0\\u00c1\\u00c2\\u00c3\\u00c4\\u00c5\\u00c6\\u00c7" + "\\u00c8\\u00c9\\u00ca\\u00cb\\u00cc\\u00cd\\u00ce\\u00cf" + "\\u00d0\\u00d1\\u00d2\\u00d3\\u00d4\\u00d5\\u00d6\\u00d7" + "\\u00d8\\u00d9\\u00da\\u00db\\u00dc\\u00dd\\u00de\\u00df" + "\\u00e0\\u00e1\\u00e2\\u00e3\\u00e4\\u00e5\\u00e6\\u00e7" + "\\u00e8\\u00e9\\u00ea\\u00eb\\u00ec\\u00ed\\u00ee\\u00ef" + "\\u00f0\\u00f1\\u00f2\\u00f3\\u00f4\\u00f5\\u00f6\\u00f7" + "\\u00f8\\u00f9\\u00fa\\u00fb\\u00fc\\u00fd\\u00fe\\u00ff" + "\""); // Test deserialize std::istringstream is(serializeJsonString(teststring2), std::ios::binary); UASSERT(deSerializeJsonString(is) == teststring2); UASSERT(!is.eof()); is.get(); UASSERT(is.eof()); }
QByteArray makeJsonpBody(const QByteArray &buf) { if(jsonpExtendedResponse) { // FIXME: this assumes there isn't a partial character encoding QByteArray bodyJson = serializeJsonString(QString::fromUtf8(buf)); if(bodyJson.isNull()) return QByteArray(); assert(bodyJson.size() >= 2); return bodyJson.mid(1, bodyJson.size() - 2); } else return buf; }
void respondOk(ZhttpRequest *req, const QString &str, const QByteArray &jsonpCallback = QByteArray()) { HttpHeaders headers; if(!jsonpCallback.isEmpty()) headers += HttpHeader("Content-Type", "application/javascript"); else headers += HttpHeader("Content-Type", "text/plain"); QByteArray body; if(!jsonpCallback.isEmpty()) { QByteArray encBody = serializeJsonString(str); body = "/**/" + jsonpCallback + '(' + encBody + ");\n"; } else body = str.toUtf8(); respond(req, 200, "OK", headers, body); }
std::string RollbackAction::toString() const { switch(type){ case TYPE_SET_NODE: { std::ostringstream os(std::ios::binary); os<<"[set_node"; os<<" "; os<<"("<<itos(p.X)<<","<<itos(p.Y)<<","<<itos(p.Z)<<")"; os<<" "; os<<serializeJsonString(n_old.name); os<<" "; os<<itos(n_old.param1); os<<" "; os<<itos(n_old.param2); os<<" "; os<<serializeJsonString(n_old.meta); os<<" "; os<<serializeJsonString(n_new.name); os<<" "; os<<itos(n_new.param1); os<<" "; os<<itos(n_new.param2); os<<" "; os<<serializeJsonString(n_new.meta); os<<"]"; return os.str(); } case TYPE_MODIFY_INVENTORY_STACK: { std::ostringstream os(std::ios::binary); os<<"[modify_inventory_stack"; os<<" "; os<<serializeJsonString(inventory_location); os<<" "; os<<serializeJsonString(inventory_list); os<<" "; os<<inventory_index; os<<" "; os<<(inventory_add?"add":"remove"); os<<" "; os<<serializeJsonString(inventory_stack); os<<"]"; return os.str(); } default: return "none"; } }
void respondOk(ZhttpRequest *req, const QVariant &data, const QByteArray &prefix = QByteArray(), const QByteArray &jsonpCallback = QByteArray()) { HttpHeaders headers; if(!jsonpCallback.isEmpty()) headers += HttpHeader("Content-Type", "application/javascript"); else headers += HttpHeader("Content-Type", "text/plain"); QByteArray body; if(data.isValid()) body = QJsonDocument(QJsonObject::fromVariantMap(data.toMap())).toJson(QJsonDocument::Compact); if(!prefix.isEmpty()) body.prepend(prefix); if(!jsonpCallback.isEmpty()) { QByteArray encBody = serializeJsonString(QString::fromUtf8(body)); body = "/**/" + jsonpCallback + '(' + encBody + ");\n"; } else if(!body.isEmpty()) body += "\n"; // newline is required respond(req, 200, "OK", headers, body); }