/*
	CVSNT Generic API
    Copyright (C) 2004 Tony Hoyle and March-Hare Software Ltd

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/
#ifndef HTTPSOCKET__H
#define HTTPSOCKET__H

#include "SocketIO.h"
#include <map>
#include <vector>

class CHttpSocket : public CSocketIO
{
public:
	CVSAPI_EXPORT CHttpSocket();
	CVSAPI_EXPORT virtual ~CHttpSocket();

	CVSAPI_EXPORT bool create(const char *urlHost, bool auto_proxy = true, const char *proxy_address = NULL, const char *proxy_port = NULL, const char *username = NULL, const char *password = NULL);
	CVSAPI_EXPORT bool addRequestHeader(const char *header, const char *value) { m_requestHeaderList[header].push_back(value); return true; }
	CVSAPI_EXPORT bool request(const char *command, const char *location, const char *content = NULL, size_t content_length = 0);
	CVSAPI_EXPORT int responseCode() { return m_responseCode; }
	CVSAPI_EXPORT const char *responseProtocol() { return m_responseProtocol.c_str(); }
	CVSAPI_EXPORT const char *responseString() { return m_responseString.c_str(); }
	CVSAPI_EXPORT const char *responseHeader(const char *header) { if(m_responseHeaderList.find(header)!=m_responseHeaderList.end()) return m_responseHeaderList[header][0].c_str(); else return NULL; }
	CVSAPI_EXPORT const std::vector<cvs::string>* responseHeaders(const char *header) { if(m_responseHeaderList.find(header)!=m_responseHeaderList.end()) return &m_responseHeaderList[header]; else return NULL; }
	CVSAPI_EXPORT const char *responseData(size_t& responseLength) { responseLength = m_content.size(); return m_content.data(); }

protected:
	int m_nAuthStage;
	cvs::string m_port, m_address, m_urlHost;
	cvs::string m_proxyName, m_proxyPort, m_proxyUser, m_proxyPassword;
	cvs::string m_responseProtocol,m_responseString;
	int m_responseCode;
	cvs::string m_content;
	bool m_bProxy,m_bAutoProxy;
	typedef	std::map<cvs::string, std::vector<cvs::string> > headerList_t;
	headerList_t m_requestHeaderList;
	headerList_t m_responseHeaderList;

	bool _create();
	bool _setUrl(const char *urlHost);
	bool _request(const char *command, const char *location, const char *content, size_t content_length);
	bool base64Enc(const unsigned char *from, size_t len, cvs::string& to);
	bool base64Dec(const unsigned char *from, size_t len, cvs::string& to);
};

#endif



syntax highlighted by Code2HTML, v. 0.9.1