httpd.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #define MODULE "httpd"
  2. #include "common.h"
  3. #include "fw.h"
  4. #include "httpd.h"
  5. static httpd_handle_t httpd;
  6. esp_err_t httpd_firmware_upgrade_handler(httpd_req_t *req)
  7. {
  8. char *response;
  9. esp_err_t err;
  10. int rv, len;
  11. printf("[POST] len = %zu uri = \"%s\"\n",
  12. req->content_len, req->uri);
  13. if (!req->content_len) {
  14. return httpd_resp_send_err(req, 411, NULL);
  15. }
  16. rv = firmware_update((read_func_t)httpd_req_recv, (token_t)req);
  17. if (rv == FWUPDATE_ERR_IN_PROGRESS)
  18. return httpd_resp_send_err(req, 409, "Firmware update already in progress");
  19. else if (rv)
  20. return httpd_resp_send_err(req, 500, "Firmware update failed");
  21. len = asprintf(&response,
  22. "<!DOCTYPE html>\r\n"
  23. "<html>\r\n"
  24. "<head>\r\n"
  25. "<title>Firmware update completed</title>\r\n"
  26. "</head>\r\n"
  27. "<body>\r\n"
  28. "<h1>Firmware update completed</h1>\r\n"
  29. "<p>Rebooting in %u seconds</p>\r\n"
  30. "</body>\r\n"
  31. "</html>\r\n",
  32. reboot_delayed());
  33. /* 200 and text/html are the response defaults, no need to set */
  34. err = httpd_resp_send(req, response, len);
  35. free(response);
  36. return err;
  37. }
  38. static esp_err_t httpd_get_handler(httpd_req_t *req)
  39. {
  40. char *response;
  41. int len;
  42. esp_err_t err;
  43. len = asprintf(&response,
  44. "<!DOCTYPE html>\n"
  45. "<html>\n"
  46. "<head>\n"
  47. "<title>Hello, World!</title>\n"
  48. "</head>\n"
  49. "<body>\n"
  50. "<p>Hello, World!</p>\n"
  51. "<p>GET uri = <tt>%s</tt></p>\n"
  52. "</pre>\n"
  53. "</body>\n"
  54. "</html>\n",
  55. req->uri);
  56. /* 200 and text/html are the response defaults, no need to set */
  57. err = httpd_resp_send(req, response, len);
  58. free(response);
  59. return err;
  60. }
  61. static const httpd_uri_t uri_get = {
  62. .uri = "/",
  63. .method = HTTP_GET,
  64. .handler = httpd_get_handler,
  65. .user_ctx = NULL
  66. };
  67. static const httpd_uri_t uri_firmware_upgrade = {
  68. .uri = "/firmware-upgrade",
  69. .method = HTTP_POST,
  70. .handler = httpd_firmware_upgrade_handler,
  71. .user_ctx = NULL
  72. };
  73. void my_httpd_stop(void)
  74. {
  75. if (httpd) {
  76. esp_unregister_shutdown_handler(my_httpd_stop);
  77. httpd_stop(httpd);
  78. httpd = NULL;
  79. }
  80. }
  81. void my_httpd_start(void)
  82. {
  83. httpd_config_t config = HTTPD_DEFAULT_CONFIG();
  84. httpd_handle_t server;
  85. if (httpd)
  86. return;
  87. config.task_priority = 2;
  88. printf("[HTTP] Default stack size: %zu\n", config.stack_size);
  89. config.stack_size <<= 2;
  90. printf("[HTTP] Requesting stack size: %zu\n", config.stack_size);
  91. if (httpd_start(&server, &config) != ESP_OK)
  92. return;
  93. httpd = server;
  94. httpd_register_uri_handler(httpd, &uri_get);
  95. httpd_register_uri_handler(httpd, &uri_firmware_upgrade);
  96. esp_register_shutdown_handler(my_httpd_stop);
  97. printf("[HTTP] httpd started\n");
  98. }