|
|
/*--
Copyright (c) 1995-1998 Microsoft Corporation Module Name: BUFFIO.H Author: Arul Menezes Abstract: Buffer handling class & socket IO helpers --*/
// returned from the socket IO functions
typedef enum { INPUT_OK = 0, INPUT_TIMEOUT = 1, INPUT_ERROR = 2, INPUT_NOCHANGE = 3 //INPUT_EOF = 2,
} HRINPUT;
class CHttpRequest; // forward declaration
int MySelect(SOCKET sock, DWORD dwMillisecs);
//
// There is one such buffer for all the headers of a request and another for the POST-body if any
//
class CBuffer { private: PSTR m_pszBuf; int m_iSize; int m_iNextOut; int m_iNextIn; int m_iNextInFollow; // next place to read, needed by raw read filters.
CHAR m_chSaved; // Used by the parser
BOOL AllocMem(DWORD dwLen); BOOL NextToken(PSTR* ppszTok, int* piLen, BOOL fWS, BOOL fColon = FALSE);
public: CBuffer() { memset(this, 0, sizeof(*this)); }
~CBuffer() { MyFree(m_pszBuf); }
// Used to reset a buffer through the course of 1 session, uses
// same allocated mem block. (don't change m_iSize)
void Reset() { m_iNextInFollow = m_iNextOut = m_iNextIn = m_chSaved = 0; }
// accessors
DWORD Count() { return m_iNextIn - m_iNextOut; } BOOL HasPostData() { return (m_iNextIn > m_iNextOut); } PBYTE Data() { return (PBYTE)(m_pszBuf + m_iNextOut); } DWORD UnaccessedCount() { return m_iNextIn - m_iNextInFollow; } // this is data that hasn't been modified yet, for filters
DWORD AvailableBufferSize() { return m_iSize - m_iNextInFollow; } // size of buffer, used by filters
PBYTE FilterRawData() { return (PBYTE)(m_pszBuf + m_iNextInFollow); } PSTR Headers() { return m_pszBuf; } // Http headers are at beginning of buf
DWORD GetINextOut() { return m_iNextOut; } BOOL TrimWhiteSpace();
// input functions
HRINPUT RecvToBuf(SOCKET sock, DWORD dwLength, DWORD dwTimeout,BOOL fFromFilter=FALSE); HRINPUT RecvHeaders(SOCKET sock) { DEBUGCHK(!m_iNextOut && !m_iNextIn); return RecvToBuf(sock, (DWORD)-1, KEEPALIVETIMEOUT); }; HRINPUT RecvBody(SOCKET sock, DWORD dwLength, BOOL fFromFilter = FALSE) { DEBUGCHK(m_pszBuf && m_iSize); DEBUGCHK(m_iNextOut <= m_iNextIn); DEBUGCHK(m_iNextInFollow <= m_iNextIn); return RecvToBuf(sock, dwLength, RECVTIMEOUT,fFromFilter); }; BOOL NextTokenWS(PSTR* ppszTok, int * piLen) { return NextToken(ppszTok, piLen, TRUE); } BOOL NextTokenEOL(PSTR* ppszTok, int * piLen) { return NextToken(ppszTok, piLen, FALSE); } BOOL NextTokenColon(PSTR* ppszTok, int * piLen) { return NextToken(ppszTok, piLen, TRUE, TRUE); } BOOL NextLine(); BOOL AddHeader(PSTR pszName, PSTR pszValue, BOOL fAddColon=FALSE);
// output functions
BOOL AppendData(PSTR pszData, int iLen); BOOL SendBuffer(SOCKET sock, CHttpRequest *pRequest); BOOL FilterDataUpdate(PVOID pvData, DWORD cbData, BOOL fModifiedPointer);
};
|