diff --git a/HttpClient.cpp b/HttpClient.cpp index 3e7c852..a96ef80 100644 --- a/HttpClient.cpp +++ b/HttpClient.cpp @@ -9,8 +9,14 @@ const char* HttpClient::kUserAgent = "Arduino/2.2.0"; const char* HttpClient::kContentLengthPrefix = HTTP_HEADER_CONTENT_LENGTH ": "; -HttpClient::HttpClient(Client& aClient) - : iClient(&aClient) +HttpClient::HttpClient(Client& aClient, const char* aServerName, uint16_t aServerPort) + : iClient(&aClient), iServerName(aServerName), iServerAddress(), iServerPort(aServerPort) +{ + resetState(); +} + +HttpClient::HttpClient(Client& aClient, const IPAddress& aServerAddress, uint16_t aServerPort) + : iClient(&aClient), iServerName(NULL), iServerAddress(aServerAddress), iServerPort(aServerPort) { resetState(); } @@ -36,7 +42,7 @@ void HttpClient::beginRequest() iState = eRequestStarted; } -int HttpClient::startRequest(const char* aServerName, uint16_t aServerPort, const char* aURLPath, const char* aHttpMethod, const char* aUserAgent) +int HttpClient::startRequest(const char* aURLPath, const char* aHttpMethod) { tHttpState initialState = iState; if ((eIdle != iState) && (eRequestStarted != iState)) @@ -44,16 +50,26 @@ int HttpClient::startRequest(const char* aServerName, uint16_t aServerPort, cons return HTTP_ERROR_API; } - if (!iClient->connect(aServerName, aServerPort) > 0) - { -#ifdef LOGGING - Serial.println("Connection failed"); -#endif - return HTTP_ERROR_CONNECTION_FAILED; + if (iServerName) { + if (!iClient->connect(iServerName, iServerPort) > 0) + { + #ifdef LOGGING + Serial.println("Connection failed"); + #endif + return HTTP_ERROR_CONNECTION_FAILED; + } + } else { + if (!iClient->connect(iServerAddress, iServerPort) > 0) + { + #ifdef LOGGING + Serial.println("Connection failed"); + #endif + return HTTP_ERROR_CONNECTION_FAILED; + } } // Now we're connected, send the first part of the request - int ret = sendInitialHeaders(aServerName, IPAddress(0,0,0,0), aServerPort, aURLPath, aHttpMethod, aUserAgent); + int ret = sendInitialHeaders(aURLPath, aHttpMethod); if ((initialState == eIdle) && (HTTP_SUCCESS == ret)) { // This was a simple version of the API, so terminate the headers now @@ -64,35 +80,7 @@ int HttpClient::startRequest(const char* aServerName, uint16_t aServerPort, cons return ret; } -int HttpClient::startRequest(const IPAddress& aServerAddress, const char* aServerName, uint16_t aServerPort, const char* aURLPath, const char* aHttpMethod, const char* aUserAgent) -{ - tHttpState initialState = iState; - if ((eIdle != iState) && (eRequestStarted != iState)) - { - return HTTP_ERROR_API; - } - - if (!iClient->connect(aServerAddress, aServerPort) > 0) - { -#ifdef LOGGING - Serial.println("Connection failed"); -#endif - return HTTP_ERROR_CONNECTION_FAILED; - } - - // Now we're connected, send the first part of the request - int ret = sendInitialHeaders(aServerName, aServerAddress, aServerPort, aURLPath, aHttpMethod, aUserAgent); - if ((initialState == eIdle) && (HTTP_SUCCESS == ret)) - { - // This was a simple version of the API, so terminate the headers now - finishHeaders(); - } - // else we'll call it in endRequest or in the first call to print, etc. - - return ret; -} - -int HttpClient::sendInitialHeaders(const char* aServerName, IPAddress aServerIP, uint16_t aPort, const char* aURLPath, const char* aHttpMethod, const char* aUserAgent) +int HttpClient::sendInitialHeaders(const char* aURLPath, const char* aHttpMethod) { #ifdef LOGGING Serial.println("Connected"); @@ -104,26 +92,20 @@ int HttpClient::sendInitialHeaders(const char* aServerName, IPAddress aServerIP, iClient->print(aURLPath); iClient->println(" HTTP/1.1"); // The host header, if required - if (aServerName) + if (iServerName) { iClient->print("Host: "); - iClient->print(aServerName); - if (aPort != kHttpPort) + iClient->print(iServerName); + if (iServerPort != kHttpPort) { iClient->print(":"); - iClient->print(aPort); + iClient->print(iServerPort); } iClient->println(); } // And user-agent string - if (aUserAgent) - { - sendHeader(HTTP_HEADER_USER_AGENT, aUserAgent); - } - else - { - sendHeader(HTTP_HEADER_USER_AGENT, kUserAgent); - } + sendHeader(HTTP_HEADER_USER_AGENT, kUserAgent); + // We don't support persistent connections, so tell the server to // close this connection after we're done sendHeader(HTTP_HEADER_CONNECTION, "close"); diff --git a/HttpClient.h b/HttpClient.h index d4d980c..677bb55 100644 --- a/HttpClient.h +++ b/HttpClient.h @@ -44,7 +44,8 @@ public: // FIXME Write longer API request, using port and user-agent, example // FIXME Update tempToPachube example to calculate Content-Length correctly - HttpClient(Client& aClient); + HttpClient(Client& aClient, const char* aServerName, uint16_t aServerPort = kHttpPort); + HttpClient(Client& aClient, const IPAddress& aServerAddress, uint16_t aServerPort = kHttpPort); /** Start a more complex request. Use this when you need to send additional headers in the request, @@ -59,219 +60,33 @@ public: void endRequest(); /** Connect to the server and start to send a GET request. - @param aServerName Name of the server being connected to. If NULL, the - "Host" header line won't be sent - @param aServerPort Port to connect to on the server @param aURLPath Url to request - @param aUserAgent User-Agent string to send. If NULL the default - user-agent kUserAgent will be sent @return 0 if successful, else error */ - int get(const char* aServerName, uint16_t aServerPort, const char* aURLPath, - const char* aUserAgent =NULL) - { return startRequest(aServerName, aServerPort, aURLPath, HTTP_METHOD_GET, aUserAgent); } - - /** Connect to the server and start to send a GET request. - @param aServerName Name of the server being connected to. If NULL, the - "Host" header line won't be sent - @param aURLPath Url to request - @param aUserAgent User-Agent string to send. If NULL the default - user-agent kUserAgent will be sent - @return 0 if successful, else error - */ - int get(const char* aServerName, const char* aURLPath, const char* aUserAgent =NULL) - { return startRequest(aServerName, kHttpPort, aURLPath, HTTP_METHOD_GET, aUserAgent); } - - /** Connect to the server and start to send a GET request. This version connects - doesn't perform a DNS lookup and just connects to the given IP address. - @param aServerAddress IP address of the server to connect to - @param aServerName Name of the server being connected to. If NULL, the - "Host" header line won't be sent - @param aServerPort Port to connect to on the server - @param aURLPath Url to request - @param aUserAgent User-Agent string to send. If NULL the default - user-agent kUserAgent will be sent - @return 0 if successful, else error - */ - int get(const IPAddress& aServerAddress, - const char* aServerName, - uint16_t aServerPort, - const char* aURLPath, - const char* aUserAgent =NULL) - { return startRequest(aServerAddress, aServerName, aServerPort, aURLPath, HTTP_METHOD_GET, aUserAgent); } - - /** Connect to the server and start to send a GET request. This version connects - doesn't perform a DNS lookup and just connects to the given IP address. - @param aServerAddress IP address of the server to connect to - @param aServerName Name of the server being connected to. If NULL, the - "Host" header line won't be sent - @param aURLPath Url to request - @param aUserAgent User-Agent string to send. If NULL the default - user-agent kUserAgent will be sent - @return 0 if successful, else error - */ - int get(const IPAddress& aServerAddress, - const char* aServerName, - const char* aURLPath, - const char* aUserAgent =NULL) - { return startRequest(aServerAddress, aServerName, kHttpPort, aURLPath, HTTP_METHOD_GET, aUserAgent); } + int get(const char* aURLPath) + { return startRequest(aURLPath, HTTP_METHOD_GET); } /** Connect to the server and start to send a POST request. - @param aServerName Name of the server being connected to. If NULL, the - "Host" header line won't be sent - @param aServerPort Port to connect to on the server @param aURLPath Url to request - @param aUserAgent User-Agent string to send. If NULL the default - user-agent kUserAgent will be sent @return 0 if successful, else error */ - int post(const char* aServerName, - uint16_t aServerPort, - const char* aURLPath, - const char* aUserAgent =NULL) - { return startRequest(aServerName, aServerPort, aURLPath, HTTP_METHOD_POST, aUserAgent); } - - /** Connect to the server and start to send a POST request. - @param aServerName Name of the server being connected to. If NULL, the - "Host" header line won't be sent - @param aURLPath Url to request - @param aUserAgent User-Agent string to send. If NULL the default - user-agent kUserAgent will be sent - @return 0 if successful, else error - */ - int post(const char* aServerName, - const char* aURLPath, - const char* aUserAgent =NULL) - { return startRequest(aServerName, kHttpPort, aURLPath, HTTP_METHOD_POST, aUserAgent); } - - /** Connect to the server and start to send a POST request. This version connects - doesn't perform a DNS lookup and just connects to the given IP address. - @param aServerAddress IP address of the server to connect to - @param aServerName Name of the server being connected to. If NULL, the - "Host" header line won't be sent - @param aServerPort Port to connect to on the server - @param aURLPath Url to request - @param aUserAgent User-Agent string to send. If NULL the default - user-agent kUserAgent will be sent - @return 0 if successful, else error - */ - int post(const IPAddress& aServerAddress, - const char* aServerName, - uint16_t aServerPort, - const char* aURLPath, - const char* aUserAgent =NULL) - { return startRequest(aServerAddress, aServerName, aServerPort, aURLPath, HTTP_METHOD_POST, aUserAgent); } - - /** Connect to the server and start to send a POST request. This version connects - doesn't perform a DNS lookup and just connects to the given IP address. - @param aServerAddress IP address of the server to connect to - @param aServerName Name of the server being connected to. If NULL, the - "Host" header line won't be sent - @param aURLPath Url to request - @param aUserAgent User-Agent string to send. If NULL the default - user-agent kUserAgent will be sent - @return 0 if successful, else error - */ - int post(const IPAddress& aServerAddress, - const char* aServerName, - const char* aURLPath, - const char* aUserAgent =NULL) - { return startRequest(aServerAddress, aServerName, kHttpPort, aURLPath, HTTP_METHOD_POST, aUserAgent); } + int post(const char* aURLPath) + { return startRequest(aURLPath, HTTP_METHOD_POST); } /** Connect to the server and start to send a PUT request. - @param aServerName Name of the server being connected to. If NULL, the - "Host" header line won't be sent - @param aServerPort Port to connect to on the server @param aURLPath Url to request - @param aUserAgent User-Agent string to send. If NULL the default - user-agent kUserAgent will be sent @return 0 if successful, else error */ - int put(const char* aServerName, - uint16_t aServerPort, - const char* aURLPath, - const char* aUserAgent =NULL) - { return startRequest(aServerName, aServerPort, aURLPath, HTTP_METHOD_PUT, aUserAgent); } - - /** Connect to the server and start to send a PUT request. - @param aServerName Name of the server being connected to. If NULL, the - "Host" header line won't be sent - @param aURLPath Url to request - @param aUserAgent User-Agent string to send. If NULL the default - user-agent kUserAgent will be sent - @return 0 if successful, else error - */ - int put(const char* aServerName, - const char* aURLPath, - const char* aUserAgent =NULL) - { return startRequest(aServerName, kHttpPort, aURLPath, HTTP_METHOD_PUT, aUserAgent); } - - /** Connect to the server and start to send a PUT request. This version connects - doesn't perform a DNS lookup and just connects to the given IP address. - @param aServerAddress IP address of the server to connect to - @param aServerName Name of the server being connected to. If NULL, the - "Host" header line won't be sent - @param aServerPort Port to connect to on the server - @param aURLPath Url to request - @param aUserAgent User-Agent string to send. If NULL the default - user-agent kUserAgent will be sent - @return 0 if successful, else error - */ - int put(const IPAddress& aServerAddress, - const char* aServerName, - uint16_t aServerPort, - const char* aURLPath, - const char* aUserAgent =NULL) - { return startRequest(aServerAddress, aServerName, aServerPort, aURLPath, HTTP_METHOD_PUT, aUserAgent); } - - /** Connect to the server and start to send a PUT request. This version connects - doesn't perform a DNS lookup and just connects to the given IP address. - @param aServerAddress IP address of the server to connect to - @param aServerName Name of the server being connected to. If NULL, the - "Host" header line won't be sent - @param aURLPath Url to request - @param aUserAgent User-Agent string to send. If NULL the default - user-agent kUserAgent will be sent - @return 0 if successful, else error - */ - int put(const IPAddress& aServerAddress, - const char* aServerName, - const char* aURLPath, - const char* aUserAgent =NULL) - { return startRequest(aServerAddress, aServerName, kHttpPort, aURLPath, HTTP_METHOD_PUT, aUserAgent); } + int put(const char* aURLPath) + { return startRequest(aURLPath, HTTP_METHOD_PUT); } /** Connect to the server and start to send the request. - @param aServerName Name of the server being connected to. - @param aServerPort Port to connect to on the server @param aURLPath Url to request @param aHttpMethod Type of HTTP request to make, e.g. "GET", "POST", etc. - @param aUserAgent User-Agent string to send. If NULL the default - user-agent kUserAgent will be sent @return 0 if successful, else error */ - int startRequest(const char* aServerName, - uint16_t aServerPort, - const char* aURLPath, - const char* aHttpMethod, - const char* aUserAgent); - - /** Connect to the server and start to send the request. - @param aServerAddress IP address of the server to connect to. - @param aServerName Name of the server being connected to. If NULL, the - "Host" header line won't be sent - @param aServerPort Port to connect to on the server - @param aURLPath Url to request - @param aHttpMethod Type of HTTP request to make, e.g. "GET", "POST", etc. - @param aUserAgent User-Agent string to send. If NULL the default - user-agent kUserAgent will be sent - @return 0 if successful, else error - */ - int startRequest(const IPAddress& aServerAddress, - const char* aServerName, - uint16_t aServerPort, - const char* aURLPath, - const char* aHttpMethod, - const char* aUserAgent); + int startRequest(const char* aURLPath, + const char* aHttpMethod); /** Send an additional header line. This can only be called in between the calls to startRequest and finishRequest. @@ -383,23 +198,12 @@ protected: void resetState(); /** Send the first part of the request and the initial headers. - @param aServerName Name of the server being connected to. If NULL, the - "Host" header line won't be sent - @param aServerIP IP address of the server (only used if we're going through a - proxy and aServerName is NULL - @param aServerPort Port of the server being connected to. @param aURLPath Url to request @param aHttpMethod Type of HTTP request to make, e.g. "GET", "POST", etc. - @param aUserAgent User-Agent string to send. If NULL the default - user-agent kUserAgent will be sent @return 0 if successful, else error */ - int sendInitialHeaders(const char* aServerName, - IPAddress aServerIP, - uint16_t aPort, - const char* aURLPath, - const char* aHttpMethod, - const char* aUserAgent); + int sendInitialHeaders(const char* aURLPath, + const char* aHttpMethod); /* Let the server know that we've reached the end of the headers */ @@ -424,8 +228,13 @@ protected: eLineStartingCRFound, eReadingBody } tHttpState; - // Ethernet client we're using + // Client we're using Client* iClient; + // Server we are connecting to + const char* iServerName; + IPAddress iServerAddress; + // Port of server we are connecting to + uint16_t iServerPort; // Current state of the finite-state-machine tHttpState iState; // Stores the status code for the response, once known diff --git a/examples/SimpleHttpExample/SimpleHttpExample.ino b/examples/SimpleHttpExample/SimpleHttpExample.ino index 351ff2b..dd8cb10 100644 --- a/examples/SimpleHttpExample/SimpleHttpExample.ino +++ b/examples/SimpleHttpExample/SimpleHttpExample.ino @@ -51,9 +51,9 @@ void loop() int err =0; WiFiClient c; - HttpClient http(c); + HttpClient http(c, kHostname); - err = http.get(kHostname, kPath); + err = http.get(kPath); if (err == 0) { Serial.println("startedRequest ok");