项目作者: gerardbos

项目描述 :
h2 (HTTP2) Client/Server library for the ESP32
高级语言: C
项目地址: git://github.com/gerardbos/h2clientserver.git
创建时间: 2018-04-14T11:39:02Z
项目社区:https://github.com/gerardbos/h2clientserver

开源协议:MIT License

下载


HTTP2 client/server library for ESP32

HTTP2 (h2) client/server to use on the ESP32 using the esp-idf environment.

Dependencies

Client

Simple h2client.

Features

  • Uses single task to manage all (open) connections
  • Can keep up to CONFIG_H2CLIENT_CONCURRENT_CONNECTIONS open at the same time

Open items

  • Set/configure the allowed certificates on the server side
  • Add client certificate support

Example

  1. #include "h2client.h"
  2. // in your main content
  3. void main(){
  4. // initialize h2client
  5. h2client_initialize();
  6. // initialize network and wait until network active
  7. h2client_do_request_simple(H2_GET, "https://www.google.com", "/");
  8. }

Server

In progress

Features

The h2 server supports

  • h2 webserver over ssl
  • GET/POST/PUT endpoints
  • Set specific headers per endpoint
  • Handle multiple connections via a single thread

Open items

  • Query parameters
  • URL pattern matching (only static URLs)
  • Mutliple servers (The architecture supports it, but the ESP32 does not have enough menory to handle it properly)

