Dependents:   SimpleLCDClock readCard2Twitter_http AnalogClock_StepperMotor_NTP ServoCamV1

Committer:
donatien
Date:
Mon May 24 10:24:38 2010 +0000
Revision:
0:a2dd0ba6cd2d
Child:
1:7043cc0db03c

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:a2dd0ba6cd2d 1 #ifndef HTTP_CLIENT_H
donatien 0:a2dd0ba6cd2d 2 #define HTTP_CLIENT_H
donatien 0:a2dd0ba6cd2d 3
donatien 0:a2dd0ba6cd2d 4 class HttpData;
donatien 0:a2dd0ba6cd2d 5
donatien 0:a2dd0ba6cd2d 6 #include "if/net/net.h"
donatien 0:a2dd0ba6cd2d 7 #include "api/TcpSocket.h"
donatien 0:a2dd0ba6cd2d 8 #include "api/DnsRequest.h"
donatien 0:a2dd0ba6cd2d 9 #include "HttpData.h"
donatien 0:a2dd0ba6cd2d 10 #include "mbed.h"
donatien 0:a2dd0ba6cd2d 11
donatien 0:a2dd0ba6cd2d 12 #include <string>
donatien 0:a2dd0ba6cd2d 13 using std::string;
donatien 0:a2dd0ba6cd2d 14
donatien 0:a2dd0ba6cd2d 15 #include <map>
donatien 0:a2dd0ba6cd2d 16 using std::map;
donatien 0:a2dd0ba6cd2d 17
donatien 0:a2dd0ba6cd2d 18 #define HTTP_REQUEST_TIMEOUT 30000//15000
donatien 0:a2dd0ba6cd2d 19 #define HTTP_PORT 80
donatien 0:a2dd0ba6cd2d 20
donatien 0:a2dd0ba6cd2d 21 enum HttpResult
donatien 0:a2dd0ba6cd2d 22 {
donatien 0:a2dd0ba6cd2d 23 HTTP_OK,
donatien 0:a2dd0ba6cd2d 24 HTTP_PROCESSING,
donatien 0:a2dd0ba6cd2d 25 HTTP_PARSE, //URI Parse error
donatien 0:a2dd0ba6cd2d 26 HTTP_DNS, //Could not resolve name
donatien 0:a2dd0ba6cd2d 27 HTTP_PRTCL, //Protocol error
donatien 0:a2dd0ba6cd2d 28 HTTP_NOTFOUND, //404 Error
donatien 0:a2dd0ba6cd2d 29 HTTP_REFUSED, //403 Error
donatien 0:a2dd0ba6cd2d 30 HTTP_ERROR, //xxx error
donatien 0:a2dd0ba6cd2d 31 HTTP_TIMEOUT, //Connection timeout
donatien 0:a2dd0ba6cd2d 32 HTTP_CONN //Connection error
donatien 0:a2dd0ba6cd2d 33 };
donatien 0:a2dd0ba6cd2d 34
donatien 0:a2dd0ba6cd2d 35
donatien 0:a2dd0ba6cd2d 36
donatien 0:a2dd0ba6cd2d 37 class HttpClient : protected NetService
donatien 0:a2dd0ba6cd2d 38 {
donatien 0:a2dd0ba6cd2d 39 public:
donatien 0:a2dd0ba6cd2d 40 HttpClient();
donatien 0:a2dd0ba6cd2d 41 virtual ~HttpClient();
donatien 0:a2dd0ba6cd2d 42
donatien 0:a2dd0ba6cd2d 43 void basicAuth(const char* user, const char* password); //Basic Authentification
donatien 0:a2dd0ba6cd2d 44
donatien 0:a2dd0ba6cd2d 45 //High Level setup functions
donatien 0:a2dd0ba6cd2d 46 HttpResult get(const char* uri, HttpData* pDataIn); //Blocking
donatien 0:a2dd0ba6cd2d 47 HttpResult get(const char* uri, HttpData* pDataIn, void (*pMethod)(HttpResult)); //Non blocking
donatien 0:a2dd0ba6cd2d 48 template<class T>
donatien 0:a2dd0ba6cd2d 49 //Linker bug : Must be defined here :(
donatien 0:a2dd0ba6cd2d 50 HttpResult get(const char* uri, HttpData* pDataIn, T* pItem, void (T::*pMethod)(HttpResult)) //Non blocking
donatien 0:a2dd0ba6cd2d 51 {
donatien 0:a2dd0ba6cd2d 52 setOnResult(pItem, pMethod);
donatien 0:a2dd0ba6cd2d 53 doGet(uri, pDataIn);
donatien 0:a2dd0ba6cd2d 54 return HTTP_PROCESSING;
donatien 0:a2dd0ba6cd2d 55 }
donatien 0:a2dd0ba6cd2d 56
donatien 0:a2dd0ba6cd2d 57 HttpResult post(const char* uri, const HttpData& dataOut, HttpData* pDataIn); //Blocking
donatien 0:a2dd0ba6cd2d 58 HttpResult post(const char* uri, const HttpData& dataOut, HttpData* pDataIn, void (*pMethod)(HttpResult)); //Non blocking
donatien 0:a2dd0ba6cd2d 59 template<class T>
donatien 0:a2dd0ba6cd2d 60 //Linker bug : Must be defined here :(
donatien 0:a2dd0ba6cd2d 61 HttpResult post(const char* uri, const HttpData& dataOut, HttpData* pDataIn, T* pItem, void (T::*pMethod)(HttpResult)) //Non blocking
donatien 0:a2dd0ba6cd2d 62 {
donatien 0:a2dd0ba6cd2d 63 setOnResult(pItem, pMethod);
donatien 0:a2dd0ba6cd2d 64 doPost(uri, dataOut, pDataIn);
donatien 0:a2dd0ba6cd2d 65 return HTTP_PROCESSING;
donatien 0:a2dd0ba6cd2d 66 }
donatien 0:a2dd0ba6cd2d 67
donatien 0:a2dd0ba6cd2d 68 void doGet(const char* uri, HttpData* pDataIn);
donatien 0:a2dd0ba6cd2d 69 void doPost(const char* uri, const HttpData& dataOut, HttpData* pDataIn);
donatien 0:a2dd0ba6cd2d 70
donatien 0:a2dd0ba6cd2d 71 void setOnResult( void (*pMethod)(HttpResult) );
donatien 0:a2dd0ba6cd2d 72 class CDummy;
donatien 0:a2dd0ba6cd2d 73 template<class T>
donatien 0:a2dd0ba6cd2d 74 //Linker bug : Must be defined here :(
donatien 0:a2dd0ba6cd2d 75 void setOnResult( T* pItem, void (T::*pMethod)(HttpResult) )
donatien 0:a2dd0ba6cd2d 76 {
donatien 0:a2dd0ba6cd2d 77 m_pCb = NULL;
donatien 0:a2dd0ba6cd2d 78 m_pCbItem = (CDummy*) pItem;
donatien 0:a2dd0ba6cd2d 79 m_pCbMeth = (void (CDummy::*)(HttpResult)) pMethod;
donatien 0:a2dd0ba6cd2d 80 }
donatien 0:a2dd0ba6cd2d 81
donatien 0:a2dd0ba6cd2d 82 void setTimeout(int ms);
donatien 0:a2dd0ba6cd2d 83
donatien 0:a2dd0ba6cd2d 84 virtual void poll(); //Called by NetServices
donatien 0:a2dd0ba6cd2d 85
donatien 0:a2dd0ba6cd2d 86 int getHttpResponseCode();
donatien 0:a2dd0ba6cd2d 87 void setRequestHeader(const string& header, const string& value);
donatien 0:a2dd0ba6cd2d 88 string& getResponseHeader(const string& header);
donatien 0:a2dd0ba6cd2d 89 void resetRequestHeaders();
donatien 0:a2dd0ba6cd2d 90
donatien 0:a2dd0ba6cd2d 91 protected:
donatien 0:a2dd0ba6cd2d 92 void resetTimeout();
donatien 0:a2dd0ba6cd2d 93
donatien 0:a2dd0ba6cd2d 94 void init();
donatien 0:a2dd0ba6cd2d 95 void close();
donatien 0:a2dd0ba6cd2d 96
donatien 0:a2dd0ba6cd2d 97 void setup(const char* uri, HttpData* pDataOut, HttpData* pDataIn); //Setup request, make DNS Req if necessary
donatien 0:a2dd0ba6cd2d 98 void connect(); //Start Connection
donatien 0:a2dd0ba6cd2d 99
donatien 0:a2dd0ba6cd2d 100 int tryRead(); //Read data and try to feed output
donatien 0:a2dd0ba6cd2d 101 void readData(); //Data has been read
donatien 0:a2dd0ba6cd2d 102 void writeData(); //Data has been written & buf is free
donatien 0:a2dd0ba6cd2d 103
donatien 0:a2dd0ba6cd2d 104 void onTcpSocketEvent(TcpSocketEvent e);
donatien 0:a2dd0ba6cd2d 105 void onDnsReply(DnsReply r);
donatien 0:a2dd0ba6cd2d 106 void onResult(HttpResult r); //Called when exchange completed or on failure
donatien 0:a2dd0ba6cd2d 107 void onTimeout(); //Connection has timed out
donatien 0:a2dd0ba6cd2d 108
donatien 0:a2dd0ba6cd2d 109 private:
donatien 0:a2dd0ba6cd2d 110 HttpResult blockingProcess(); //Called in blocking mode, calls Net::poll() until return code is available
donatien 0:a2dd0ba6cd2d 111
donatien 0:a2dd0ba6cd2d 112 bool readHeaders(); //Called first when receiving data
donatien 0:a2dd0ba6cd2d 113 bool writeHeaders(); //Called to create req
donatien 0:a2dd0ba6cd2d 114 int readLine(char* str, int maxLen);
donatien 0:a2dd0ba6cd2d 115
donatien 0:a2dd0ba6cd2d 116 enum HTTP_METH
donatien 0:a2dd0ba6cd2d 117 {
donatien 0:a2dd0ba6cd2d 118 HTTP_GET,
donatien 0:a2dd0ba6cd2d 119 HTTP_POST,
donatien 0:a2dd0ba6cd2d 120 HTTP_HEAD
donatien 0:a2dd0ba6cd2d 121 };
donatien 0:a2dd0ba6cd2d 122
donatien 0:a2dd0ba6cd2d 123 HTTP_METH m_meth;
donatien 0:a2dd0ba6cd2d 124
donatien 0:a2dd0ba6cd2d 125 CDummy* m_pCbItem;
donatien 0:a2dd0ba6cd2d 126 void (CDummy::*m_pCbMeth)(HttpResult);
donatien 0:a2dd0ba6cd2d 127
donatien 0:a2dd0ba6cd2d 128 void (*m_pCb)(HttpResult);
donatien 0:a2dd0ba6cd2d 129
donatien 0:a2dd0ba6cd2d 130 TcpSocket* m_pTcpSocket;
donatien 0:a2dd0ba6cd2d 131 map<string, string> m_reqHeaders;
donatien 0:a2dd0ba6cd2d 132 map<string, string> m_respHeaders;
donatien 0:a2dd0ba6cd2d 133
donatien 0:a2dd0ba6cd2d 134 Timer m_watchdog;
donatien 0:a2dd0ba6cd2d 135 int m_timeout;
donatien 0:a2dd0ba6cd2d 136
donatien 0:a2dd0ba6cd2d 137 DnsRequest* m_pDnsReq;
donatien 0:a2dd0ba6cd2d 138
donatien 0:a2dd0ba6cd2d 139 Host m_server;
donatien 0:a2dd0ba6cd2d 140 string m_path;
donatien 0:a2dd0ba6cd2d 141
donatien 0:a2dd0ba6cd2d 142 bool m_closed;
donatien 0:a2dd0ba6cd2d 143
donatien 0:a2dd0ba6cd2d 144 enum HttpStep
donatien 0:a2dd0ba6cd2d 145 {
donatien 0:a2dd0ba6cd2d 146 // HTTP_INIT,
donatien 0:a2dd0ba6cd2d 147 HTTP_WRITE_HEADERS,
donatien 0:a2dd0ba6cd2d 148 HTTP_WRITE_DATA,
donatien 0:a2dd0ba6cd2d 149 HTTP_READ_HEADERS,
donatien 0:a2dd0ba6cd2d 150 HTTP_READ_DATA,
donatien 0:a2dd0ba6cd2d 151 HTTP_READ_DATA_INCOMPLETE,
donatien 0:a2dd0ba6cd2d 152 HTTP_DONE,
donatien 0:a2dd0ba6cd2d 153 HTTP_CLOSED
donatien 0:a2dd0ba6cd2d 154 };
donatien 0:a2dd0ba6cd2d 155
donatien 0:a2dd0ba6cd2d 156 HttpStep m_state;
donatien 0:a2dd0ba6cd2d 157
donatien 0:a2dd0ba6cd2d 158 HttpData* m_pDataOut;
donatien 0:a2dd0ba6cd2d 159 HttpData* m_pDataIn;
donatien 0:a2dd0ba6cd2d 160
donatien 0:a2dd0ba6cd2d 161 bool m_dataChunked; //Data is encoded as chunks
donatien 0:a2dd0ba6cd2d 162 int m_dataPos; //Position in data
donatien 0:a2dd0ba6cd2d 163 int m_dataLen; //Data length
donatien 0:a2dd0ba6cd2d 164 char* m_buf;
donatien 0:a2dd0ba6cd2d 165 char* m_pBufRemaining; //Remaining
donatien 0:a2dd0ba6cd2d 166 int m_bufRemainingLen; //Data length in m_pBufRemaining
donatien 0:a2dd0ba6cd2d 167
donatien 0:a2dd0ba6cd2d 168 int m_httpResponseCode;
donatien 0:a2dd0ba6cd2d 169
donatien 0:a2dd0ba6cd2d 170 HttpResult m_blockingResult; //Result if blocking mode
donatien 0:a2dd0ba6cd2d 171
donatien 0:a2dd0ba6cd2d 172 };
donatien 0:a2dd0ba6cd2d 173
donatien 0:a2dd0ba6cd2d 174 //Including data containers here for more convenience
donatien 0:a2dd0ba6cd2d 175 #include "data/HttpFile.h"
donatien 0:a2dd0ba6cd2d 176 #include "data/HttpStream.h"
donatien 0:a2dd0ba6cd2d 177 #include "data/HttpText.h"
donatien 0:a2dd0ba6cd2d 178 #include "data/HttpMap.h"
donatien 0:a2dd0ba6cd2d 179
donatien 0:a2dd0ba6cd2d 180 #endif