Skip to content

Commit 388ba75

Browse files
committed
refactoring
1 parent 57dbab5 commit 388ba75

File tree

2 files changed

+102
-81
lines changed

2 files changed

+102
-81
lines changed

src/core/AsyncClient/AsyncClient.h

Lines changed: 39 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)