#ifndef __HttpURLConnection_H
#define __HttpURLConnection_H
#include <iostream>
#include <list>
#include <string>
#include <Url.h>
using namespace std;
class Socket;
enum HTTP_RESPONSECODE {
HTTP_UNKNOWN = -1,
HTTP_CONTINUE = 100,
HTTP_SWITCH_PROC = 101,
HTTP_OK = 200,
HTTP_CREATED,
HTTP_ACCEPTED,
HTTP_NOT_AUTHORITATIVE,
HTTP_NO_CONTENT,
HTTP_RESET,
HTTP_PARTIAL,
HTTP_MULTI_CHOICE = 300,
HTTP_MOVED_PERM,
HTTP_MOVED_TEMP,
HTTP_SEE_OTHER,
HTTP_NOT_MODIFIED,
HTTP_USE_PROXY,
HTTP_BAD_REQUEST = 400,
HTTP_UNAUTHORIZED,
HTTP_PAYMENT_REQUIRED,
HTTP_FORBIDDEN,
HTTP_NOT_FOUND,
HTTP_BAD_METHOD,
HTTP_NOT_ACCEPTABLE,
HTTP_PROXY_AUTH,
HTTP_REQUEST_TIMEOUT,
HTTP_CONFLICT,
HTTP_GONE,
HTTP_LENGTH_REQUIRED,
HTTP_PRECON_FAILED,
HTTP_ENTITY_TOO_LARGE,
HTTP_REQ_TOO_LONG,
HTTP_UNSUPPORTED_TYPE,
HTTP_SERVER_ERROR = 500,
HTTP_INTERNAL_ERROR,
HTTP_BAD_GATEWAY,
HTTP_UNAVAILABLE,
HTTP_GATEWAY_TIMEOUT,
HTTP_VERSION
};
struct Field {
string key;
string value;
Field() {}
Field(char *field);
Field(const char *k, const char *v);
Field(const Field &);
Field &operator = (const Field &);
bool operator == (const Field &);
};
typedef list<Field> Fields;
class HttpURLConnection {
public:
HttpURLConnection(const BUrl &url);
virtual ~HttpURLConnection();
virtual void connect();
void disconnect();
void setRequestMethod(const char *method);
const char *getRequestMethod() const;
void setRequestProperty(const char *key, const char *value);
const char *getContentType();
const char *getContentEncoding();
int getContentLength();
long getDate();
const char *getHeaderField(int n);
const char *getHeaderField(const char *);
const BUrl &getURL() const;
HTTP_RESPONSECODE getResponseCode();
const char *getResponseMessage();
bool getDoInput() const;
bool getDoOutput() const;
void setDoInput(bool doInput);
void setDoOutput(bool doOutput);
istream &getInputStream();
ostream &getOutputStream();
const char *getLastError() const;
void setLastError(const char *);
protected:
bool connected;
bool doInput;
bool doOutput;
BUrl url;
virtual void action();
virtual void setRequest();
virtual void setContent();
virtual void getResponse();
virtual void getContent();
private:
Fields *__request;
Fields *__response;
Socket *__sock;
string __method;
string __response_message;
HTTP_RESPONSECODE __response_code;
string __error_msg;
};
inline const char *HttpURLConnection::getLastError() const
{
return __error_msg.c_str();
}
inline void HttpURLConnection::setLastError(const char *e)
{
__error_msg = e;
}
#endif