/* libzzinet
 *
 * This program is distributed under the GNU General Public License, version 2.
 * A copy of this license is included with this source.
 *
 * Copyright 2000-2006, Toni Thomsson <toni@tonjac.org> 
*/

#ifndef zz_http_request_h
#define zz_http_request_h

#include <zz_socket.h>
#include <zz_buffer.h>
#include <zz_string.h>
#include <zz_mime_body.h>
#include <map>
#include <zz_export.h>

// Kodningstyper
typedef enum
{
    ZZ_HTTP_ENCODE_TYPE_URLENCODED,
    ZZ_HTTP_ENCODE_TYPE_MULTIPART,
    ZZ_HTTP_ENCODE_TYPE_INVALID

} ZZ_HTTP_ENCODE_TYPE;

static char* zz_http_encode_type[] =
{
    "application/x-www-form-urlencoded",
    "multipart/form-data",
    "<not supported>"
};

// HTTP kommandon
typedef enum
{
    ZZ_HTTP_CMD_GET,
    ZZ_HTTP_CMD_POST,
    ZZ_HTTP_CMD_HEAD,
    ZZ_HTTP_CMD_INVALID

} ZZ_HTTP_CMD;

static char* zz_http_command[] =
{
    "GET",
    "POST",
    "HEAD",
    "<not supported>"
};

typedef map<CzzString, CzzString > CzzHTTPHeaders;

/*
    Description:
    HTTP request

    Author: 
    Toni Thomsson, toni@tonjac.org

    Library:
    libzzinet.a (HPUX) libzzinet.lib (win32)

    Platform:
    HPUX, win32
*/
class ZZ_API CzzHTTPRequest
{
public:

    /*
        Description: Skapar ett anrops objekt
    */
    CzzHTTPRequest( CzzBuffer* buffer, CzzSocket* reqsock );

    // Description: Destruktor
    virtual ~CzzHTTPRequest();

    // Description: Kommando
    ZZ_HTTP_CMD getCommand( void );

    // Description: URI
    CzzString& getUri( void );

    // Description: CGI parameter
    CzzString getCGIParameter( const CzzString& name    // IN, namn
                                );

    // Description: Anropande hostname
    CzzString& getHostName( void );

    // Description: Lista med headers
    CzzHTTPHeaders& getHeaders( void );

    CzzMIMEBody* getMIMEBody( void );

    // Description: Skriver uppladdat objekt till fil
    void writeToFile( const CzzString& cgi_name,    // IN, CGI parameternamn
                        const CzzString& local_path // IN, lokal sökväg
                        );

    ZZ_HTTP_ENCODE_TYPE getType( void );
    CzzString& getStringBuffer( void );
    CzzBuffer* getBuffer( void );
    CzzString getProtocol( void );
    CzzString getUserAgent( void );
    CzzString getReferer( void );
    CzzString getUser( void );
    unsigned __int64 getConnectionTime( void );
    CzzSocket* getSocket( void );
        
private:

    void parseBuffer( void );
    CzzString copyReadFromStart( char* raw, long from, long to );
    void checkCommand( CzzString& line );
    int findAndParseHeaders( CzzString& type );
    unsigned __int64 getTime( void );

    CzzBuffer* m_Buffer;
    CzzString m_StringBuffer;
    CzzString m_HostName;
    ZZ_HTTP_CMD m_Command;
    ZZ_HTTP_ENCODE_TYPE m_Type;
    CzzMIMEBody* m_MIME;
    CzzString m_Uri;
    CzzString m_Proto;
    CzzHTTPHeaders m_Headers;
    time_t m_ConnectionTime;
    CzzSocket* m_RequestSocket;
};

#endif // zz_http_request_h