Fixed custom headers and Basic authorization, added support for redirection, functional file download interface can be used for SW updates and more.

Dependents:   Sample_HTTPClient Sample_HTTPClient LWM2M_NanoService_Ethernet LWM2M_NanoService_Ethernet ... more

Fork of HTTPClient by Vincent Wochnik

More recent changes - added iCal processing.

Derivative of a derivative, however this one works when it comes to supplying Basic authorization to access a protected resource. Some additional changes to the debug interface to clean it up for consistency with many other components I have.

Revision:
20:4ea5255c1b04
Parent:
19:bcbf0af9fac3
Child:
21:d33f7e1ce811
--- a/HTTPClient.h	Fri Jan 24 13:51:36 2014 +0000
+++ b/HTTPClient.h	Sun Feb 02 16:47:06 2014 +0000
@@ -34,19 +34,18 @@
 #include "mbed.h"
 
 ///HTTP client results
-enum HTTPResult
-{
-  HTTP_PROCESSING, ///<Processing
-  HTTP_PARSE, ///<url Parse error
-  HTTP_DNS, ///<Could not resolve name
-  HTTP_PRTCL, ///<Protocol error
-  HTTP_NOTFOUND, ///<HTTP 404 Error
-  HTTP_REFUSED, ///<HTTP 403 Error
-  HTTP_ERROR, ///<HTTP xxx error
-  HTTP_TIMEOUT, ///<Connection timeout
-  HTTP_CONN, ///<Connection error
-  HTTP_CLOSED, ///<Connection was closed by remote host
-  HTTP_OK = 0, ///<Success
+enum HTTPResult {
+    HTTP_PROCESSING, ///<Processing
+    HTTP_PARSE, ///<url Parse error
+    HTTP_DNS, ///<Could not resolve name
+    HTTP_PRTCL, ///<Protocol error
+    HTTP_NOTFOUND, ///<HTTP 404 Error
+    HTTP_REFUSED, ///<HTTP 403 Error
+    HTTP_ERROR, ///<HTTP xxx error
+    HTTP_TIMEOUT, ///<Connection timeout
+    HTTP_CONN, ///<Connection error
+    HTTP_CLOSED, ///<Connection was closed by remote host
+    HTTP_OK = 0, ///<Success
 };
 
 /**A simple HTTP Client
@@ -57,108 +56,123 @@
 class HTTPClient
 {
 public:
-  ///Instantiate the HTTP client
-  HTTPClient();
-  ~HTTPClient();
-  
-  /**
-  Provides a basic authentification feature (Base64 encoded username and password)
-  Pass two NULL pointers to switch back to no authentication
-  @param user username to use for authentication, must remain valid durlng the whole HTTP session
-  @param user password to use for authentication, must remain valid durlng the whole HTTP session
-  */
-  void basicAuth(const char* user, const char* password); //Basic Authentification
-  
-  /**
-  Set custom headers for request.
-  Pass NULL, 0 to turn off custom headers.
-  @param headers an array (size multiple of two) key-value pairs, must remain valid during the whole HTTP session
-  @param pairs number of key-value pairs
-  */
-  void customHeaders(const char** headers, size_t pairs);
-  
-  //High Level setup functions
-  /** Execute a GET request on the URL
-  Blocks until completion
-  @param url : url on which to execute the request
-  @param pDataIn : pointer to an IHTTPDataIn instance that will collect the data returned by the request, can be NULL
-  @param timeout waiting timeout in ms (osWaitForever for blocking function, not recommended)
-  @return 0 on success, HTTP error (<0) on failure
-  */
-  HTTPResult get(const char* url, IHTTPDataIn* pDataIn, int timeout = HTTP_CLIENT_DEFAULT_TIMEOUT); //Blocking
-  
-  /** Execute a GET request on the URL
-  Blocks until completion
-  This is a helper to directly get a piece of text from a HTTP result
-  @param url : url on which to execute the request
-  @param result : pointer to a char array in which the result will be stored
-  @param maxResultLen : length of the char array (including space for the NULL-terminating char)
-  @param timeout waiting timeout in ms (osWaitForever for blocking function, not recommended)
-  @return 0 on success, HTTP error (<0) on failure
-  */
-  HTTPResult get(const char* url, char* result, size_t maxResultLen, int timeout = HTTP_CLIENT_DEFAULT_TIMEOUT); //Blocking
+    ///Instantiate the HTTP client
+    HTTPClient();
+    ~HTTPClient();
+
+    /**
+    Provides a basic authentification feature (Base64 encoded username and password)
+    Pass two NULL pointers to switch back to no authentication
+    @param user username to use for authentication, must remain valid durlng the whole HTTP session
+    @param user password to use for authentication, must remain valid durlng the whole HTTP session
+    */
+    void basicAuth(const char* user, const char* password); //Basic Authentification
+
+    /**
+    Set custom headers for request.
+    
+    Pass NULL, 0 to turn off custom headers.
+    
+    @code
+     const char * hdrs[] = 
+            {
+            "Connection", "keep-alive",
+            "Accept", "text/html",
+            "User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64)",
+            "Accept-Encoding", "gzip,deflate,sdch",
+            "Accept-Language", "en-US,en;q=0.8",
+            };
+
+        http.basicAuth("username", "password");
+        http.customHeaders(hdrs, 5);
+    @endcode
+    
+    @param headers an array (size multiple of two) key-value pairs, must remain valid during the whole HTTP session
+    @param pairs number of key-value pairs
+    */
+    void customHeaders(const char** headers, size_t pairs);
+
+    //High Level setup functions
+    /** Execute a GET request on the URL
+    Blocks until completion
+    @param url : url on which to execute the request
+    @param pDataIn : pointer to an IHTTPDataIn instance that will collect the data returned by the request, can be NULL
+    @param timeout waiting timeout in ms (osWaitForever for blocking function, not recommended)
+    @return 0 on success, HTTP error (<0) on failure
+    */
+    HTTPResult get(const char* url, IHTTPDataIn* pDataIn, int timeout = HTTP_CLIENT_DEFAULT_TIMEOUT); //Blocking
+
+    /** Execute a GET request on the URL
+    Blocks until completion
+    This is a helper to directly get a piece of text from a HTTP result
+    @param url : url on which to execute the request
+    @param result : pointer to a char array in which the result will be stored
+    @param maxResultLen : length of the char array (including space for the NULL-terminating char)
+    @param timeout waiting timeout in ms (osWaitForever for blocking function, not recommended)
+    @return 0 on success, HTTP error (<0) on failure
+    */
+    HTTPResult get(const char* url, char* result, size_t maxResultLen, int timeout = HTTP_CLIENT_DEFAULT_TIMEOUT); //Blocking
 
-  /** Execute a POST request on the URL
-  Blocks until completion
-  @param url : url on which to execute the request
-  @param dataOut : a IHTTPDataOut instance that contains the data that will be posted
-  @param pDataIn : pointer to an IHTTPDataIn instance that will collect the data returned by the request, can be NULL
-  @param timeout waiting timeout in ms (osWaitForever for blocking function, not recommended)
-  @return 0 on success, HTTP error (<0) on failure
-  */
-  HTTPResult post(const char* url, const IHTTPDataOut& dataOut, IHTTPDataIn* pDataIn, int timeout = HTTP_CLIENT_DEFAULT_TIMEOUT); //Blocking
-  
-  /** Execute a PUT request on the URL
-  Blocks until completion
-  @param url : url on which to execute the request
-  @param dataOut : a IHTTPDataOut instance that contains the data that will be put
-  @param pDataIn : pointer to an IHTTPDataIn instance that will collect the data returned by the request, can be NULL
-  @param timeout waiting timeout in ms (osWaitForever for blocking function, not recommended)
-  @return 0 on success, HTTP error (<0) on failure
-  */
-  HTTPResult put(const char* url, const IHTTPDataOut& dataOut, IHTTPDataIn* pDataIn, int timeout = HTTP_CLIENT_DEFAULT_TIMEOUT); //Blocking
-  
-  /** Execute a DELETE request on the URL
-  Blocks until completion
-  @param url : url on which to execute the request
-  @param pDataIn : pointer to an IHTTPDataIn instance that will collect the data returned by the request, can be NULL
-  @param timeout waiting timeout in ms (osWaitForever for blocking function, not recommended)
-  @return 0 on success, HTTP error (<0) on failure
-  */
-  HTTPResult del(const char* url, IHTTPDataIn* pDataIn, int timeout = HTTP_CLIENT_DEFAULT_TIMEOUT); //Blocking
-  
-  /** Get last request's HTTP response code
-  @return The HTTP response code of the last request
-  */
-  int getHTTPResponseCode();
-  
+    /** Execute a POST request on the URL
+    Blocks until completion
+    @param url : url on which to execute the request
+    @param dataOut : a IHTTPDataOut instance that contains the data that will be posted
+    @param pDataIn : pointer to an IHTTPDataIn instance that will collect the data returned by the request, can be NULL
+    @param timeout waiting timeout in ms (osWaitForever for blocking function, not recommended)
+    @return 0 on success, HTTP error (<0) on failure
+    */
+    HTTPResult post(const char* url, const IHTTPDataOut& dataOut, IHTTPDataIn* pDataIn, int timeout = HTTP_CLIENT_DEFAULT_TIMEOUT); //Blocking
+
+    /** Execute a PUT request on the URL
+    Blocks until completion
+    @param url : url on which to execute the request
+    @param dataOut : a IHTTPDataOut instance that contains the data that will be put
+    @param pDataIn : pointer to an IHTTPDataIn instance that will collect the data returned by the request, can be NULL
+    @param timeout waiting timeout in ms (osWaitForever for blocking function, not recommended)
+    @return 0 on success, HTTP error (<0) on failure
+    */
+    HTTPResult put(const char* url, const IHTTPDataOut& dataOut, IHTTPDataIn* pDataIn, int timeout = HTTP_CLIENT_DEFAULT_TIMEOUT); //Blocking
+
+    /** Execute a DELETE request on the URL
+    Blocks until completion
+    @param url : url on which to execute the request
+    @param pDataIn : pointer to an IHTTPDataIn instance that will collect the data returned by the request, can be NULL
+    @param timeout waiting timeout in ms (osWaitForever for blocking function, not recommended)
+    @return 0 on success, HTTP error (<0) on failure
+    */
+    HTTPResult del(const char* url, IHTTPDataIn* pDataIn, int timeout = HTTP_CLIENT_DEFAULT_TIMEOUT); //Blocking
+
+    /** Get last request's HTTP response code
+    @return The HTTP response code of the last request
+    */
+    int getHTTPResponseCode();
+
 private:
-  enum HTTP_METH
-  {
-    HTTP_GET,
-    HTTP_POST,
-    HTTP_PUT,
-    HTTP_DELETE,
-    HTTP_HEAD
-  };
+    enum HTTP_METH {
+        HTTP_GET,
+        HTTP_POST,
+        HTTP_PUT,
+        HTTP_DELETE,
+        HTTP_HEAD
+    };
 
-  HTTPResult connect(const char* url, HTTP_METH method, IHTTPDataOut* pDataOut, IHTTPDataIn* pDataIn, int timeout); //Execute request
-  HTTPResult recv(char* buf, size_t minLen, size_t maxLen, size_t* pReadLen); //0 on success, err code on failure
-  HTTPResult send(char* buf, size_t len = 0); //0 on success, err code on failure
-  HTTPResult parseURL(const char* url, char* scheme, size_t maxSchemeLen, char* host, size_t maxHostLen, uint16_t* port, char* path, size_t maxPathLen); //Parse URL
-  void createauth (const char *user, const char *pwd, char *buf, int len);
-  int base64enc(const char *input, unsigned int length, char *output, int len);
+    HTTPResult connect(const char* url, HTTP_METH method, IHTTPDataOut* pDataOut, IHTTPDataIn* pDataIn, int timeout); //Execute request
+    HTTPResult recv(char* buf, size_t minLen, size_t maxLen, size_t* pReadLen); //0 on success, err code on failure
+    HTTPResult send(char* buf, size_t len = 0); //0 on success, err code on failure
+    HTTPResult parseURL(const char* url, char* scheme, size_t maxSchemeLen, char* host, size_t maxHostLen, uint16_t* port, char* path, size_t maxPathLen); //Parse URL
+    void createauth (const char *user, const char *pwd, char *buf, int len);
+    int base64enc(const char *input, unsigned int length, char *output, int len);
 
-  //Parameters
-  TCPSocketConnection m_sock;
-  
-  int m_timeout;
+    //Parameters
+    TCPSocketConnection m_sock;
+
+    int m_timeout;
 
-  const char* m_basicAuthUser;
-  const char* m_basicAuthPassword;
-  const char** m_customHeaders;
-  size_t m_nCustomHeaders;
-  int m_httpResponseCode;
+    const char* m_basicAuthUser;
+    const char* m_basicAuthPassword;
+    const char** m_customHeaders;
+    size_t m_nCustomHeaders;
+    int m_httpResponseCode;
 
 };