Witam
Mam problem z wczytaniem contentu z zapytania typu get do githuba o pobranie zawartości z pliku w repozytorium.
To jest link do pliku na githubie który pobieram z serwera i chcę wczytać jego zawartość. https://api.github.com/repos/Marak123/test/git/blobs/2228adff467aa743f438ec03a3585857a06ef6e2
Ma on ponad 1MB jest to plik z obrazem SPIFFS do ESP32 bo robię automatyczny updater ESP32 który będzie się samemu aktualizował gdy wykryje aktualizację.
Tylko ze pobierać się pobiera i jest fajnie mam cały nagłówek i według nagłówka cały kontent ale gdy próbuję wczytać ten kontent to nie wczytuje się cały tylko gdzieś tak do połowy i jest to tak naprawdę losowo raz więcej się wczyta raz mniej a nie raz nawet cały się wczyta i nie wiem o co chodzi.
To są metody wczytywania które probowałem:
String response = "";
for(int i=0; i<contentLength; i++){
int c = client.read();
if(c == -1 && c == 0){
i--;
continue;
}
ile++;
response += (char)c;
}
Serial.println(response);
while (client.available()) {
char c = client.read();
Serial.write(c);
}
while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") {
Serial.println("headers received");
break;
}
}
String content = "";
while (client.available()) {
content += client.readStringUntil('\n');
}
Niektóre metody wziąłem z neta ale i tak nie działają żadna z powyższych nie wczytuje całego kontentu za każdym razem. Wie ktoś może dlaczego tak się może dziać??
Dodam jeszcze ze mniejszy plik ok. 200 kb wczytało parę razy cały kontent ale jeżeli chodzi o plik który ma 1.5MB to nigdy mi nie wczytało go jeszcze całego.
Ma ktoś jakieś pomysły??
Edit::
Do pobrania kontektu używam biblioteki WifiClient
To jest kod pobierania danych:
const char github_cert [] PROGMEM = R"CERT(
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
+OkuE6N36B9K
-----END CERTIFICATE-----
)CERT";
const char* github_host = "api.github.com";
const uint16_t github_port = 443;
String github_token = "token";
WiFiClientSecure client;
client.setCACert(github_cert);
if(!client.connect(github_host, github_port)){
Serial.println("Failed to connect to server");
return;
}
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + github_host + "\r\n" +
"Cache-Control: no-cache\r\n" +
"User-Agent: Awesome-Octocat-App\r\n" +
"Authorization: token " + github_token + "\r\n" +
"Connection: close\r\n\r\n");
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println("Client Timeout!");
client.stop();
return;
}
}
while (client.available()) {
String line = client.readStringUntil('\n');
Serial.println(line);
line.trim();
if(!line.length()) break;
if (line.startsWith("HTTP/1.1")) {
if (line.indexOf("200") < 0) {
Serial.println("Got a non 200 status code from server. Exiting OTA Update.");
break;
}
}
if (line.startsWith("Content-Length: ")) {
contentLength = atol((line.substring(strlen(String("Content-Length: ").c_str()))).c_str());
Serial.println("Got " + String(contentLength) + " bytes from server");
}
if (line.startsWith("Content-Type: ")) {
String contentType = line.substring(strlen(String("Content-Type: ").c_str()));
Serial.println("Got " + contentType + " payload.");
if (contentType == "application/octet-stream") {
isValidContentType = true;
}
}
}