@@ -279,25 +279,20 @@ td::Status HttpPayload::parse(td::ChainBufferReader &input) {
279279 } break ;
280280 case ParseState::reading_chunk_data: {
281281 if (cur_chunk_size_ == 0 ) {
282- switch (type_) {
283- case PayloadType::pt_empty:
284- UNREACHABLE ();
285- case PayloadType::pt_eof:
286- case PayloadType::pt_tunnel:
287- cur_chunk_size_ = 1LL << 60 ;
288- break ;
289- case PayloadType::pt_chunked:
290- state_ = ParseState::reading_crlf;
291- break ;
292- case PayloadType::pt_content_length: {
293- LOG (INFO) << " payload parse success" ;
294- const std::lock_guard<std::mutex> lock{mutex_};
295- state_ = ParseState::completed;
296- run_callbacks ();
297- return td::Status::OK ();
298- } break ;
282+ if (type_ == PayloadType::pt_eof || type_ == PayloadType::pt_tunnel) {
283+ cur_chunk_size_ = 1LL << 60 ;
284+ } else if (type_ == PayloadType::pt_chunked) {
285+ state_ = ParseState::reading_crlf;
286+ break ;
287+ } else if (type_ == PayloadType::pt_content_length) {
288+ LOG (INFO) << " payload parse success" ;
289+ const std::lock_guard<std::mutex> lock{mutex_};
290+ state_ = ParseState::completed;
291+ run_callbacks ();
292+ return td::Status::OK ();
293+ } else {
294+ UNREACHABLE ();
299295 }
300- break ;
301296 }
302297 if (input.size () == 0 ) {
303298 return td::Status::OK ();
@@ -502,7 +497,7 @@ bool HttpPayload::store_http(td::ChainBufferWriter &output, size_t max_size, Htt
502497 char buf[64 ];
503498 ::sprintf (buf, " %lx\r\n " , s.size());
504499 auto slice = td::Slice (buf, strlen (buf));
505- wrote |= !slice. empty () ;
500+ wrote = true ;
506501 output.append (slice);
507502 }
508503
@@ -514,7 +509,8 @@ bool HttpPayload::store_http(td::ChainBufferWriter &output, size_t max_size, Htt
514509 wrote = true ;
515510 }
516511 }
517- if (chunks_.size () != 0 || !parse_completed ()) {
512+ auto cur_state = state_.load (std::memory_order_consume);
513+ if (chunks_.size () != 0 || (cur_state != ParseState::reading_trailer && cur_state != ParseState::completed)) {
518514 return wrote;
519515 }
520516 if (!written_zero_chunk_) {
@@ -531,7 +527,7 @@ bool HttpPayload::store_http(td::ChainBufferWriter &output, size_t max_size, Htt
531527 }
532528
533529 while (max_size > 0 ) {
534- auto cur_state = state_.load (std::memory_order_consume);
530+ cur_state = state_.load (std::memory_order_consume);
535531 HttpHeader h = get_header ();
536532 if (h.empty ()) {
537533 if (cur_state != ParseState::completed) {
@@ -587,7 +583,8 @@ tl_object_ptr<ton_api::http_payloadPart> HttpPayload::store_tl(size_t max_size)
587583 max_size -= s.size ();
588584 }
589585 obj->data_ .truncate (obj->data_ .size () - S.size ());
590- if (chunks_.size () != 0 ) {
586+ auto cur_state = state_.load (std::memory_order_consume);
587+ if (chunks_.size () != 0 || (cur_state != ParseState::reading_trailer && cur_state != ParseState::completed)) {
591588 return obj;
592589 }
593590 if (!written_zero_chunk_) {
@@ -597,7 +594,7 @@ tl_object_ptr<ton_api::http_payloadPart> HttpPayload::store_tl(size_t max_size)
597594 LOG (INFO) << " data completed" ;
598595
599596 while (max_size > 0 ) {
600- auto cur_state = state_.load (std::memory_order_consume);
597+ cur_state = state_.load (std::memory_order_consume);
601598 HttpHeader h = get_header ();
602599 if (h.empty ()) {
603600 if (cur_state != ParseState::completed) {
@@ -869,7 +866,7 @@ td::Status HttpHeader::basic_check() {
869866 }
870867 for (auto &c : value) {
871868 if (c == ' \r ' || c == ' \n ' ) {
872- return td::Status::Error (" bad character in header name " );
869+ return td::Status::Error (" bad character in header value " );
873870 }
874871 }
875872 return td::Status::OK ();
0 commit comments