Example

  1. #include "h2server.h"
  2. struct copy_data{
  3. unsigned int read;
  4. char * read_buffer;
  5. unsigned int written;
  6. };
  7. #define min(a, b) (a < b?a:b)
  8. const static char certificate[] = "-----BEGIN CERTIFICATE-----\n"
  9. "MIICrDCCAZQCCQCXHL3FD0cfBTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA0x\n"
  10. "OTIuMTY4LjEuMTAwMB4XDTE4MDYwNzIwMjE1MloXDTE5MDYwNzIwMjE1MlowGDEW\n"
  11. "MBQGA1UEAwwNMTkyLjE2OC4xLjEwMDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\n"
  12. "AQoCggEBAMwp/UmN+Z5LRKyRXiyZ5R5KQSsAvLMjrpigzJTt8noKtQZLb42PhUnC\n"
  13. "TojhK+9YEiSHCbYDEcTBSitxv92oXrXpPmdZvWCm0Fmk/AitmLJwEtOvOCr6EWva\n"
  14. "EJTmWGm/ILoMhN/6yuJ2YiskG+sP0+gnhmuA/Q4sa/VkAn8tPZDo4e5iIAPTTDSZ\n"
  15. "4gDSc6TW9yU8VW4Y0US3TU+UDNo9Bzg26S4jOmwLE7Wn6JS8FrOoRopkYlAk/LPj\n"
  16. "+XTzuRwUYkNPVMzX3Gsm4bIyHJyex8tbbQQmj13llXx8Lj68TmrMwNqGJsAcvvCD\n"
  17. "vS7Y+qHTS3QKQhXGzFHHDeZAdL8ntNcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEA\n"
  18. "Ub/iyxBH0LqL0gII+PBHsAZ3SqKSUevY91UoK0g8ruYFgiTrogmz4nam6PmHQrmA\n"
  19. "AqAy2KjohJSOtfDm/xPkv3yu4+ua5zjYC13rbqDCQttzGueAjBSUaSs6g56XWoZn\n"
  20. "B1AOCrgSRO6mqeC8YA73dwTTgzq2NiKmojH5mcap3zqqiJrG8i++PKog8ReHqwNn\n"
  21. "lVey7Usy9XGPCqUi9gzRa6c/GiR4aJPgbLKZB7leITtjUSxWV2rs9JW4aAFjkVBn\n"
  22. "tSz6GglBoR8IhLUM1UHw6edXiJ40coriKgmtc6NiEtPdDMm25hjnXY8zzd1ET828\n"
  23. "4Hk2mbZQ+38p7bWqfZ4rUA==\n"
  24. "-----END CERTIFICATE-----"
  25. const static char private_key[] = "-----BEGIN PRIVATE KEY-----\n"
  26. "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDMKf1JjfmeS0Ss\n"
  27. "kV4smeUeSkErALyzI66YoMyU7fJ6CrUGS2+Nj4VJwk6I4SvvWBIkhwm2AxHEwUor\n"
  28. "cb/dqF616T5nWb1gptBZpPwIrZiycBLTrzgq+hFr2hCU5lhpvyC6DITf+sridmIr\n"
  29. "JBvrD9PoJ4ZrgP0OLGv1ZAJ/LT2Q6OHuYiAD00w0meIA0nOk1vclPFVuGNFEt01P\n"
  30. "lAzaPQc4NukuIzpsCxO1p+iUvBazqEaKZGJQJPyz4/l087kcFGJDT1TM19xrJuGy\n"
  31. "MhycnsfLW20EJo9d5ZV8fC4+vE5qzMDahibAHL7wg70u2Pqh00t0CkIVxsxRxw3m\n"
  32. "QHS/J7TXAgMBAAECggEBAMFYQnYV7f7qaO7D+9thIom86FpBKHK9p+sC3LttW+QX\n"
  33. "n7eGWO5GrINdb+JQ27qePRA6kge8gGdEZWkfIARaHtdHO8HESoPtdgJvK/9L5v+V\n"
  34. "Az9VAGwyxazNpkZcnf4G8oc+s9cpOlmcovsYBxhktNl2FOZaEUwK5XJOc87cmSFQ\n"
  35. "uQ5/ErzjWAARLpv42Gz8tpdUkLWQog2KCTyKHhXLo4oGFNRMSfq8jf0OEJgMSfSa\n"
  36. "3hK+naomHaAvUNTj6Fj4t9/CXJyJtEqDUT6BS6SgQkwmYjwawdd3+hY3vB/451Dc\n"
  37. "7KfAkkz3YKXnyE0S6PNZsn/1RFnQFFUn/XzlG9DPvoECgYEA6QFgC+rSRtedyvFD\n"
  38. "ZA7OL1R0VgjcfikUZN/XCxff6H1ZT7WLIZWAR8UbJQhw6i+XmkX7U6aCO/rsMiO2\n"
  39. "rlcoUppj2loXW86zgnTSiKs7VZPF+/2mTl5Wgad1ku0CEtTxmQsHMySeYzkddFGx\n"
  40. "yumfJKfHghnbLOoYCn5DxbFn9TMCgYEA4E/4G6NOrbS42GA93f+sXu48UOzaSeBB\n"
  41. "eCZFPt9Lylz6pIQBw6x5u8wBDyeYlFMTbwhNI50DzSt79xTVCwvMP1cbq6+j/RAc\n"
  42. "aAJ+fQSLWG1mqB9DFW51VRwpkzxj0DwmRQcTiLQSAIVGBRDIMVf4Va523otP8eEA\n"
  43. "C8SA1rFwOc0CgYEA1rTDsneRiGILLwSemsbhy89A3D6SH1bvSfzRhZFcbDmFYOPi\n"
  44. "7vF6IahJWRisI7/zLN+rtetLOsX/fDxYi9IYf/VwabZ2q8yOsXnAvts6c6MV3xxe\n"
  45. "cPyRLiwHNXpcXMoIToRRABmQMdJhh9v3vwkD8p0ARKxawMp9mL286aCOMO0CgYEA\n"
  46. "g07M0oD6obzVJ/TOwpHUeY3ESSsdbXmVWZwtlOxqFX/wSTXtQnpImKKHTDPFoa4w\n"
  47. "BiM55MsZWpVF8BGF1P2HBt0bGZmryYwQ1OIA4XYzjAQev/Ps9TLABJ6Dx+jmFRPg\n"
  48. "4y+NQ80FbMCXiIeWaSwx9xY2B3hNyC4KNNlHAmbEZ1ECgYBa716jtmSM9c9v4Sdt\n"
  49. "6YKeB8BlPyDZtLTnHPY9DgS39iZi2coEE8K8EtLmQbUVx0VOOhOGvwEfFcRv1viN\n"
  50. "RUQi3aDUPVYpZ/8X3PFPNmJtoBWc1GcVcEc9Mt97a2Bw5wGBXtFhJe5LoYuM0gH4\n"
  51. "S8QNsjvWFt/qyGNQ2cZulQvNEA==\n"
  52. "-----END PRIVATE KEY-----"
  53. static const char root_data[] = "<html><title>It works!</title><body><h1>It works!</h1></body></html>";
  54. static int callback_root(char * buf, size_t length, bool * finished, void ** private_data)
  55. {
  56. if(*private_data == NULL){
  57. *private_data = malloc(sizeof(struct copy_data));
  58. memset(*private_data, 0, sizeof(struct copy_data));
  59. }
  60. struct copy_data * bookkeeping = *private_data;
  61. int copy_bytes = min(length, sizeof(root_data) - bookkeeping->written);
  62. memcpy(buf, &root_data[bookkeeping->written], copy_bytes);
  63. bookkeeping->written += copy_bytes;
  64. if(bookkeeping->written >= sizeof(root_data))
  65. *finished = true;
  66. if(*finished){
  67. free(bookkeeping);
  68. }
  69. return copy_bytes;
  70. }
  71. // in your main content
  72. void main(){
  73. h2server_initialize(certificate, sizeof(certificate) - 1, private_key, sizeof(private_key) - 1);
  74. struct h2server_handle * server = h2server_start(443);
  75. if(server != NULL){
  76. struct h2server_endpoint_header content_type_html = {.name = h2_header_contenttype, .value = "text/html"};
  77. struct h2server_endpoint e0 = h2server_endpoint_initialize("/", H2_GET);
  78. e0.callback_response = callback_root;
  79. h2server_endpoint_add_header(&e0, &content_type_html);
  80. h2server_register_endpoint(server, &e0);
  81. }
  82. }