77#include " HttpHeader.h"
88#include " IHttpRequest.h"
99#include " basic/StrPrint.h"
10+ #ifdef ESP32
11+ #include < WiFi.h>
12+ #include < lwip/sockets.h>
13+ #endif
1014
1115namespace tiny_dlna {
1216
@@ -71,6 +75,7 @@ class HttpRequest : public IHttpRequest {
7175 DlnaLogger.log (DlnaLogLevel::Info, " HttpRequest::stop" );
7276 if (client_ptr != nullptr ) {
7377 client_ptr->stop ();
78+ // delay(300);
7479 }
7580 }
7681
@@ -183,6 +188,8 @@ class HttpRequest : public IHttpRequest {
183188 // / Sets the timeout.
184189 void setTimeout (int ms) override { client_ptr->setTimeout (ms); }
185190
191+ bool isKeepAlive () { return StrView (connection).equals (CON_KEEP_ALIVE); }
192+
186193 protected:
187194 ClientType default_client;
188195 Client* client_ptr = nullptr ;
@@ -201,12 +208,38 @@ class HttpRequest : public IHttpRequest {
201208
202209 // / opens a connection to the indicated host
203210 virtual int connect (const char * ip, uint16_t port) {
204- DlnaLogger.log (DlnaLogLevel::Info, " HttpRequest::connect %s" , ip);
205- int rc = this ->client_ptr ->connect (ip, port);
211+ this ->client_ptr ->setTimeout (DLNA_HTTP_REQUEST_TIMEOUT_MS);
212+ if (!isKeepAlive () && this ->client_ptr ->connected ()) {
213+ stop ();
214+ }
215+ #ifdef ESP32
216+ // clear input buffer
217+ static_cast <ClientType*>(client_ptr)->clear ();
218+ // static_cast<ClientType*>(client_ptr)
219+ // ->setConnectionTimeout(DLNA_HTTP_REQUEST_TIMEOUT_MS);
220+ static_cast <ClientType*>(client_ptr)->setNoDelay (true );
221+ int enable = 1 ;
222+ static_cast <ClientType*>(client_ptr)
223+ ->setSocketOption (SOL_SOCKET, SO_REUSEADDR, &enable,
224+ sizeof (enable)); // Address reuse
225+ #endif
226+ DlnaLogger.log (DlnaLogLevel::Info, " HttpRequest::connect %s:%d" , ip, port);
206227 uint64_t end = millis () + client_ptr->getTimeout ();
207- DlnaLogger.log (DlnaLogLevel::Info, " Connected: %s (rc=%d) with timeout %ld" ,
208- connected () ? " true" : " false" , rc,
209- client_ptr->getTimeout ());
228+ bool rc = false ;
229+ for (int j=0 ;j < 3 ; j++) {
230+ rc = this ->client_ptr ->connect (ip, port);
231+ if (rc) break ;
232+ delay (200 );
233+ }
234+ if (!connected ()) {
235+ DlnaLogger.log (
236+ DlnaLogLevel::Error, " Connected: %s (rc=%d) with timeout %ld" ,
237+ connected () ? " true" : " false" , rc, client_ptr->getTimeout ());
238+ } else {
239+ DlnaLogger.log (
240+ DlnaLogLevel::Debug, " Connected: %s (rc=%d) with timeout %ld" ,
241+ connected () ? " true" : " false" , rc, client_ptr->getTimeout ());
242+ }
210243 return rc;
211244 }
212245
@@ -281,9 +314,6 @@ class HttpRequest : public IHttpRequest {
281314 DlnaLogger.log (DlnaLogLevel::Info, " %s %s" , methods[method], url.url ());
282315
283316 if (!connected ()) {
284- DlnaLogger.log (DlnaLogLevel::Info,
285- " HttpRequest::connecting to host %s port %d" , url.host (),
286- url.port ());
287317 connect (url.host (), url.port ());
288318 }
289319
0 commit comments