diff options
author | Mattes D <github@xoft.cz> | 2013-10-07 22:19:14 +0200 |
---|---|---|
committer | Mattes D <github@xoft.cz> | 2013-10-07 22:19:14 +0200 |
commit | e3ba3b8f97f8dd2a4e6dc7ec17f61a2d576fe346 (patch) | |
tree | 47b7c978eb2dfdb3771b1edf907482ade9eb1d34 /source/HTTPServer/MultipartParser.h | |
parent | Fixed startup timings on server restart. (diff) | |
parent | Fixed memory leaks in the HTTP framework (diff) | |
download | cuberite-e3ba3b8f97f8dd2a4e6dc7ec17f61a2d576fe346.tar cuberite-e3ba3b8f97f8dd2a4e6dc7ec17f61a2d576fe346.tar.gz cuberite-e3ba3b8f97f8dd2a4e6dc7ec17f61a2d576fe346.tar.bz2 cuberite-e3ba3b8f97f8dd2a4e6dc7ec17f61a2d576fe346.tar.lz cuberite-e3ba3b8f97f8dd2a4e6dc7ec17f61a2d576fe346.tar.xz cuberite-e3ba3b8f97f8dd2a4e6dc7ec17f61a2d576fe346.tar.zst cuberite-e3ba3b8f97f8dd2a4e6dc7ec17f61a2d576fe346.zip |
Diffstat (limited to 'source/HTTPServer/MultipartParser.h')
-rw-r--r-- | source/HTTPServer/MultipartParser.h | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/source/HTTPServer/MultipartParser.h b/source/HTTPServer/MultipartParser.h new file mode 100644 index 000000000..d853929ed --- /dev/null +++ b/source/HTTPServer/MultipartParser.h @@ -0,0 +1,76 @@ + +// 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: + /// 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, int 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, int 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, int 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, int a_Size); + + // cEnvelopeParser overrides: + virtual void OnHeaderLine(const AString & a_Key, const AString & a_Value) override; +} ; + + + + |