klew wrote: Mon Mar 23, 2026 7:20 pm
Tam to zawsze wolno działało. Podejrzewam że jest robiony flush na każdym wysłaniu dowolnego fragmentu HTML.
Ale nigdy się temu dokładnie nie przyglądałem.
Także trzeba by sprawdzić czy to dobry trop oraz czy da się to jakoś inaczej ustawić. W ostateczności można buforować po stronie SUPLI i wysyłać większymi paczkami
Code: Select all
class EspSender : public Supla::WebSender {
public:
explicit EspSender(::ESPWebServer *req);
~EspSender();
void send(const char *, int) override;
protected:
::ESPWebServer *reqHandler;
bool error = false;
static const int BUF_SIZE = 1024;
char buffer[BUF_SIZE];
int buf_pos = 0;
void flushBuffer();
Code: Select all
Supla::EspSender::EspSender(::ESPWebServer *req) : reqHandler(req) {
reqHandler->setContentLength(CONTENT_LENGTH_UNKNOWN);
reqHandler->send(200, "text/html", "");
}
Supla::EspSender::~EspSender() {
flushBuffer();
}
void Supla::EspSender::flushBuffer() {
if (buf_pos > 0 &&
reqHandler &&
reqHandler->client().connected()) {
reqHandler->sendContent(buffer, buf_pos);
}
buf_pos = 0;
}
void Supla::EspSender::send(const char *buf, int size) {
if (error || !buf || !reqHandler) {
return;
}
if (!reqHandler->client().connected()) {
SUPLA_LOG_WARNING("WebSender error - lost connection");
error = true;
return;
}
if (size == -1) {
size = strlen(buf);
}
if (size == 0) {
return;
}
while (size > 0) {
int space = BUF_SIZE - buf_pos;
int chunk = size < space ? size : space;
memcpy(&buffer[buf_pos], buf, chunk);
buf_pos += chunk;
buf += chunk;
size -= chunk;
if (buf_pos == BUF_SIZE)
flushBuffer();
}
}
Rozwiązanie z buforem działa pięknie. @klew proszę dorzuć to do biblioteki bo teraz to jest tragedia
