json.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. /* <!-- copyright */
  2. /*
  3. * aria2 - The high speed download utility
  4. *
  5. * Copyright (C) 2011 Tatsuhiro Tsujikawa
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. *
  21. * In addition, as a special exception, the copyright holders give
  22. * permission to link the code of portions of this program with the
  23. * OpenSSL library under certain conditions as described in each
  24. * individual source file, and distribute linked combinations
  25. * including the two.
  26. * You must obey the GNU General Public License in all respects
  27. * for all of the code used other than OpenSSL. If you modify
  28. * file(s) with this exception, you may extend this exception to your
  29. * version of the file(s), but you are not obligated to do so. If you
  30. * do not wish to do so, delete this exception statement from your
  31. * version. If you delete this exception statement from all source
  32. * files in the program, then also delete it here.
  33. */
  34. /* copyright --> */
  35. #ifndef D_JSON_H
  36. #define D_JSON_H
  37. #include "common.h"
  38. #include "ValueBase.h"
  39. namespace aria2 {
  40. namespace json {
  41. std::string jsonEscape(const std::string& s);
  42. template <typename OutputStream>
  43. OutputStream& encode(OutputStream& out, const ValueBase* vlb)
  44. {
  45. class JsonValueBaseVisitor : public ValueBaseVisitor {
  46. public:
  47. JsonValueBaseVisitor(OutputStream& out) : out_(out) {}
  48. virtual void visit(const String& string) CXX11_OVERRIDE
  49. {
  50. encodeString(string.s());
  51. }
  52. virtual void visit(const Integer& integer) CXX11_OVERRIDE
  53. {
  54. out_ << integer.i();
  55. }
  56. virtual void visit(const Bool& boolValue) CXX11_OVERRIDE
  57. {
  58. out_ << (boolValue.val() ? "true" : "false");
  59. }
  60. virtual void visit(const Null& nullValue) CXX11_OVERRIDE { out_ << "null"; }
  61. virtual void visit(const List& list) CXX11_OVERRIDE
  62. {
  63. out_ << "[";
  64. if (!list.empty()) {
  65. auto i = list.begin();
  66. (*i)->accept(*this);
  67. ++i;
  68. for (auto eoi = list.end(); i != eoi; ++i) {
  69. out_ << ",";
  70. (*i)->accept(*this);
  71. }
  72. }
  73. out_ << "]";
  74. }
  75. virtual void visit(const Dict& dict) CXX11_OVERRIDE
  76. {
  77. out_ << "{";
  78. if (!dict.empty()) {
  79. auto i = dict.begin();
  80. encodeString((*i).first);
  81. out_ << ":";
  82. (*i).second->accept(*this);
  83. ++i;
  84. for (auto eoi = dict.end(); i != eoi; ++i) {
  85. out_ << ",";
  86. encodeString((*i).first);
  87. out_ << ":";
  88. (*i).second->accept(*this);
  89. }
  90. }
  91. out_ << "}";
  92. }
  93. private:
  94. void encodeString(const std::string& s)
  95. {
  96. out_ << "\"" << jsonEscape(s) << "\"";
  97. }
  98. OutputStream& out_;
  99. };
  100. JsonValueBaseVisitor visitor(out);
  101. vlb->accept(visitor);
  102. return out;
  103. }
  104. // Serializes JSON object or array.
  105. std::string encode(const ValueBase* json);
  106. struct JsonGetParam {
  107. std::string request;
  108. std::string callback;
  109. JsonGetParam(const std::string& request, const std::string& callback);
  110. };
  111. // Decodes JSON-RPC request from GET query parameter query. query must
  112. // starts with "?". This function identifies method name, id,
  113. // parameters and jsonp callback. For method name, it searches
  114. // "method" query parameter. For id, it searches "id" query
  115. // parameter. The id is always treated as string. For parameters, it
  116. // searches "params" query parameter. The params is Base64 encoded
  117. // JSON string normally associated "params" key in POST request. For
  118. // jsonp callback, it searches "jsoncallback". For example, calling
  119. // remote method, sum([1,2,3]) with id=300 looks like this:
  120. // ?method=sum&id=300&params=WzEsMiwzXQ%3D%3D
  121. //
  122. // If both method and id are missing, params is treated as batch call.
  123. JsonGetParam decodeGetParams(const std::string& query);
  124. } // namespace json
  125. } // namespace aria2
  126. #endif // D_JSON_H