| 630 | } |
| 631 | } |
| 632 | void SendPingsIfNeeded() { |
| 633 | NHPTimer::STime tChk = PingsSendT; |
| 634 | float deltaT = (float)NHPTimer::GetTimePassed(&tChk); |
| 635 | if (deltaT < 0.5) { |
| 636 | return; |
| 637 | } |
| 638 | PingsSendT = tChk; |
| 639 | deltaT = ClampVal(deltaT, 0.0f, HTTP_TIMEOUT / 3); |
| 640 | |
| 641 | { |
| 642 | for (TOutRequestHash::iterator i = OutRequests.begin(); i != OutRequests.end();) { |
| 643 | TOutRequestHash::iterator curIt = i++; |
| 644 | TOutRequestState& s = curIt->second; |
| 645 | const TGUID& guid = curIt->first; |
| 646 | switch (s.State) { |
| 647 | case TOutRequestState::S_WAITING: |
| 648 | s.TimePassed += deltaT; |
| 649 | if (s.TimePassed > HTTP_TIMEOUT) { |
| 650 | TAutoPtr<TRopeDataPacket> ms = new TRopeDataPacket; |
| 651 | ms->Write((char)PKT_PING); |
| 652 | ms->Write(guid); |
| 653 | TTransfer trans = SendWithSystemPriority(s.Connection, ms.Release(), TTos(), DEFAULT_NETLIBA_COLOR); |
| 654 | TransferHash[trans] = TTransferPurpose(DIR_OUT, guid); |
| 655 | s.State = TOutRequestState::S_WAITING_PING_SENDING; |
| 656 | //printf("OutReq %s SendPingsIfNeeded() S_WAITING -> S_WAITING_PING_SENDING\n", GetGuidAsString(guid).c_str()); |
| 657 | s.PingTransfer = trans; |
| 658 | } |
| 659 | break; |
| 660 | case TOutRequestState::S_WAITING_PING_SENT: |
| 661 | s.TimePassed += deltaT; |
| 662 | if (s.TimePassed > HTTP_TIMEOUT * 4) { |
| 663 | //printf("OutReq %s SendPingsIfNeeded() S_WAITING_PING_SENT -> failed\n", GetGuidAsString(guid).c_str()); |
| 664 | FinishRequest(curIt, TUdpHttpResponse::FAILED, nullptr, "request failed: http timeout in state S_WAITING_PING_SENT"); |
| 665 | } |
| 666 | break; |
| 667 | default: |
| 668 | break; |
| 669 | } |
| 670 | } |
| 671 | } |
| 672 | } |
| 673 | void CleanCachesIfNeeded() { |
| 674 | NHPTimer::STime tChk = ConnectionsCacheT; |
| 675 | float deltaT = (float)NHPTimer::GetTimePassed(&tChk); |