Skip to content

Commit

Permalink
ESP8266HTTPClient: fix duplicate Content-Length headers (esp8266#1902)
Browse files Browse the repository at this point in the history
  • Loading branch information
igrr committed Jun 3, 2016
1 parent d1fc700 commit dd81336
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 59 deletions.
14 changes: 11 additions & 3 deletions libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -706,19 +706,27 @@ String HTTPClient::errorToString(int error)
* @param value
* @param first
*/
void HTTPClient::addHeader(const String& name, const String& value, bool first)
void HTTPClient::addHeader(const String& name, const String& value, bool first, bool replace)
{

// not allow set of Header handled by code
if(!name.equalsIgnoreCase(F("Connection")) &&
!name.equalsIgnoreCase(F("User-Agent")) &&
!name.equalsIgnoreCase(F("Host")) &&
!(name.equalsIgnoreCase(F("Authorization")) && _base64Authorization.length())){

String headerLine = name;
headerLine += ": ";

if (replace) {
int headerStart = _headers.indexOf(headerLine);
if (headerStart != -1) {
int headerEnd = _headers.indexOf('\n', headerStart);
_headers = _headers.substring(0, headerStart) + _headers.substring(headerEnd + 1);
}
}

headerLine += value;
headerLine += "\r\n";

if(first) {
_headers = headerLine + _headers;
} else {
Expand Down
2 changes: 1 addition & 1 deletion libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ class HTTPClient
int sendRequest(const char * type, uint8_t * payload = NULL, size_t size = 0);
int sendRequest(const char * type, Stream * stream, size_t size = 0);

void addHeader(const String& name, const String& value, bool first = false);
void addHeader(const String& name, const String& value, bool first = false, bool replace = true);

/// Response handling
void collectHeaders(const char* headerKeys[], const size_t headerKeysCount);
Expand Down
1 change: 1 addition & 0 deletions tests/device/libraries/test_config/test_config.h.template
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@
#define AP_SSID "test_wifi_ap"
#define AP_PASS "test_wifi_ap_pass"

#define SERVER_IP "192.168.10.1"
66 changes: 14 additions & 52 deletions tests/device/test_http_client/test_http_client.ino
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ void setup()

const char* fp = "40 A3 6C E3 8A DF A2 D4 13 B0 32 5C 87 44 54 28 0B CE C5 A4";

TEST_CASE("HTTP GET request", "[HTTPClient]")
TEST_CASE("HTTP GET & POST requests", "[HTTPClient]")
{
{
// small request
Expand All @@ -47,7 +47,20 @@ TEST_CASE("HTTP GET request", "[HTTPClient]")
}
}
}
{
// can do two POST requests with one HTTPClient object (#1902)
HTTPClient http;
http.begin(SERVER_IP, 8088, "/");
http.addHeader("Content-Type", "text/plain");
auto httpCode = http.POST("foo");
Serial.println(httpCode);
REQUIRE(httpCode == HTTP_CODE_OK);
http.end();

httpCode = http.POST("bar");
REQUIRE(httpCode == HTTP_CODE_OK);
http.end();
}
}


Expand Down Expand Up @@ -79,57 +92,6 @@ TEST_CASE("HTTPS GET request", "[HTTPClient]")
}

}
// TEST_CASE("HTTP GET request", "[HTTPClient]")
// {
// const int repeatCount = 10;

// String url = createBin(false);
// int heapBefore = ESP.getFreeHeap();
// for (int i = 0; i < repeatCount; ++i) {
// HTTPClient http;
// http.begin(url);
// auto httpCode = http.GET();
// REQUIRE(httpCode == HTTP_CODE_OK);
// String payload = http.getString();
// payload.replace("\n", "\\n");
// String quotedPayload;
// quotedPayload.reserve(payload.length() + 3);
// quotedPayload += "\"";
// quotedPayload += payload;
// quotedPayload += "\"";
// Serial.println("----payload:");
// Serial.println(quotedPayload);
// Serial.println("----");
// Serial.println("----test_payload:");
// Serial.println(test_payload);
// Serial.println("----");
// CHECK(quotedPayload == test_payload);
// http.end();
// delay(100);
// }
// int heapAfter = ESP.getFreeHeap();
// CHECK(heapBefore - heapAfter <= 8);
// }

// TEST_CASE("HTTPS GET request", "[HTTPClient]")
// {
// const int repeatCount = 10;

// String url = createBin(true);
// int heapBefore = ESP.getFreeHeap();
// for (int i = 0; i < repeatCount; ++i) {
// HTTPClient http;
// http.begin(url, mockbin_fingerprint);
// auto httpCode = http.GET();
// REQUIRE(httpCode == HTTP_CODE_OK);
// String payload = http.getString();
// CHECK(payload == test_payload);
// http.end();
// delay(100);
// }
// int heapAfter = ESP.getFreeHeap();
// CHECK(heapBefore - heapAfter <= 8);
// }

void loop()
{
Expand Down
7 changes: 4 additions & 3 deletions tests/device/test_http_client/test_http_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import os
import ssl

@setup('HTTP GET request')
@setup('HTTP GET & POST requests')
def setup_http_get(e):
app = Flask(__name__)
def shutdown_server():
Expand All @@ -17,8 +17,9 @@ def shutdown_server():
def shutdown():
shutdown_server()
return 'Server shutting down...'
@app.route("/")
@app.route("/", methods = ['GET', 'POST'])
def root():
print('Got data: ' + request.data);
return 'hello!!!'
@app.route("/data")
def get_data():
Expand All @@ -29,7 +30,7 @@ def flaskThread():
th = Thread(target=flaskThread)
th.start()

@teardown('HTTP GET request')
@teardown('HTTP GET & POST requests')
def teardown_http_get(e):
response = urllib2.urlopen('http://localhost:8088/shutdown')
html = response.read()
Expand Down

0 comments on commit dd81336

Please sign in to comment.