From fea556ca1b8aeec975f5276d5d829ee6275841d9 Mon Sep 17 00:00:00 2001 From: Mattes D Date: Sun, 3 Jan 2016 15:59:55 +0100 Subject: Renamed HTTPServer folder to HTTP. It contains client code as well. --- src/HTTP/MultipartParser.h | 79 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 src/HTTP/MultipartParser.h (limited to 'src/HTTP/MultipartParser.h') diff --git a/src/HTTP/MultipartParser.h b/src/HTTP/MultipartParser.h new file mode 100644 index 000000000..4f20b2bed --- /dev/null +++ b/src/HTTP/MultipartParser.h @@ -0,0 +1,79 @@ + +// MultipartParser.h + +// Declares the cMultipartParser class that parses messages in "multipart/*" encoding into the separate parts + + + + + +#pragma once + +#include "EnvelopeParser.h" + + + + + +class cMultipartParser : + protected cEnvelopeParser::cCallbacks +{ +public: + class cCallbacks + { + public: + // Force a virtual destructor in descendants: + virtual ~cCallbacks() {} + + /** Called when a new part starts */ + virtual void OnPartStart(void) = 0; + + /** Called when a complete header line is received for a part */ + virtual void OnPartHeader(const AString & a_Key, const AString & a_Value) = 0; + + /** Called when body for a part is received */ + virtual void OnPartData(const char * a_Data, size_t a_Size) = 0; + + /** Called when the current part ends */ + virtual void OnPartEnd(void) = 0; + } ; + + /** Creates the parser, expects to find the boundary in a_ContentType */ + cMultipartParser(const AString & a_ContentType, cCallbacks & a_Callbacks); + + /** Parses more incoming data */ + void Parse(const char * a_Data, size_t a_Size); + +protected: + /** The callbacks to call for various parsing events */ + cCallbacks & m_Callbacks; + + /** True if the data parsed so far is valid; if false, further parsing is skipped */ + bool m_IsValid; + + /** Parser for each part's envelope */ + cEnvelopeParser m_EnvelopeParser; + + /** Buffer for the incoming data until it is parsed */ + AString m_IncomingData; + + /** The boundary, excluding both the initial "--" and the terminating CRLF */ + AString m_Boundary; + + /** Set to true if some data for the current part has already been signalized to m_Callbacks. Used for proper CRLF inserting. */ + bool m_HasHadData; + + + /** Parse one line of incoming data. The CRLF has already been stripped from a_Data / a_Size */ + void ParseLine(const char * a_Data, size_t a_Size); + + /** Parse one line of incoming data in the headers section of a part. The CRLF has already been stripped from a_Data / a_Size */ + void ParseHeaderLine(const char * a_Data, size_t a_Size); + + // cEnvelopeParser overrides: + virtual void OnHeaderLine(const AString & a_Key, const AString & a_Value) override; +} ; + + + + -- cgit v1.2.3