diff options
author | Mattes D <github@xoft.cz> | 2016-01-03 15:59:55 +0100 |
---|---|---|
committer | Mattes D <github@xoft.cz> | 2016-03-01 16:19:56 +0100 |
commit | fea556ca1b8aeec975f5276d5d829ee6275841d9 (patch) | |
tree | 9a61a61edbb232c01bfb34e1c2959542d470887e /src/HTTP/MultipartParser.h | |
parent | Added HTTPResponseParser. (diff) | |
download | cuberite-fea556ca1b8aeec975f5276d5d829ee6275841d9.tar cuberite-fea556ca1b8aeec975f5276d5d829ee6275841d9.tar.gz cuberite-fea556ca1b8aeec975f5276d5d829ee6275841d9.tar.bz2 cuberite-fea556ca1b8aeec975f5276d5d829ee6275841d9.tar.lz cuberite-fea556ca1b8aeec975f5276d5d829ee6275841d9.tar.xz cuberite-fea556ca1b8aeec975f5276d5d829ee6275841d9.tar.zst cuberite-fea556ca1b8aeec975f5276d5d829ee6275841d9.zip |
Diffstat (limited to 'src/HTTP/MultipartParser.h')
-rw-r--r-- | src/HTTP/MultipartParser.h | 79 |
1 files changed, 79 insertions, 0 deletions
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; +} ; + + + + |