summaryrefslogtreecommitdiffstats
path: root/src/HTTPServer/EnvelopeParser.h
blob: 6430fbebf8ddf146c9e864dc997b0c0ac92e9c01 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

// EnvelopeParser.h

// Declares the cEnvelopeParser class representing a parser for RFC-822 envelope headers, used both in HTTP and in MIME





#pragma once





class cEnvelopeParser
{
public:
	class cCallbacks
	{
	public:
		/// Called when a full header line is parsed
		virtual void OnHeaderLine(const AString & a_Key, const AString & a_Value) = 0;
	} ;
	
	
	cEnvelopeParser(cCallbacks & a_Callbacks);
	
	/** Parses the incoming data.
	Returns the number of bytes consumed from the input. The bytes not consumed are not part of the envelope header
	*/
	int Parse(const char * a_Data, int a_Size);
	
	/// Makes the parser forget everything parsed so far, so that it can be reused for parsing another datastream
	void Reset(void);
	
	/// Returns true if more input is expected for the envelope header
	bool IsInHeaders(void) const { return m_IsInHeaders; }
	
	/// Sets the IsInHeaders flag; used by cMultipartParser to simplify the parser initial conditions
	void SetIsInHeaders(bool a_IsInHeaders) { m_IsInHeaders = a_IsInHeaders; }
	
public:
	/// Callbacks to call for the various events
	cCallbacks & m_Callbacks;
	
	/// Set to true while the parser is still parsing the envelope headers. Once set to true, the parser will not consume any more data.
	bool m_IsInHeaders;
	
	/// Buffer for the incoming data until it is parsed
	AString m_IncomingData;
	
	/// Holds the last parsed key; used for line-wrapped values
	AString m_LastKey;
	
	/// Holds the last parsed value; used for line-wrapped values
	AString m_LastValue;


	/// Notifies the callback of the key/value stored in m_LastKey/m_LastValue, then erases them
	void NotifyLast(void);
	
	/// Parses one line of header data. Returns true if successful
	bool ParseLine(const char * a_Data, size_t a_Size);
} ;