REGRESSION in 3.1.0: http download gets stuck after headers, as if not getting data
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 35/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Đình trệ
- Công nghệ
- cpp
- Lĩnh vực
- embedded-iot, networking
Hướng nghiên cứu
Bắt đầu bằng cách tái hiện lượt tải xuống được báo cáo với sketch HTTPClient được cung cấp trên Sparkfun ESP8266 Thing Dev, sử dụng ngữ cảnh Arduino IDE và ESP8266 core đã nêu. Kiểm tra hành vi của HTTPClient và WiFi client sau khi nhận được HTTP headers. Công việc được xem là hoàn tất khi lượt tải xuống tiếp tục nhận byte thay vì chờ vô thời hạn, và hồi quy được bao phủ bởi một test hoặc example có thể tái hiện.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Basic Infos
- This issue complies with the issue POLICY doc.
- I have read the documentation at readthedocs and the issue is not addressed there.
- I have tested that the issue is present in current master branch (aka latest git).
- I have searched the issue tracker for a similar issue.
- If there is a stack dump, I have decoded it.
- I have filled out all fields below.
Platform
- Hardware: Sparkfun ESP8266 Thing Dev
- Core Version: I don't know, downloaded today
- Development Env: [Arduino IDE|]
- Operating System: [Manjaro Linux]
Settings in IDE
- Module: [Sparkfun ESP8266 Thing Dev]
- Flash Mode: from the Arduino IDE
- Flash Size: no idea
- lwip Variant: no idea
- Reset Method: no idea
- Flash Frequency: [40Mhz]
- CPU Frequency: [80Mhz|160MHz]
- Upload Using: [SERIAL]
- Upload Speed: [115200] (serial upload only)
Problem Description
In 2019 I wrote a sketch that downloads text from a url using HTTPClient. I uploaded it to a few boards and it has been working flawlessly, and still is.
Now I updated Arduino and the ESP8266 core to the latest version, re-compiled my code (I needed to change a call to HTTPClient::begin() because of BC-breaking changes in the API) and uploaded it to one of the boards), and now the download systematically gets stuck after downloading the http headers, waiting forever for the next bytes to become available.
The hardware is the same, the network is the same, the server I'm downloading from is the same, my code hasn't changed one bit (except again for the HTTPClient::begin() call). Literally the only thing that has changed is I switched to the latest version of Arduino IDE, the core and the libraries.
Code that used to work (that was well tested and has been working without issue for 4 years on a dozen of devices on different wifi networks) is now broken after the update.
Unfortunately I hadn't updated the libraries in the last 4 years, so I don't know when in the last 4 years the bug appeared.
I'm sorry I don't have the time to create a minimal but full working example, and I cannot share the full code because it's too complex. I'll share the part of the code that does the http download.
MCVE Sketch
uint8_t httpbuf[128] = {0};
serial.printf("... Loading from url: %s\n", url.c_str());
int httpcode=200;
int len=KNOWN_LENGTH;
int bytesdownloaded=0;
http.begin(wificlient, url);
httpcode=http.GET();
if (httpcode==200) {
len=http.getSize();
}
serial.printf("... got HTTP code %d; size is %d\n", httpcode, len);
int ticks=0;
int ticks0bytes=0;
if (httpcode==304) {
serial.printf("No new file to download (HTTP 304 response)\n");
return 0;
}
if (httpcode==200) {
if (len==-1) {
serial.printf("Assuming size %d\n", KNOWN_LENGTH);
len = KNOWN_LENGTH;
}
ledCode(LEDCODE_HTTPGET_OK); // this is just a function that blinks the led with one of a set of given patterns
int timestarted = millis();
int timechecked = millis();
int timegotbytes = millis();
while (len > 0 || len ==-1) {
if (millis()-timestarted > DOWNLOAD_MAX_TIME*1000) {
serial.printf("Image download is taking too long. Aborting.\n");
return LIERR_TIMEOUT;
}
int gotbytes=0;
if (!http.connected()) {
break;
}
size_t avl=wificlient.available();
if (avl) {
gotbytes = wificlient.readBytes(httpbuf, ((avl>sizeof(httpbuf))?sizeof(httpbuf):avl));
bytesdownloaded+=gotbytes;
ticks0bytes=0;
}
else {
delay(100);
ticks0bytes++;
if (ticks0bytes>=20) {
serial.printf("... !! been waiting for available bytes for more than 2 seconds!!\n");
ticks0bytes=0;
ticks=10000;
}
}
if (gotbytes>0) {
if (len>0) len=max(0, len-gotbytes);
ticks+=gotbytes;
if (millis()-timechecked > 5000) {
timechecked=millis();
ticks+=10000;
}
if (ticks>=10000) {
ledCode(LEDCODE_HTTPSTREAM_GOTBYTES); // blink once
serial.printf("...((ticks = %d)) %d bytes downloaded; %d remaining\n", ticks, bytesdownloaded, len);
ticks=0;
}
for (int j=0; j<gotbytes; j++) {
//Do stuff with the data downloaded so far
}
timegotbytes = millis();
}
else {
if (millis()-timegotbytes > DOWNLOAD_MAX_TIME_NODATA*1000) {
serial.printf("... !! No data for too long. Aborting.\n");
return LIERR_TIMEOUT;
}
}
}
serial.printf("Done downloading file (%d bytes downloaded).\n", bytesdownloaded);
ledCode(LEDCODE_IMAGE_DONE);
return 0;
}
else {
serial.printf("...HTTP Error %d\n", httpcode);
return LIERR_HTTP_ERROR;
}
Debug Messages
The output from the code above is:
... Loading from url: ******************************************
... got HTTP code 200; size is 384000
... 0 bytes available.
... 0 bytes available.
... 0 bytes available.
... 0 bytes available.
... 0 bytes available.
... 0 bytes available.
... 0 bytes available.
... 0 bytes available.
... !! been waiting for available bytes for more than 2 seconds!!
[.... many times...]
... 0 bytes available.
... 0 bytes available.
... 0 bytes available.
... 0 bytes available.
... 0 bytes available.
... 0 bytes available.
... !! No data for too long. Aborting.
- Ngôn ngữ chính
- C++
- Star
- 16.7k
- Fork
- 13.1k
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Chuẩn bị môi trường
Dự án này không cung cấp dev container, Dockerfile hay hướng dẫn đóng góp, nên bạn cần tự thiết lập môi trường: hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của esp8266/Arduino
-
Typo in Scan Class DocumentationCó thể đã có người làm @MukundaKatta đã nhận 180 ngày trước. Đang mở
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 70/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
-
lwip2 time-wait.patch: TCP_TW_LIMIT can abort the pcb that tcp_process() is still handling -> double free, heap corruptionCó thể đã có người làm @scardus đã nhận 14 ngày trước. Đang mở
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 52/100
-
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 65/100
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 42/100
Tất cả issue của esp8266/Arduino
Issue tương tự
-
ai_p2
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
ClickHouse/ClickHouse#125522 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Branch-3.3.5a
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 67/100
TrinityCore/TrinityCore#32060 ·
Maintainer thường phản hồi trong vòng 3 ngày
-
[CMake] Strengthen pkg-config installation tests to detect missing metadata and dependenciesĐang mởneeds-triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
open-telemetry/opentelemetry-cpp#4697 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 72/100
secondlife/viewer#6432 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement good first issue
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
rajpreetcodes/Skills_MCP_Server#39 ·
Maintainer thường phản hồi trong vòng 1 ngày