http_content.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #ifndef HTTP_CONTENT_H_
  2. #define HTTP_CONTENT_H_
  3. #include <string>
  4. #include <map>
  5. // MultiMap
  6. namespace std {
  7. /*
  8. int main() {
  9. std::MultiMap<std::string, std::string> kvs;
  10. kvs["name"] = "hw";
  11. kvs["filename"] = "1.jpg";
  12. kvs["filename"] = "2.jpg";
  13. //kvs.insert(std::pair<std::string,std::string>("name", "hw"));
  14. //kvs.insert(std::pair<std::string,std::string>("filename", "1.jpg"));
  15. //kvs.insert(std::pair<std::string,std::string>("filename", "2.jpg"));
  16. for (auto& pair : kvs) {
  17. printf("%s:%s\n", pair.first.c_str(), pair.second.c_str());
  18. }
  19. auto iter = kvs.find("filename");
  20. if (iter != kvs.end()) {
  21. for (int i = 0; i < kvs.count("filename"); ++i, ++iter) {
  22. printf("%s:%s\n", iter->first.c_str(), iter->second.c_str());
  23. }
  24. }
  25. return 0;
  26. }
  27. */
  28. template<typename Key,typename Value>
  29. class MultiMap : public multimap<Key, Value> {
  30. public:
  31. Value& operator[](Key key) {
  32. auto iter = this->insert(std::pair<Key,Value>(key,Value()));
  33. return (*iter).second;
  34. }
  35. };
  36. }
  37. // MAP
  38. #ifdef USE_MULTIMAP
  39. #define MAP std::MultiMap
  40. #else
  41. #define MAP std::map
  42. #endif
  43. // KeyValue
  44. typedef MAP<std::string, std::string> KeyValue;
  45. // QueryParams
  46. typedef KeyValue QueryParams;
  47. std::string dump_query_params(QueryParams& query_params);
  48. int parse_query_params(const char* query_string, QueryParams& query_params);
  49. // NOTE: WITHOUT_HTTP_CONTENT
  50. // ndk-r10e no std::to_string and can't compile modern json.hpp
  51. #ifndef WITHOUT_HTTP_CONTENT
  52. /**************multipart/form-data*************************************
  53. --boundary
  54. Content-Disposition: form-data; name="user"
  55. content
  56. --boundary
  57. Content-Disposition: form-data; name="avatar"; filename="user.jpg"
  58. Content-Type: image/jpeg
  59. content
  60. --boundary--
  61. ***********************************************************************/
  62. // FormData
  63. struct FormData {
  64. std::string filename;
  65. std::string content;
  66. FormData(const char* content = NULL, const char* filename = NULL) {
  67. if (content) {
  68. this->content = content;
  69. }
  70. if (filename) {
  71. this->filename = filename;
  72. }
  73. }
  74. FormData(int n) {
  75. content = std::to_string(n);
  76. }
  77. FormData(long long n) {
  78. content = std::to_string(n);
  79. }
  80. FormData(float f) {
  81. content = std::to_string(f);
  82. }
  83. FormData(double lf) {
  84. content = std::to_string(lf);
  85. }
  86. };
  87. // Multipart
  88. // name => FormData
  89. typedef MAP<std::string, FormData> MultiPart;
  90. #define DEFAULT_MULTIPART_BOUNDARY "----WebKitFormBoundary7MA4YWxkTrZu0gW"
  91. std::string dump_multipart(MultiPart& mp, const char* boundary = DEFAULT_MULTIPART_BOUNDARY);
  92. int parse_multipart(std::string& str, MultiPart& mp, const char* boundary);
  93. // Json
  94. #include "json.hpp"
  95. using Json = nlohmann::json;
  96. extern std::string g_parse_json_errmsg;
  97. std::string dump_json(Json& json);
  98. int parse_json(const char* str, Json& json, std::string& errmsg = g_parse_json_errmsg);
  99. #endif
  100. #endif // HTTP_CONTENT_H_