@@ -205,7 +205,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
205205 function_return_type ret = conn.netConnect ();
206206 if (ret == ret_failure)
207207 {
208- // In case TCP (network) disconnected error.
208+ // TCP (network) disconnected error.
209209 setAsyncError (sData ? sData : nullptr , sData ? sData ->state : astate_undefined, FIREBASE_ERROR_TCP_DISCONNECTED, sData ? !sData ->sse : true , false );
210210 return ret_failure;
211211 }
@@ -242,7 +242,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
242242 {
243243 if (!sData ->request .openFile (file_mode_open_read))
244244 {
245- // In case file open error.
245+ // File open error.
246246 setAsyncError (sData , state, FIREBASE_ERROR_OPEN_FILE, !sData ->sse , true );
247247 return ret_failure;
248248 }
@@ -290,7 +290,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
290290 toSend = sData ->request .file_data .file .read (buf, toSend);
291291 if (toSend == 0 )
292292 {
293- // In case file read error.
293+ // File read error.
294294 setAsyncError (sData , state, FIREBASE_ERROR_FILE_READ, !sData ->sse , true );
295295 ret = ret_failure;
296296 goto exit;
@@ -325,7 +325,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
325325 toSend = sData ->request .file_data .file .read (buf, toSend);
326326 if (toSend == 0 )
327327 {
328- // In case file read error.
328+ // File read error.
329329 setAsyncError (sData , state, FIREBASE_ERROR_FILE_READ, !sData ->sse , true );
330330 ret = ret_failure;
331331 goto exit;
@@ -424,7 +424,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
424424
425425 sData ->return_type = sData ->request .payloadIndex == size && size > 0 ? ret_complete : ret_failure;
426426
427- // In case TCP write error.
427+ // TCP write error.
428428 if (sData ->return_type == ret_failure)
429429 setAsyncError (sData , state, FIREBASE_ERROR_TCP_SEND, !sData ->sse , false );
430430
@@ -495,7 +495,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
495495 {
496496 if (sData ->request .app_token ->val [app_tk_ns::token].length () == 0 )
497497 {
498- // In case missing auth token error.
498+ // Missing auth token error.
499499 setAsyncError (sData , sData ->state , FIREBASE_ERROR_UNAUTHENTICATE, !sData ->sse , false );
500500 return ret_failure;
501501 }
@@ -541,7 +541,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
541541 // HTTP error is allowed in case non-auth task to get its response.
542542 if (!readResponse (sData ))
543543 {
544- // In case HTTP or TCP read error.
544+ // HTTP or TCP read error.
545545 setAsyncError (sData , sData ->state , sData ->response .httpCode > 0 ? sData ->response .httpCode : FIREBASE_ERROR_TCP_RECEIVE_TIMEOUT, !sData ->sse , false );
546546 return ret_failure;
547547 }
@@ -600,7 +600,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
600600
601601 function_return_type connErrorHandler (async_data *sData , async_state state)
602602 {
603- // In case TCP connection error.
603+ // TCP connection error.
604604 setAsyncError (sData , state, FIREBASE_ERROR_TCP_CONNECTION, !sData ->sse , false );
605605 return ret_failure;
606606 }
@@ -814,14 +814,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
814814 parseSSE (&sData ->aResult .rtdbResult );
815815
816816 // Event filtering.
817- String event = sData ->aResult .rtdbResult .event ();
818- if (sse_events_filter.length () == 0 ||
819- (sData ->response .flags .http_response && sse_events_filter.indexOf (" get" ) > -1 && event.indexOf (" put" ) > -1 ) ||
820- (!sData ->response .flags .http_response && sse_events_filter.indexOf (" put" ) > -1 && event.indexOf (" put" ) > -1 ) ||
821- (sse_events_filter.indexOf (" patch" ) > -1 && event.indexOf (" patch" ) > -1 ) ||
822- (sse_events_filter.indexOf (" keep-alive" ) > -1 && event.indexOf (" keep-alive" ) > -1 ) ||
823- (sse_events_filter.indexOf (" cancel" ) > -1 && event.indexOf (" cancel" ) > -1 ) ||
824- (sse_events_filter.indexOf (" auth_revoked" ) > -1 && event.indexOf (" auth_revoked" ) > -1 ))
817+ if (sseFilter (sData ))
825818 {
826819 // save payload to slot result
827820 sData ->aResult .setPayload (*payload);
@@ -830,9 +823,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
830823 returnResult (sData , true );
831824 }
832825 else
833- {
834826 clear (*payload);
835- }
836827
837828 sData ->response .flags .http_response = false ;
838829 }
@@ -852,60 +843,31 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
852843 {
853844 if (sData ->response .flags .header_remaining )
854845 {
855- int read = sData ->response .readLine ();
856- if ((read == 1 && sData ->response .val [resns::header][sData ->response .val [resns::header].length () - 1 ] == ' \n ' ) ||
857- (read == 2 && sData ->response .val [resns::header][sData ->response .val [resns::header].length () - 2 ] == ' \r ' && sData ->response .val [resns::header][sData ->response .val [resns::header].length () - 1 ] == ' \n ' ))
846+ if (sData ->response .readHeader (sData ->sse , !sData ->auth_used , sData ->upload ))
858847 {
859- sData ->response .flags .http_response = true ;
860- clear (sData ->response .val [resns::etag]);
861- String temp;
862848#if defined(ENABLE_CLOUD_STORAGE)
863849 if (sData ->upload )
864850 sData ->response .parseRespHeader (sData ->request .file_data .resumable .getLocationRef (), " Location" );
865851#else
866852 sData ->response .parseRespHeader (sData ->response .val [resns::location], " Location" );
867-
868853#endif
869- sData ->response .parseRespHeader (sData ->response .val [resns::etag], " ETag" );
870854 resETag = sData ->response .val [resns::etag];
871855 sData ->aResult .val [ares_ns::res_etag] = sData ->response .val [resns::etag];
872856 sData ->aResult .val [ares_ns::data_path] = sData ->request .val [reqns::path];
857+
873858#if defined(ENABLE_DATABASE)
874859 setNullETagOption (&sData ->aResult .rtdbResult , sData ->response .val [resns::etag].indexOf (" null_etag" ) > -1 );
875860#endif
876861
877- sData ->response .parseRespHeader (temp, " Content-Length" );
878- sData ->response .payloadLen = atoi (temp.c_str ());
879-
880- sData ->response .parseRespHeader (temp, " Connection" );
881- sData ->response .flags .keep_alive = temp.length () && temp.indexOf (" keep-alive" ) > -1 ;
882-
883- sData ->response .parseRespHeader (temp, " Transfer-Encoding" );
884- sData ->response .flags .chunks = temp.length () && temp.indexOf (" chunked" ) > -1 ;
885-
886- sData ->response .parseRespHeader (temp, " Content-Type" );
887- sData ->response .flags .sse = temp.length () && temp.indexOf (" text/event-stream" ) > -1 ;
888-
889- if (sData ->upload )
890- sData ->response .parseRespHeader (temp, " Range" );
891-
892- clear (sData );
893-
894862#if defined(ENABLE_CLOUD_STORAGE)
895863 if (sData ->upload && sData ->request .file_data .resumable .isEnabled ())
896864 {
897865 sData ->request .file_data .resumable .setHeaderState ();
898- if (sData ->response .httpCode == FIREBASE_ERROR_HTTP_CODE_PERMANENT_REDIRECT && temp. indexOf ( " bytes= " ) > - 1 )
866+ if (sData ->response .flags . uploadRange )
899867 sData ->request .file_data .resumable .updateRange ();
900868 }
901869#endif
902870
903- if (sData ->response .httpCode > 0 && sData ->response .httpCode != FIREBASE_ERROR_HTTP_CODE_NO_CONTENT)
904- sData ->response .flags .payload_remaining = true ;
905-
906- if (!sData ->sse && (sData ->response .httpCode == FIREBASE_ERROR_HTTP_CODE_OK || sData ->response .httpCode == FIREBASE_ERROR_HTTP_CODE_PERMANENT_REDIRECT || sData ->response .httpCode == FIREBASE_ERROR_HTTP_CODE_NO_CONTENT) && !sData ->response .flags .chunks && sData ->response .payloadLen == 0 )
907- sData ->response .flags .payload_remaining = false ;
908-
909871 if (sData ->request .method == reqns::http_delete && sData ->response .httpCode == FIREBASE_ERROR_HTTP_CODE_NO_CONTENT)
910872 setDebugBase (app_debug, FPSTR (" Delete operation complete" ));
911873 }
@@ -955,7 +917,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
955917 otaut.prepareDownloadOTA (sData ->response .payloadLen , sData ->request .base64 , sData ->request .ota_error );
956918 if (sData ->request .ota_error != 0 )
957919 {
958- // In case OTA error.
920+ // OTA error.
959921 setAsyncError (sData , astate_read_response, sData ->request .ota_error , !sData ->sse , false );
960922 return false ;
961923 }
@@ -967,7 +929,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
967929
968930 if (!sData ->request .openFile (file_mode_open_write))
969931 {
970- // In case file open error.
932+ // File open error.
971933 setAsyncError (sData , astate_read_response, FIREBASE_ERROR_OPEN_FILE, !sData ->sse , true );
972934 return false ;
973935 }
@@ -1013,7 +975,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
1013975 otaut.decodeBase64OTA (mem, &b64ut, reinterpret_cast <const char *>(buf), read - ofs, sData ->request .ota_error );
1014976 if (sData ->request .ota_error != 0 )
1015977 {
1016- // In case OTA error.
978+ // OTA error.
1017979 setAsyncError (sData , astate_read_response, sData ->request .ota_error , !sData ->sse , false );
1018980 goto exit;
1019981 }
@@ -1023,7 +985,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
1023985 otaut.endDownloadOTA (b64ut, sData ->request .b64Pad , sData ->request .ota_error );
1024986 if (sData ->request .ota_error != 0 )
1025987 {
1026- // In case OTA error.
988+ // OTA error.
1027989 setAsyncError (sData , astate_read_response, sData ->request .ota_error , !sData ->sse , false );
1028990 goto exit;
1029991 }
@@ -1035,7 +997,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
1035997
1036998 if (!b64ut.decodeToFile (mem, sData ->request .file_data .file , reinterpret_cast <const char *>(buf + ofs)))
1037999 {
1038- // In case file write error.
1000+ // File write error.
10391001 setAsyncError (sData , astate_read_response, FIREBASE_ERROR_FILE_WRITE, !sData ->sse , true );
10401002 goto exit;
10411003 }
@@ -1055,7 +1017,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
10551017 otaut.endDownloadOTA (b64ut, 0 , sData ->request .ota_error );
10561018 if (sData ->request .ota_error != 0 )
10571019 {
1058- // In case OTA error.
1020+ // OTA error.
10591021 setAsyncError (sData , astate_read_response, sData ->request .ota_error , !sData ->sse , false );
10601022 goto exit;
10611023 }
@@ -1067,7 +1029,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
10671029 int write = sData ->request .file_data .file .write (buf, read);
10681030 if (write < read)
10691031 {
1070- // In case file write error.
1032+ // File write error.
10711033 setAsyncError (sData , astate_read_response, FIREBASE_ERROR_FILE_WRITE, !sData ->sse , true );
10721034 goto exit;
10731035 }
@@ -1105,7 +1067,6 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
11051067
11061068 if (sData ->response .payloadLen > 0 && sData ->response .payloadRead >= sData ->response .payloadLen && sData ->response .tcpAvailable () == 0 )
11071069 {
1108-
11091070 // Async payload and header data collision workaround from session reusage.
11101071 if (!sData ->response .flags .chunks && sData ->response .payloadRead > sData ->response .payloadLen )
11111072 {
@@ -1125,7 +1086,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
11251086 if (sData ->response .flags .chunks && sData ->auth_used )
11261087 stop (sData );
11271088
1128- // In case HTTP error.
1089+ // HTTP server error.
11291090 if (sData ->response .httpCode >= FIREBASE_ERROR_HTTP_CODE_BAD_REQUEST)
11301091 {
11311092 setAsyncError (sData , sData ->state , sData ->response .httpCode , !sData ->sse , true );
@@ -1154,6 +1115,18 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
11541115 return sData ->error .code == 0 ;
11551116 }
11561117
1118+ bool sseFilter (async_data *sData )
1119+ {
1120+ String event = sData ->aResult .rtdbResult .event ();
1121+ return (sse_events_filter.length () == 0 ||
1122+ (sData ->response .flags .http_response && sse_events_filter.indexOf (" get" ) > -1 && event.indexOf (" put" ) > -1 ) ||
1123+ (!sData ->response .flags .http_response && sse_events_filter.indexOf (" put" ) > -1 && event.indexOf (" put" ) > -1 ) ||
1124+ (sse_events_filter.indexOf (" patch" ) > -1 && event.indexOf (" patch" ) > -1 ) ||
1125+ (sse_events_filter.indexOf (" keep-alive" ) > -1 && event.indexOf (" keep-alive" ) > -1 ) ||
1126+ (sse_events_filter.indexOf (" cancel" ) > -1 && event.indexOf (" cancel" ) > -1 ) ||
1127+ (sse_events_filter.indexOf (" auth_revoked" ) > -1 && event.indexOf (" auth_revoked" ) > -1 ));
1128+ }
1129+
11571130 void reserveString (async_data *sData )
11581131 {
11591132 // String memory reservation is needed to hadle large data in external memory.
@@ -1196,21 +1169,6 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
11961169 return buf;
11971170 }
11981171
1199- void clear (async_data *sData )
1200- {
1201- clear (sData ->response .val [resns::header]);
1202- if (!sData ->auth_used )
1203- clear (sData ->response .val [resns::payload]);
1204- sData ->response .flags .header_remaining = false ;
1205- sData ->response .flags .payload_remaining = false ;
1206- sData ->response .payloadRead = 0 ;
1207- sData ->response .error .resp_code = 0 ;
1208- clear (sData ->response .error .string );
1209- sData ->response .chunkInfo .chunkSize = 0 ;
1210- sData ->response .chunkInfo .dataLen = 0 ;
1211- sData ->response .chunkInfo .phase = res_handler::READ_CHUNK_SIZE;
1212- }
1213-
12141172 void reset (async_data *sData , bool disconnect)
12151173 {
12161174 if (disconnect)
@@ -1224,7 +1182,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
12241182 clear (sData ->response .val [resns::etag]);
12251183 sData ->aResult .download_data .reset ();
12261184 sData ->aResult .upload_data .reset ();
1227- clear (sData );
1185+ sData -> response . clear (! sData -> auth_used );
12281186 }
12291187
12301188 function_return_type connect (async_data *sData , const char *host, uint16_t port)
@@ -1305,11 +1263,12 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
13051263 {
13061264 if (eventResumeStatus (&sData ->aResult .rtdbResult ) == event_resume_status_undefined)
13071265 {
1308- // In case stream time out.
1309- // We have to clear app data (available), reset the last error and set the Stream time out error.
1266+ // In case Stream timed out,
1267+ // we have to clear app data (available), reset the last error and set the Stream time out error.
13101268 sData ->aResult .lastError .reset ();
13111269 clearAppData (sData ->aResult .app_data );
13121270 setEventResumeStatus (&sData ->aResult .rtdbResult , event_resume_status_resuming);
1271+ // Stream timed out error.
13131272 setAsyncError (sData , sData ->state , FIREBASE_ERROR_STREAM_TIMEOUT, false , false );
13141273 returnResult (sData , false );
13151274 reset (sData , true );
@@ -1322,7 +1281,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
13221281 {
13231282 if (sData ->request .send_timer .remaining () == 0 )
13241283 {
1325- // In case TCP write error.
1284+ // TCP write error.
13261285 setAsyncError (sData , sData ->state , FIREBASE_ERROR_TCP_SEND, !sData ->sse , false );
13271286 sData ->return_type = ret_failure;
13281287 // This requires by WiFiSSLClient before stating a new connection in case session was reused.
@@ -1336,7 +1295,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
13361295 {
13371296 if (!sData ->sse && sData ->response .read_timer .remaining () == 0 )
13381297 {
1339- // In case TCP read error.
1298+ // TCP read error.
13401299 setAsyncError (sData , sData ->state , FIREBASE_ERROR_TCP_RECEIVE_TIMEOUT, !sData ->sse , false );
13411300 sData ->return_type = ret_failure;
13421301 // This requires by WiFiSSLClient before stating a new connection in case session was reused.
@@ -1575,7 +1534,7 @@ class AsyncClientClass : public ResultBase, RTDBResultBase
15751534
15761535 if (networkConnect (sData ) == ret_failure)
15771536 {
1578- // In case TCP (network) disconnected error.
1537+ // TCP (network) disconnected error.
15791538 setAsyncError (sData , sData ->state , FIREBASE_ERROR_TCP_DISCONNECTED, !sData ->sse , false );
15801539 if (sData ->async )
15811540 {
0 commit comments