示例#1
0
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;
}
示例#2
0
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);
}