const BString& BUrl::UrlString() const { if (!fUrlStringValid) { fUrlString.Truncate(0); if (HasProtocol()) { fUrlString << fProtocol << ':'; if (HasAuthority()) fUrlString << "//"; } fUrlString << Authority(); fUrlString << Path(); if (HasRequest()) fUrlString << '?' << fRequest; if (HasFragment()) fUrlString << '#' << fFragment; fUrlStringValid = true; } return fUrlString; }
void FileUpload::Execute() { if (HasRequest() && mState != eClient_STATE_CONNECTED) // 有上传请求 && 尚未连接 { TryConnectServer(); } if (mState == eClient_STATE_CONNECTED) // 已连接上 { //if (CanSendData()) { UploadRequest* Req = PopRequest(); if (Req) { if (HandleRequest(Req)) { // Req已放入WaitingList, 暂不回收 } else { AddResponse(*Req, false, ""); delete Req; } } } if (CanRecvData() && mRecvSize < MAX_RECV_BUFF_SIZE) { int Ret = recv(mSocket, &mRecvBuff[mRecvSize], MAX_RECV_BUFF_SIZE - mRecvSize, 0); if (Ret == SOCKET_ERROR || Ret <= 0) { CloseSocket(eClient_STATE_ABORT, true); // TODO: 当服务器send主动关闭时 (应该至少还能recv一次, 没问题) } else { mRecvSize += Ret; } } } ServerResponse SrvRep; if (TryDecodeRecvBuff(SrvRep)) { auto Itr = mWaitingList.find(SrvRep.mSrvFileName); if (Itr != mWaitingList.end()) { auto Req = Itr->second; if (Req) { AddResponse(*Req, SrvRep.mFlag == 0x00A2, SrvRep.mSrvFileName); delete Req; } mWaitingList.erase(Itr); } } WaitFor(1); }