1
0
mirror of https://github.com/arduino-libraries/ArduinoHttpClient.git synced 2025-04-19 21:22:15 +03:00

Merge pull request #2 from sandeepmistry/master

More updates
This commit is contained in:
Massimo Banzi 2016-06-23 10:02:37 +02:00 committed by GitHub
commit 6c39432271
10 changed files with 224 additions and 138 deletions

View File

@ -59,17 +59,18 @@ void HttpClient::beginRequest()
iState = eRequestStarted; iState = eRequestStarted;
} }
int HttpClient::startRequest(const char* aURLPath, const char* aHttpMethod) int HttpClient::startRequest(const char* aURLPath, const char* aHttpMethod,
const char* aContentType, int aContentLength, const byte aBody[])
{ {
tHttpState initialState = iState; if (iState == eReadingBody)
if (!iConnectionClose)
{ {
flushClientRx(); flushClientRx();
resetState(); resetState();
} }
tHttpState initialState = iState;
if ((eIdle != iState) && (eRequestStarted != iState)) if ((eIdle != iState) && (eRequestStarted != iState))
{ {
return HTTP_ERROR_API; return HTTP_ERROR_API;
@ -104,12 +105,33 @@ int HttpClient::startRequest(const char* aURLPath, const char* aHttpMethod)
// Now we're connected, send the first part of the request // Now we're connected, send the first part of the request
int ret = sendInitialHeaders(aURLPath, aHttpMethod); int ret = sendInitialHeaders(aURLPath, aHttpMethod);
if ((initialState == eIdle) && (HTTP_SUCCESS == ret))
if (HTTP_SUCCESS == ret)
{ {
// This was a simple version of the API, so terminate the headers now if (aContentType)
finishHeaders(); {
sendHeader(HTTP_HEADER_CONTENT_TYPE, aContentType);
}
if (aContentLength > 0)
{
sendHeader(HTTP_HEADER_CONTENT_LENGTH, aContentLength);
}
bool hasBody = (aBody && aContentLength > 0);
if (initialState == eIdle || hasBody)
{
// 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.
if (hasBody)
{
write(aBody, aContentLength);
}
} }
// else we'll call it in endRequest or in the first call to print, etc.
return ret; return ret;
} }
@ -231,12 +253,9 @@ void HttpClient::finishHeaders()
void HttpClient::flushClientRx() void HttpClient::flushClientRx()
{ {
if (iClient->connected()) while (iClient->available())
{ {
while (iClient->available()) iClient->read();
{
iClient->read();
}
} }
} }
@ -250,6 +269,91 @@ void HttpClient::endRequest()
// else the end of headers has already been sent, so nothing to do here // else the end of headers has already been sent, so nothing to do here
} }
int HttpClient::get(const char* aURLPath)
{
return startRequest(aURLPath, HTTP_METHOD_GET);
}
int HttpClient::get(const String& aURLPath)
{
return get(aURLPath.c_str());
}
int HttpClient::post(const char* aURLPath)
{
return startRequest(aURLPath, HTTP_METHOD_POST);
}
int HttpClient::post(const String& aURLPath)
{
return post(aURLPath.c_str());
}
int HttpClient::post(const char* aURLPath, const char* aContentType, const char* aBody)
{
return post(aURLPath, aContentType, strlen(aBody), (const byte*)aBody);
}
int HttpClient::post(const String& aURLPath, const String& aContentType, const String& aBody)
{
return post(aURLPath.c_str(), aContentType.c_str(), aBody.length(), (const byte*)aBody.c_str());
}
int HttpClient::post(const char* aURLPath, const char* aContentType, int aContentLength, const byte aBody[])
{
return startRequest(aURLPath, HTTP_METHOD_POST, aContentType, aContentLength, aBody);
}
int HttpClient::put(const char* aURLPath)
{
return startRequest(aURLPath, HTTP_METHOD_PUT);
}
int HttpClient::put(const String& aURLPath)
{
return put(aURLPath.c_str());
}
int HttpClient::put(const char* aURLPath, const char* aContentType, const char* aBody)
{
return put(aURLPath, aContentType, strlen(aBody), (const byte*)aBody);
}
int HttpClient::put(const String& aURLPath, const String& aContentType, const String& aBody)
{
return put(aURLPath.c_str(), aContentType.c_str(), aBody.length(), (const byte*)aBody.c_str());
}
int HttpClient::put(const char* aURLPath, const char* aContentType, int aContentLength, const byte aBody[])
{
return startRequest(aURLPath, HTTP_METHOD_PUT, aContentType, aContentLength, aBody);
}
int HttpClient::del(const char* aURLPath)
{
return startRequest(aURLPath, HTTP_METHOD_DELETE);
}
int HttpClient::del(const String& aURLPath)
{
return del(aURLPath.c_str());
}
int HttpClient::del(const char* aURLPath, const char* aContentType, const char* aBody)
{
return del(aURLPath, aContentType, strlen(aBody), (const byte*)aBody);
}
int HttpClient::del(const String& aURLPath, const String& aContentType, const String& aBody)
{
return del(aURLPath.c_str(), aContentType.c_str(), aBody.length(), (const byte*)aBody.c_str());
}
int HttpClient::del(const char* aURLPath, const char* aContentType, int aContentLength, const byte aBody[])
{
return startRequest(aURLPath, HTTP_METHOD_DELETE, aContentType, aContentLength, aBody);
}
int HttpClient::responseStatusCode() int HttpClient::responseStatusCode()
{ {
if (iState < eRequestSent) if (iState < eRequestSent)
@ -407,6 +511,24 @@ int HttpClient::contentLength()
return iContentLength; return iContentLength;
} }
String HttpClient::responseBody()
{
int bodyLength = contentLength();
String response;
if (bodyLength > 0)
{
response.reserve(bodyLength);
}
while (available())
{
response += (char)read();
}
return response;
}
bool HttpClient::endOfBodyReached() bool HttpClient::endOfBodyReached()
{ {
if (endOfHeadersReached() && (contentLength() != kNoContentLengthHeader)) if (endOfHeadersReached() && (contentLength() != kNoContentLengthHeader))

View File

@ -31,6 +31,7 @@ static const int HTTP_ERROR_INVALID_RESPONSE =-4;
#define HTTP_METHOD_PUT "PUT" #define HTTP_METHOD_PUT "PUT"
#define HTTP_METHOD_DELETE "DELETE" #define HTTP_METHOD_DELETE "DELETE"
#define HTTP_HEADER_CONTENT_LENGTH "Content-Length" #define HTTP_HEADER_CONTENT_LENGTH "Content-Length"
#define HTTP_HEADER_CONTENT_TYPE "Content-Type"
#define HTTP_HEADER_CONNECTION "Connection" #define HTTP_HEADER_CONNECTION "Connection"
#define HTTP_HEADER_USER_AGENT "User-Agent" #define HTTP_HEADER_USER_AGENT "User-Agent"
@ -64,39 +65,77 @@ public:
@param aURLPath Url to request @param aURLPath Url to request
@return 0 if successful, else error @return 0 if successful, else error
*/ */
int get(const char* aURLPath) int get(const char* aURLPath);
{ return startRequest(aURLPath, HTTP_METHOD_GET); } int get(const String& aURLPath);
int get(const String& aURLPath)
{ return get(aURLPath.c_str()); }
/** Connect to the server and start to send a POST request. /** Connect to the server and start to send a POST request.
@param aURLPath Url to request @param aURLPath Url to request
@return 0 if successful, else error @return 0 if successful, else error
*/ */
int post(const char* aURLPath) int post(const char* aURLPath);
{ return startRequest(aURLPath, HTTP_METHOD_POST); } int post(const String& aURLPath);
int post(const String& aURLPath) /** Connect to the server and send a POST request
{ return post(aURLPath.c_str()); } with body and content type
@param aURLPath Url to request
@param aContentType Content type of request body
@param aBody Body of the request
@return 0 if successful, else error
*/
int post(const char* aURLPath, const char* aContentType, const char* aBody);
int post(const String& aURLPath, const String& aContentType, const String& aBody);
int post(const char* aURLPath, const char* aContentType, int aContentLength, const byte aBody[]);
/** Connect to the server and start to send a PUT request. /** Connect to the server and start to send a PUT request.
@param aURLPath Url to request @param aURLPath Url to request
@return 0 if successful, else error @return 0 if successful, else error
*/ */
int put(const char* aURLPath) int put(const char* aURLPath);
{ return startRequest(aURLPath, HTTP_METHOD_PUT); } int put(const String& aURLPath);
int put(const String& aURLPath) /** Connect to the server and send a PUT request
{ return put(aURLPath.c_str()); } with body and content type
@param aURLPath Url to request
@param aContentType Content type of request body
@param aBody Body of the request
@return 0 if successful, else error
*/
int put(const char* aURLPath, const char* aContentType, const char* aBody);
int put(const String& aURLPath, const String& aContentType, const String& aBody);
int put(const char* aURLPath, const char* aContentType, int aContentLength, const byte aBody[]);
/** Connect to the server and start to send a DELETE request.
@param aURLPath Url to request
@return 0 if successful, else error
*/
int del(const char* aURLPath);
int del(const String& aURLPath);
/** Connect to the server and send a DELETE request
with body and content type
@param aURLPath Url to request
@param aContentType Content type of request body
@param aBody Body of the request
@return 0 if successful, else error
*/
int del(const char* aURLPath, const char* aContentType, const char* aBody);
int del(const String& aURLPath, const String& aContentType, const String& aBody);
int del(const char* aURLPath, const char* aContentType, int aContentLength, const byte aBody[]);
/** Connect to the server and start to send the request. /** Connect to the server and start to send the request.
@param aURLPath Url to request If a body is provided, the entire request (including headers and body) will be sent
@param aHttpMethod Type of HTTP request to make, e.g. "GET", "POST", etc. @param aURLPath Url to request
@param aHttpMethod Type of HTTP request to make, e.g. "GET", "POST", etc.
@param aContentType Content type of request body (optional)
@param aContentLength Length of request body (optional)
@param aBody Body of request (optional)
@return 0 if successful, else error @return 0 if successful, else error
*/ */
int startRequest(const char* aURLPath, int startRequest(const char* aURLPath,
const char* aHttpMethod); const char* aHttpMethod,
const char* aContentType = NULL,
int aContentLength = -1,
const byte aBody[] = NULL);
/** Send an additional header line. This can only be called in between the /** Send an additional header line. This can only be called in between the
calls to startRequest and finishRequest. calls to startRequest and finishRequest.
@ -207,6 +246,13 @@ public:
*/ */
int contentLength(); int contentLength();
/** Return the response body as a String
Also skips response headers if they have not been read already
MUST be called after responseStatusCode()
@return response body of request as a String
*/
String responseBody();
/** Enables connection keep-alive mode /** Enables connection keep-alive mode
*/ */
void connectionKeepAlive(); void connectionKeepAlive();

View File

@ -33,7 +33,6 @@ WiFiClient wifi;
HttpClient client = HttpClient(wifi, serverAddress, port); HttpClient client = HttpClient(wifi, serverAddress, port);
int status = WL_IDLE_STATUS; int status = WL_IDLE_STATUS;
int statusCode = 0; int statusCode = 0;
int contentLength = 0;
String response; String response;
void setup() { void setup() {
@ -63,27 +62,13 @@ void loop() {
// send the GET request // send the GET request
Serial.println("making GET request"); Serial.println("making GET request");
client.beginRequest();
client.get(path); client.get(path);
client.endRequest();
// read the status code of the response // read the status code and body of the response
statusCode = client.responseStatusCode(); statusCode = client.responseStatusCode();
response = client.responseBody();
Serial.print("Status code: "); Serial.print("Status code: ");
Serial.println(statusCode); Serial.println(statusCode);
// read the content length of the response
contentLength = client.contentLength();
Serial.print("Content Length: ");
Serial.println(contentLength);
// read the response body
response = "";
response.reserve(contentLength);
while (client.available()) {
response += (char)client.read();
}
Serial.print("Response: "); Serial.print("Response: ");
Serial.println(response); Serial.println(response);

View File

@ -27,7 +27,6 @@ WiFiClient wifi;
HttpClient client = HttpClient(wifi, serverAddress, port); HttpClient client = HttpClient(wifi, serverAddress, port);
int status = WL_IDLE_STATUS; int status = WL_IDLE_STATUS;
int statusCode = 0; int statusCode = 0;
int contentLength = 0;
String response; String response;
void setup() { void setup() {
@ -56,6 +55,8 @@ void loop() {
String dweetName = "scandalous-cheese-hoarder"; String dweetName = "scandalous-cheese-hoarder";
String path = "/dweet/for/" + dweetName; String path = "/dweet/for/" + dweetName;
String contentType = "application/json";
// assemble the body of the POST message: // assemble the body of the POST message:
int sensorValue = analogRead(A0); int sensorValue = analogRead(A0);
String postData = "{\"sensorValue\":\""; String postData = "{\"sensorValue\":\"";
@ -65,23 +66,11 @@ void loop() {
Serial.println("making POST request"); Serial.println("making POST request");
// send the POST request // send the POST request
client.beginRequest(); client.post(path, contentType, postData);
client.post(path);
client.sendHeader("Content-Type", "application/json");
client.sendHeader("Content-Length", postData.length());
client.endRequest();
client.write((const byte*)postData.c_str(), postData.length());
// read the status code and content length of the response // read the status code and body of the response
statusCode = client.responseStatusCode(); statusCode = client.responseStatusCode();
contentLength = client.contentLength(); response = client.responseBody();
// read the response body
response = "";
response.reserve(contentLength);
while (client.available()) {
response += (char)client.read();
}
Serial.print("Status code: "); Serial.print("Status code: ");
Serial.println(statusCode); Serial.println(statusCode);

View File

@ -70,6 +70,8 @@ void sendRequest(int light, String cmd, String value) {
request += light; request += light;
request += "/state/"; request += "/state/";
String contentType = "application/json";
// make a string for the JSON command: // make a string for the JSON command:
String hueCmd = "{\"" + cmd; String hueCmd = "{\"" + cmd;
hueCmd += "\":"; hueCmd += "\":";
@ -81,23 +83,11 @@ void sendRequest(int light, String cmd, String value) {
Serial.print("JSON command to server: "); Serial.print("JSON command to server: ");
// make the PUT request to the hub: // make the PUT request to the hub:
httpClient.beginRequest(); httpClient.put(request, contentType, hueCmd);
httpClient.put(request);
httpClient.sendHeader("Content-Type", "application/json");
httpClient.sendHeader("Content-Length", hueCmd.length());
httpClient.endRequest();
httpClient.write((const byte*)hueCmd.c_str(), hueCmd.length());
// read the status code and content length of the response // read the status code and body of the response
int statusCode = httpClient.responseStatusCode(); int statusCode = httpClient.responseStatusCode();
int contentLength = httpClient.contentLength(); String response = httpClient.responseBody();
// read the response body
String response = "";
response.reserve(contentLength);
while (httpClient.available()) {
response += (char)httpClient.read();
}
Serial.println(hueCmd); Serial.println(hueCmd);
Serial.print("Status code from server: "); Serial.print("Status code from server: ");

View File

@ -26,7 +26,6 @@ HttpClient client = HttpClient(wifi, serverAddress, port);
int status = WL_IDLE_STATUS; int status = WL_IDLE_STATUS;
String response; String response;
int statusCode = 0; int statusCode = 0;
int contentLength = 0;
void setup() { void setup() {
Serial.begin(9600); Serial.begin(9600);
@ -50,25 +49,14 @@ void setup() {
void loop() { void loop() {
Serial.println("making DELETE request"); Serial.println("making DELETE request");
String contentType = "application/x-www-form-urlencoded";
String delData = "name=light&age=46"; String delData = "name=light&age=46";
client.beginRequest(); client.del("/", contentType, delData);
client.startRequest("/", HTTP_METHOD_DELETE);
client.sendHeader("Content-Type", "application/x-www-form-urlencoded");
client.sendHeader("Content-Length", delData.length());
client.endRequest();
client.write((const byte*)delData.c_str(), delData.length());
// read the status code and content length of the response // read the status code and body of the response
statusCode = client.responseStatusCode(); statusCode = client.responseStatusCode();
contentLength = client.contentLength(); response = client.responseBody();
// read the response body
response = "";
response.reserve(contentLength);
while (client.available()) {
response += (char)client.read();
}
Serial.print("Status code: "); Serial.print("Status code: ");
Serial.println(statusCode); Serial.println(statusCode);

View File

@ -25,7 +25,6 @@ HttpClient client = HttpClient(wifi, serverAddress, port);
int status = WL_IDLE_STATUS; int status = WL_IDLE_STATUS;
String response; String response;
int statusCode = 0; int statusCode = 0;
int contentLength = 0;
void setup() { void setup() {
Serial.begin(9600); Serial.begin(9600);
@ -49,21 +48,11 @@ void setup() {
void loop() { void loop() {
Serial.println("making GET request"); Serial.println("making GET request");
// read the status code and content length of the response
client.beginRequest();
client.get("/"); client.get("/");
client.endRequest();
// read the status code and body of the response
statusCode = client.responseStatusCode(); statusCode = client.responseStatusCode();
contentLength = client.contentLength(); response = client.responseBody();
// read the response body
response = "";
response.reserve(contentLength);
while (client.available()) {
response += (char)client.read();
}
Serial.print("Status code: "); Serial.print("Status code: ");
Serial.println(statusCode); Serial.println(statusCode);

View File

@ -26,7 +26,6 @@ HttpClient client = HttpClient(wifi, serverAddress, port);
int status = WL_IDLE_STATUS; int status = WL_IDLE_STATUS;
String response; String response;
int statusCode = 0; int statusCode = 0;
int contentLength = 0;
void setup() { void setup() {
Serial.begin(9600); Serial.begin(9600);
@ -50,25 +49,14 @@ void setup() {
void loop() { void loop() {
Serial.println("making POST request"); Serial.println("making POST request");
String contentType = "application/x-www-form-urlencoded";
String postData = "name=Alice&age=12"; String postData = "name=Alice&age=12";
client.beginRequest(); client.post("/", contentType, postData);
client.post("/");
client.sendHeader("Content-Type", "application/x-www-form-urlencoded");
client.sendHeader("Content-Length", postData.length());
client.endRequest();
client.write((const byte*)postData.c_str(), postData.length());
// read the status code and content length of the response // read the status code and body of the response
statusCode = client.responseStatusCode(); statusCode = client.responseStatusCode();
contentLength = client.contentLength(); response = client.responseBody();
// read the response body
response = "";
response.reserve(contentLength);
while (client.available()) {
response += (char)client.read();
}
Serial.print("Status code: "); Serial.print("Status code: ");
Serial.println(statusCode); Serial.println(statusCode);

View File

@ -26,7 +26,6 @@ HttpClient client = HttpClient(wifi, serverAddress, port);
int status = WL_IDLE_STATUS; int status = WL_IDLE_STATUS;
String response; String response;
int statusCode = 0; int statusCode = 0;
int contentLength = 0;
void setup() { void setup() {
Serial.begin(9600); Serial.begin(9600);
@ -50,25 +49,14 @@ void setup() {
void loop() { void loop() {
Serial.println("making PUT request"); Serial.println("making PUT request");
String contentType = "application/x-www-form-urlencoded";
String putData = "name=light&age=46"; String putData = "name=light&age=46";
client.beginRequest(); client.put("/", contentType, putData);
client.put("/");
client.sendHeader("Content-Type", "application/x-www-form-urlencoded");
client.sendHeader("Content-Length", putData.length());
client.endRequest();
client.write((const byte*)putData.c_str(), putData.length());
// read the status code and content length of the response // read the status code and body of the response
statusCode = client.responseStatusCode(); statusCode = client.responseStatusCode();
contentLength = client.contentLength(); response = client.responseBody();
// read the response body
response = "";
response.reserve(contentLength);
while (client.available()) {
response += (char)client.read();
}
Serial.print("Status code: "); Serial.print("Status code: ");
Serial.println(statusCode); Serial.println(statusCode);

View File

@ -33,6 +33,7 @@ noDefaultRequestHeaders KEYWORD2
headerAvailable KEYWORD2 headerAvailable KEYWORD2
readHeaderName KEYWORD2 readHeaderName KEYWORD2
readHeaderValue KEYWORD2 readHeaderValue KEYWORD2
responseBody KEYWORD2
####################################### #######################################
# Constants (LITERAL1) # Constants (LITERAL1)