multipart_reader.c 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "multipart_reader.h"
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int multipart_parser_on_boundary_begin(multipart_parser *mp) {
  5. // LOGD("on_boundary_begin");
  6. return 0;
  7. }
  8. int multipart_parser_on_header_field(multipart_parser* parser, const char *at, size_t length) {
  9. return 0;
  10. }
  11. #define multipart_parser_strcpy(dest, source, source_len) \
  12. memcpy(dest, source, (source_len < sizeof(dest)) ? source_len : (sizeof(dest) - 1));\
  13. dest[(source_len < sizeof(dest)) ? source_len : (sizeof(dest) - 1)] = 0;
  14. int multipart_parser_on_header_value(multipart_parser* parser, const char *at, size_t length) {
  15. if (strcmp("Content-Disposition", parser->header_field) == 0) {
  16. multipart_reader* reader = (multipart_reader*)parser->data;
  17. int value_len = 0;
  18. int len = 0;
  19. const char* name = multipart_get_name(
  20. parser->header_value, sizeof(parser->header_value), &value_len);
  21. if (name != NULL) {
  22. multipart_parser_strcpy(reader->form_data_name, name, value_len);
  23. }
  24. const char* filename = multipart_get_filename(
  25. parser->header_value, sizeof(parser->header_value), &value_len);
  26. if (filename != NULL) {
  27. multipart_parser_strcpy(reader->form_data_filename, filename, value_len);
  28. }
  29. }
  30. return 0;
  31. }
  32. int multipart_parser_on_headers_complete(multipart_parser *mp) {
  33. return 0;
  34. }
  35. int multipart_parser_on_body(multipart_parser* parser, const char *at, size_t length) {
  36. const multipart_reader* reader = (multipart_reader*)parser->data;
  37. if (!reader->on_receive) {
  38. return 0;
  39. }
  40. reader->on_receive(reader, at, length);
  41. return 0;
  42. }
  43. int multipart_parser_on_body_parts_complete(multipart_parser *parser) {
  44. return 0;
  45. }
  46. multipart_reader* multipart_reader_create(const char* boundary, multipart_reader_callback on_receive, void* user_data) {
  47. multipart_reader* reader = (multipart_reader*)calloc(1, sizeof(multipart_reader));
  48. reader->on_receive = on_receive;
  49. reader->user_data = user_data;
  50. multipart_parser_init(&reader->parser);
  51. reader->parser.data = reader;
  52. strncpy(reader->boundary, boundary, sizeof(reader->boundary));
  53. multipart_parser_strcpy(reader->boundary, boundary, strlen(boundary));
  54. reader->parser.boundary = reader->boundary;
  55. reader->parser.boundary_len = strlen(reader->boundary);
  56. multipart_parser_settings_init(&reader->parser_settings);
  57. reader->parser_settings.on_boundary_begin = multipart_parser_on_boundary_begin;
  58. reader->parser_settings.on_header_field = multipart_parser_on_header_field;
  59. reader->parser_settings.on_header_value = multipart_parser_on_header_value;
  60. reader->parser_settings.on_headers_complete = multipart_parser_on_headers_complete;
  61. reader->parser_settings.on_body = multipart_parser_on_body;
  62. reader->parser_settings.on_body_parts_complete = multipart_parser_on_body_parts_complete;
  63. return reader;
  64. }
  65. int multipart_reader_execute(multipart_reader *reader, const void *data, uint64_t length) {
  66. if (reader->parser.multipart_errno != 0) {
  67. return reader->parser.multipart_errno;
  68. }
  69. int r = multipart_parser_execute(&reader->parser, &reader->parser_settings, data, length);
  70. if (r != 0) {
  71. reader->parser.multipart_errno = r;
  72. }
  73. return r;
  74. }
  75. void multipart_reader_destroy(multipart_reader *receiver) {
  76. if (!receiver) {
  77. return;
  78. }
  79. free(receiver);
  80. }