Skip to content

Allow custom headers between startRequest & endRequest #12

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed

Conversation

toddtreece
Copy link

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
Copy link

@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
Copy link
Author

@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
Copy link
Author

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
Copy link

@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' }

agdl added a commit to agdl/ArduinoHttpClient that referenced this pull request Jan 12, 2017
Added the example posted in arduino-libraries#12 to close the PR. Tested and it works
@agdl agdl mentioned this pull request Jan 12, 2017
sandeepmistry pushed a commit that referenced this pull request Jan 12, 2017
Added the example posted in #12 to close the PR. Tested and it works
@sandeepmistry
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants