/http_server/stack/message/AWSHttpMessage.cpp

http://github.com/jtblatt/duderino · C++ · 97 lines · 70 code · 23 blank · 4 comment · 8 complexity · 54cfd5f6d50bf6d19245930d28fdcf25 MD5 · raw file

  1. /* Copyright (c) 2009 Yahoo! Inc. All rights reserved.
  2. * The copyrights embodied in the content of this file are licensed by Yahoo! Inc.
  3. * under the BSD (revised) open source license.
  4. */
  5. #ifndef AWS_HTTP_MESSAGE_H
  6. #include <AWSHttpMessage.h>
  7. #endif
  8. #include <string.h>
  9. #include <stdio.h>
  10. #include <stdarg.h>
  11. AWSHttpMessage::AWSHttpMessage() :
  12. _flags(0x00),
  13. _version(110),
  14. _headers()
  15. {
  16. }
  17. AWSHttpMessage::~AWSHttpMessage()
  18. {
  19. }
  20. const AWSHttpHeader *AWSHttpMessage::getHeader(unsigned const char *fieldName) const
  21. {
  22. if (0 == fieldName)
  23. {
  24. return 0;
  25. }
  26. for (const AWSHttpHeader *header = (const AWSHttpHeader *) _headers.getFirst();
  27. header;
  28. header = (const AWSHttpHeader *) header->getNext())
  29. {
  30. if (0 == strcasecmp((const char *) fieldName, (const char *) header->getFieldName()))
  31. {
  32. return header;
  33. }
  34. }
  35. return 0;
  36. }
  37. ESFError AWSHttpMessage::addHeader(unsigned const char *fieldName,
  38. unsigned const char *fieldValue,
  39. ESFAllocator *allocator)
  40. {
  41. if (! fieldName || ! allocator)
  42. {
  43. return ESF_NULL_POINTER;
  44. }
  45. int fieldNameLength = strlen((const char *) fieldName);
  46. int fieldValueLength = strlen((const char *) fieldValue);
  47. unsigned char *block = (unsigned char *) allocator->allocate(sizeof(AWSHttpHeader) +
  48. fieldNameLength +
  49. fieldValueLength + 2);
  50. if (! block)
  51. {
  52. return ESF_OUT_OF_MEMORY;
  53. }
  54. memcpy(block + sizeof(AWSHttpHeader), fieldName, fieldNameLength);
  55. block[sizeof(AWSHttpHeader) + fieldNameLength] = 0;
  56. memcpy(block + sizeof(AWSHttpHeader) + fieldNameLength + 1, fieldValue, fieldValueLength);
  57. block[sizeof(AWSHttpHeader) + fieldNameLength + fieldValueLength + 1] = 0;
  58. AWSHttpHeader *header = new(block) AWSHttpHeader(block + sizeof(AWSHttpHeader),
  59. block + sizeof(AWSHttpHeader) + fieldNameLength + 1);
  60. _headers.addLast(header);
  61. return ESF_SUCCESS;
  62. }
  63. ESFError AWSHttpMessage::addHeader(ESFAllocator *allocator,
  64. unsigned const char *fieldName,
  65. unsigned const char *fieldValueFormat,
  66. ...)
  67. {
  68. char buffer[1024];
  69. va_list vaList;
  70. va_start(vaList, (const char *) fieldValueFormat);
  71. vsnprintf(buffer, sizeof(buffer), (const char *) fieldValueFormat, vaList);
  72. va_end( vaList );
  73. return addHeader(fieldName, (unsigned const char *) buffer, allocator);
  74. }