sphttpmsg.hpp 3.7 KB
/*
 * Copyright 2007 Stephen Liu
 * For license terms, see the file COPYING along with this library.
 */

#ifndef __sphttpmsg_hpp__
#define __sphttpmsg_hpp__

class SP_ArrayList;
class SP_HttpRequest;
class SP_HttpResponse;
class SP_HttpMessage;

class SP_HttpMsgParser {
public:
	SP_HttpMsgParser();
	~SP_HttpMsgParser();

	void setIgnoreContent( int ignoreContent );
	int isIgnoreContent() const;

	int append( const void * buffer, int len );

	// 0 : incomplete, 1 : complete
	int isCompleted() const;

	SP_HttpRequest * getRequest() const;

	SP_HttpResponse * getResponse() const;

private:
	static int parseStartLine( SP_HttpMessage ** message,
		const void * buffer, int len );
	static int parseHeader( SP_HttpMessage * message,
		const void * buffer, int len );
	static int parseChunked( SP_HttpMessage * message,
		const void * buffer, int len, int * status );
	static int parseContent( SP_HttpMessage * message,
		const void * buffer, int len, int * status );
	static void postProcess( SP_HttpMessage * message );

	static int getLine( const void * buffer, int len, char * line, int size );

	SP_HttpMessage * mMessage;

	enum { eStartLine, eHeader, eContent, eCompleted };
	int mStatus;

	int mIgnoreContent;
};

class SP_HttpMessage {
public:
	static const char * HEADER_CONTENT_LENGTH;
	static const char * HEADER_CONTENT_TYPE;
	static const char * HEADER_CONNECTION;
	static const char * HEADER_PROXY_CONNECTION;
	static const char * HEADER_TRANSFER_ENCODING;
	static const char * HEADER_DATE;
	static const char * HEADER_SERVER;

public:
	SP_HttpMessage( int type );
	virtual ~SP_HttpMessage();

	enum { eRequest, eResponse };
	int getType() const;

	void setVersion( const char * version );
	const char * getVersion() const;

	void appendContent( const void * content, int length = 0, int maxLength = 0 );
	void setContent( const void * content, int length = 0 );
	void directSetContent( void * content, int length = 0 );
	const void * getContent() const;
	int getContentLength() const;

	void addHeader( const char * name, const char * value );
	int removeHeader( const char * name );
	int removeHeader( int index );
	int getHeaderCount() const;
	const char * getHeaderName( int index ) const;
	const char * getHeaderValue( int index ) const;
	const char * getHeaderValue( const char * name ) const;

	int isKeepAlive() const;

protected:
	const int mType;

	char mVersion[ 16 ];
	void * mContent;
	int mMaxLength, mContentLength;

	SP_ArrayList * mHeaderNameList, * mHeaderValueList;
};

class SP_HttpRequest : public SP_HttpMessage {
public:
	SP_HttpRequest();
	virtual ~SP_HttpRequest();

	void setMethod( const char * method );
	const char * getMethod() const;

	void setURI( const char * uri );
	const char * getURI() const;

	void setURL( const char * url );
	const char * getURL() const;

	void setClinetIP( const char * clientIP );
	const char * getClientIP() const;

	void addParam( const char * name, const char * value );
	int removeParam( const char * name );
	int getParamCount() const;
	const char * getParamName( int index ) const;
	const char * getParamValue( int index ) const;
	const char * getParamValue( const char * name ) const;

private:
	char mMethod[ 16 ], mClientIP[ 16 ];
	char * mURI, * mURL;

	SP_ArrayList * mParamNameList, * mParamValueList;
};

class SP_HttpResponse : public SP_HttpMessage {
public:
	SP_HttpResponse();
	virtual ~SP_HttpResponse();

	void setStatusCode( int statusCode );
	int getStatusCode() const;

	void setReasonPhrase( const char * reasonPhrase );
	const char * getReasonPhrase() const;

private:
	int mStatusCode;
	char mReasonPhrase[ 128 ];
};

#endif