HttpService.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "HttpService.h"
  2. void HttpService::AddApi(const char* path, http_method method, http_api_handler handler) {
  3. std::shared_ptr<http_method_handlers> method_handlers = NULL;
  4. auto iter = api_handlers.find(path);
  5. if (iter == api_handlers.end()) {
  6. // add path
  7. method_handlers = std::shared_ptr<http_method_handlers>(new http_method_handlers);
  8. api_handlers[path] = method_handlers;
  9. }
  10. else {
  11. method_handlers = iter->second;
  12. }
  13. for (auto iter = method_handlers->begin(); iter != method_handlers->end(); ++iter) {
  14. if (iter->method == method) {
  15. // update
  16. iter->handler = handler;
  17. return;
  18. }
  19. }
  20. // add
  21. method_handlers->push_back(http_method_handler(method, handler));
  22. }
  23. int HttpService::GetApi(const char* url, http_method method, http_api_handler* handler) {
  24. // {base_url}/path?query
  25. const char* s = url;
  26. const char* b = base_url.c_str();
  27. while (*s && *b && *s == *b) {++s;++b;}
  28. if (*b != '\0') {
  29. return HTTP_STATUS_NOT_FOUND;
  30. }
  31. const char* e = s;
  32. while (*e && *e != '?') ++e;
  33. std::string path = std::string(s, e);
  34. auto iter = api_handlers.find(path);
  35. if (iter == api_handlers.end()) {
  36. *handler = NULL;
  37. return HTTP_STATUS_NOT_FOUND;
  38. }
  39. auto method_handlers = iter->second;
  40. for (auto iter = method_handlers->begin(); iter != method_handlers->end(); ++iter) {
  41. if (iter->method == method) {
  42. *handler = iter->handler;
  43. return 0;
  44. }
  45. }
  46. *handler = NULL;
  47. return HTTP_STATUS_METHOD_NOT_ALLOWED;
  48. }
  49. int HttpService::GetApi(HttpRequest* req, http_api_handler* handler) {
  50. // {base_url}/path?query
  51. const char* s = req->path.c_str();
  52. const char* b = base_url.c_str();
  53. while (*s && *b && *s == *b) {++s;++b;}
  54. if (*b != '\0') {
  55. return HTTP_STATUS_NOT_FOUND;
  56. }
  57. const char* e = s;
  58. while (*e && *e != '?') ++e;
  59. std::string path = std::string(s, e);
  60. const char *kp, *ks, *vp, *vs;
  61. for (auto iter = api_handlers.begin(); iter != api_handlers.end(); ++iter) {
  62. kp = iter->first.c_str();
  63. vp = path.c_str();
  64. // RESTful API
  65. std::map<std::string, std::string> params;
  66. while (*kp && *vp && *kp == *vp) {
  67. if (kp[0] == '/' && kp[1] == ':') {
  68. kp += 2;
  69. ks = kp;
  70. while (*kp && *kp != '/') {++kp;}
  71. vp += 1;
  72. vs = vp;
  73. while (*vp && *vp != '/') {++vp;}
  74. params[std::string(ks, kp-ks)] = std::string(vs, vp-vs);
  75. }
  76. else {
  77. ++kp;
  78. ++vp;
  79. }
  80. }
  81. if (*kp == '\0' && *vp == '\0') {
  82. auto method_handlers = iter->second;
  83. for (auto iter = method_handlers->begin(); iter != method_handlers->end(); ++iter) {
  84. if (iter->method == req->method) {
  85. for (auto& param : params) {
  86. // RESTful /:field/ => req->query_params
  87. req->query_params[param.first] = param.second;
  88. }
  89. *handler = iter->handler;
  90. return 0;
  91. }
  92. }
  93. if (params.size() == 0) {
  94. *handler = NULL;
  95. return HTTP_STATUS_METHOD_NOT_ALLOWED;
  96. }
  97. }
  98. }
  99. *handler = NULL;
  100. return HTTP_STATUS_NOT_FOUND;
  101. }