arduino-libraries / ArduinoHttpClient

Arduino HTTP Client library
288 stars 172 forks source link

Allow custom headers between startRequest & endRequest #12

Closed toddtreece closed 7 years ago

toddtreece commented 8 years ago

Changes

This change allows users to build more complex requests with custom headers when using startRequest and endRequest. Calls to the get, post, put, and del helpers will end the request as they did before.

Tests

SimpleGet.ino:

making GET request
Status code: 200
Response: OK
Wait five seconds

SimplePost:

making POST request
Status code: 200
Response: OK
Wait five seconds

SimplePut:

making PUT request
Status code: 200
Response: OK
Wait five seconds

SimpleDelete:

making DELETE request
Status code: 200
Response: OK
Wait five seconds
sandeepmistry commented 8 years ago

@toddtreece thanks for taking the time to submit this pull request!

Could you please provide example sketches to show what was not working before these changes?

toddtreece commented 7 years ago

@sandeepmistry sorry for the delay. i just was checking the status of this pull req, and noticed your message. i added a new example called CustomHeaders that demonstrates the changes that allow for custom request headers.

GET Example

 client.startRequest("/", HTTP_METHOD_GET);
 client.sendHeader("X-CUSTOM-HEADER", "custom_value");
 client.endRequest();

test server output:

Got a GET request
{ host: '192.168.1.17:8080',
  'user-agent': 'Arduino/2.2.0',
  connection: 'close',
  'x-custom-header': 'custom_value' }

POST Example

String postData = "name=Alice&age=12";
client.startRequest("/", HTTP_METHOD_POST);
client.sendHeader(HTTP_HEADER_CONTENT_TYPE, "application/x-www-form-urlencoded");
client.sendHeader(HTTP_HEADER_CONTENT_LENGTH, postData.length());
client.sendHeader("X-CUSTOM-HEADER", "custom_value");
client.endRequest();
client.write((const byte*)postData.c_str(), postData.length());

test server output:

Got a POST request
{ host: '192.168.1.17:8080',
  'user-agent': 'Arduino/2.2.0',
  connection: 'close',
  'content-type': 'application/x-www-form-urlencoded',
  'content-length': '17',
  'x-custom-header': 'custom_value' }
{ name: 'Alice', age: '12' }
toddtreece commented 7 years ago

we have some adafruit io examples that rely on this custom header change, but we don't want to publish tutorials pointing at our fork if we can avoid it. any chance someone could take a quick look at this change?

sandeepmistry commented 7 years ago

@toddtreece thanks for the clarification.

I've reviewed the additional example sketch you provided and noticed the call to client.beginRequest(); was missing. When I added this statement the example works as intended without any changes to the library, see modified sketch below.

My suggestion to move forward would be to leave the library side alone, and add a new example sketch for custom headers (like the modified one below).

What do you think?

/*

  Custom request header example for the ArduinoHttpClient
  library. This example sends a GET request with a custom header every 5 seconds.

  note: WiFi SSID and password are stored in config.h file.
  If it is not present, add a new tab, call it "config.h"
  and add the following variables:
  char ssid[] = "ssid";     //  your network SSID (name)
  char pass[] = "password"; // your network password

  based on SimpleGet example by Tom Igoe
  header modifications by Todd Treece

  this example is in the public domain
 */
#include <ArduinoHttpClient.h>
#include <WiFi101.h>
#include "config.h"

char serverAddress[] = "10.0.1.14";  // server address
int port = 8080;

WiFiClient wifi;
HttpClient client = HttpClient(wifi, serverAddress, port);
int status = WL_IDLE_STATUS;
String response;
int statusCode = 0;

void setup() {
  Serial.begin(9600);
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to Network named: ");
    Serial.println(ssid);                   // print the network name (SSID);

    // Connect to WPA/WPA2 network:
    status = WiFi.begin(ssid, pass);
  }

  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
}

void loop() {

  Serial.println("making GET request");
  client.beginRequest();
  client.get("/");
  client.sendHeader("X-CUSTOM-HEADER", "custom_value");
  client.endRequest();

  // read the status code and body of the response
  statusCode = client.responseStatusCode();
  response = client.responseBody();

  Serial.print("GET Status code: ");
  Serial.println(statusCode);
  Serial.print("GET Response: ");
  Serial.println(response);

  Serial.println("Wait five seconds");
  delay(5000);

  Serial.println("making POST request");
  String postData = "name=Alice&age=12";
  client.beginRequest();
  client.post("/");
  client.sendHeader(HTTP_HEADER_CONTENT_TYPE, "application/x-www-form-urlencoded");
  client.sendHeader(HTTP_HEADER_CONTENT_LENGTH, postData.length());
  client.sendHeader("X-CUSTOM-HEADER", "custom_value");
  client.endRequest();
  client.write((const byte*)postData.c_str(), postData.length());

  // read the status code and body of the response
  statusCode = client.responseStatusCode();
  response = client.responseBody();

  Serial.print("POST Status code: ");
  Serial.println(statusCode);
  Serial.print("POST Response: ");
  Serial.println(response);

  Serial.println("Wait five seconds");
  delay(5000);
}

Server console logs:

$ node examples/node_test_server/getPostPutDelete.js 
Server listening on port 8080
Got a GET request
{ host: '10.0.1.14:8080',
  'user-agent': 'Arduino/2.2.0',
  connection: 'close',
  'x-custom-header': 'custom_value' }
{}
Got a POST request
{ host: '10.0.1.14:8080',
  'user-agent': 'Arduino/2.2.0',
  connection: 'close',
  'content-type': 'application/x-www-form-urlencoded',
  'content-length': '17',
  'x-custom-header': 'custom_value' }
{ name: 'Alice', age: '12' }
sandeepmistry commented 7 years ago

Closing this in favour of #20 for now. @toddtreece let us know if you'd still like more changes ...