void UPhilipsHueBridge::HandleLightStateRequestComplete(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded)
{
	FString MessageBody = "";
	if (!HttpResponse.IsValid())
	{
		MessageBody = "{\"success\":\"Error: Unable to process HTTP Request!\"}";
	}
	else if (EHttpResponseCodes::IsOk(HttpResponse->GetResponseCode()))
	{
		MessageBody = HttpResponse->GetContentAsString();
		int32 idx = MessageBody.Find("error");
		if (idx > 0){
			//Send Error;
		}
		else
		{
			//Successfully sent!
		}

	}
	else
	{
		MessageBody = FString::Printf(TEXT("{\"success\":\"HTTP Error: %d\"}"), HttpResponse->GetResponseCode());
	}
}
Example #2
0
/**
* This is a callback function that is called when the "AttemptAuthentication" function
* has completed its request.
*
* @param Request            
* @param Response           Contains the data of the response, including the response code.
* @param bWasSuccessful     Contains true if the request was successful. Else it contains false.
*
*/
void CloudyWebAPIImpl::OnAuthResponseComplete(FHttpRequestPtr Request, 
                                              FHttpResponsePtr Response, bool bWasSuccessful)
{
    if (bWasSuccessful)
    {
        UE_LOG(CloudyWebAPILog, Warning, TEXT("Response Code = %d"), Response->GetResponseCode());

        if (!Response.IsValid())
        {
            UE_LOG(CloudyWebAPILog, Warning, TEXT("Request failed!"));
        }
        else if (EHttpResponseCodes::IsOk(Response->GetResponseCode()))
        {
            TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject());
            TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(Response->GetContentAsString());
            FJsonSerializer::Deserialize(JsonReader, JsonObject);

            Token = JsonObject->GetStringField("token");
            UE_LOG(CloudyWebAPILog, Warning, TEXT("Token = %s"), *Token);
        }
    }
    else 
    {
        UE_LOG(CloudyWebAPILog, Error, TEXT("Request failed! Is the server up?"));
    }
}
void FSimplygonRESTClient::DownloadAsset_Response(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{
	if (!Response.IsValid())
	{
		SwarmTask->SetState(SRS_FAILED);
	}
	else if (EHttpResponseCodes::IsOk(Response->GetResponseCode()))
	{
		TArray<uint8> data = Response->GetContent();
		
		if (!FFileHelper::SaveArrayToFile(data, *SwarmTask->OutputFilename))
		{
			UE_LOG(LogSimplygonRESTClient, Log, TEXT("Unable to save file %S"), *SwarmTask->OutputFilename);
			SwarmTask->SetState(SRS_FAILED);
			
		}
		else
		{
			SwarmTask->OnAssetDownloaded().ExecuteIfBound(*SwarmTask);
			SwarmTask->SetState(SRS_ASSETDOWNLOADED);
			UE_LOG(LogSimplygonRESTClient, Log, TEXT("Asset downloaded"));
		}

		
	}
	else
	{
		SwarmTask->SetState(SRS_FAILED);
		UE_LOG(LogSimplygonRESTClient, Warning, TEXT("Response: %i"), Response->GetResponseCode());
	}
}
void FHttpNetworkReplayStreamer::HttpDownloadHeaderFinished( FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded )
{
	check( HttpState == EHttptate::DownloadingHeader );
	check( StreamerState == EStreamerState::NeedToDownloadHeader );
	check( StreamArchive.IsLoading() );

	HttpState = EHttptate::Idle;

	if ( bSucceeded && HttpResponse->GetResponseCode() == EHttpResponseCodes::Ok )
	{
		HeaderArchive.Buffer.Append( HttpResponse->GetContent() );

		UE_LOG( LogHttpReplay, Log, TEXT( "FHttpNetworkReplayStreamer::HttpDownloadHeaderFinished. Size: %i" ), HeaderArchive.Buffer.Num() );

		StartStreamingDelegate.ExecuteIfBound( true, StreamArchive.IsSaving() );
		StreamerState = EStreamerState::StreamingDown;
	}
	else
	{
		// FAIL
		UE_LOG( LogHttpReplay, Error, TEXT( "FHttpNetworkReplayStreamer::HttpDownloadHeaderFinished. FAILED." ) );

		StreamArchive.Buffer.Empty();
		StartStreamingDelegate.ExecuteIfBound( false, StreamArchive.IsSaving() );

		SetLastError( ENetworkReplayError::ServiceUnavailable );
	}

	// Reset delegate
	StartStreamingDelegate = FOnStreamReadyDelegate();
}
bool FHttpRetrySystem::FManager::ShouldRetry(const FHttpRetryRequestEntry& HttpRetryRequestEntry)
{
    bool bResult = false;

	FHttpResponsePtr Response = HttpRetryRequestEntry.Request->GetResponse();
	// invalid response means connection or network error but we need to know which one
	if (!Response.IsValid())
	{
		// ONLY retry bad responses if they are connection errors (NOT protocol errors or unknown) otherwise request may be sent (and processed!) twice
		EHttpRequestStatus::Type Status = HttpRetryRequestEntry.Request->GetStatus();
		if (Status == EHttpRequestStatus::Failed_ConnectionError)
		{
			bResult = true;
		}
		else if (Status == EHttpRequestStatus::Failed)
		{
			// we will also allow retry for GET and HEAD requests even if they may duplicate on the server
			FString Verb = HttpRetryRequestEntry.Request->GetVerb();
			if (Verb == TEXT("GET") || Verb == TEXT("HEAD"))
			{
				bResult = true;
			}
		}
	}
	else
	{
		// this may be a successful response with one of the explicitly listed response codes we want to retry on
		if (HttpRetryRequestEntry.Request->RetryResponseCodes.Contains(Response->GetResponseCode()))
		{
			bResult = true;
		}
	}

    return bResult;
}
void UPhilipsHueBridge::HandleUserIDTestRequestComplete(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded)
{
	FString MessageBody = "";
	// If HTTP fails client-side, this will still be called but with a NULL shared pointer!
	if (!HttpResponse.IsValid())
	{
		MessageBody = "{\"success\":\"Error: Unable to process HTTP Request!\"}";
	}
	else if (EHttpResponseCodes::IsOk(HttpResponse->GetResponseCode()))
	{
		MessageBody = HttpResponse->GetContentAsString();
		int32 idx = MessageBody.Find("unauthorized user");
		if (idx > 0){
			//Remind push linking
			OnPushLinkRequested.Broadcast(Id);
			//AquireUserID(false);
		}
		else
		{
			Connected = true;
			// Successfully tested the user id
			OnHueUserAuthorized.Broadcast(ConnectedUser);
			
		}

	}
	else
	{
		MessageBody = FString::Printf(TEXT("{\"success\":\"HTTP Error: %d\"}"), HttpResponse->GetResponseCode());
	}

}
void UHeliosGetterProxy_Float::OnHeliosRequestComplete(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded) {
	if (!bSucceeded) {
		UE_LOG(LogTemp, Error, TEXT("Helios > request failed: %s"), *HttpRequest->GetURL());
		OnFail.Broadcast(0);
		return;
	}
	if (!HttpResponse.IsValid()) {
		UE_LOG(LogTemp, Warning, TEXT("Helios > invalid response for request: %s"), *HttpRequest->GetURL());
		OnFail.Broadcast(0);
		return;
	}

	FString ContentAsString = HttpResponse->GetContentAsString();
	json Content = json::parse(TCHAR_TO_UTF8(*ContentAsString));
	if (Content.size() != 1) {
		UE_LOG(LogTemp, Warning, TEXT("Helios > invalid json returned"));
		OnFail.Broadcast(0);
		return;
	}
	if (!Content["value"].is_number_float()) {
		UE_LOG(LogTemp, Warning, TEXT("Helios > invalid type returned"));
		OnFail.Broadcast(0);
		return;
	}
	float Result = Content["value"];
	OnSuccess.Broadcast(Result);
}
void FSimplygonRESTClient::UploadAsset_Response(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{
	if (!Response.IsValid())
	{
		SwarmTask->SetState(SRS_FAILED);
	}
	else if (EHttpResponseCodes::IsOk(Response->GetResponseCode()))
	{
	
		FString msg = Response->GetContentAsString();
		UE_LOG(LogSimplygonRESTClient, Log, TEXT("Upload asset response: %s"), *msg);

		TSharedPtr<FJsonObject> JsonParsed;
		TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(msg);
		if (FJsonSerializer::Deserialize(JsonReader, JsonParsed))
		{
			SwarmTask->InputAssetId = JsonParsed->GetStringField("AssetId");
			UE_LOG(LogSimplygonRESTClient, Log, TEXT("AssetId: %s"), *SwarmTask->InputAssetId);
		}
		
		SwarmTask->SetState(SRS_ASSETUPLOADED);
	}
	else
	{
		SwarmTask->SetState(SRS_FAILED);
		UE_LOG(LogSimplygonRESTClient, Warning, TEXT("Response: %i"), Response->GetResponseCode());
	}
}
Example #9
0
void FHttpServiceTracker::EndpointMetrics::TrackRequest(const FHttpRequestPtr& HttpRequest)
{
	// keep a histogram of response codes
	const FHttpResponsePtr HttpResponse = HttpRequest->GetResponse();

	const int32 ResponseCode = HttpResponse.IsValid() ? HttpResponse->GetResponseCode() : 0;
	// track all responses in a histogram
	ResponseCodes.FindOrAdd(ResponseCode)++;
	const float ElapsedTime = HttpRequest->GetElapsedTime();
	const int64 DownloadBytes = HttpRequest->GetResponse()->GetContent().Num();
	// track successes/fails separately
	if (IsSuccessfulResponse(ResponseCode))
	{
		++SuccessCount;
		// sum elapsed time for average calc
		ElapsedTimeSuccessTotal += ElapsedTime;
		ElapsedTimeSuccessMax = FMath::Max(ElapsedTimeSuccessMax, ElapsedTime);
		ElapsedTimeSuccessMin = FMath::Min(ElapsedTimeSuccessMin, ElapsedTime);
		// sum download rate for average calc
		DownloadBytesSuccessTotal += DownloadBytes;
	}
	else
	{
		++FailCount;
		// sum elapsed time for average calc
		ElapsedTimeFailTotal += ElapsedTime;
		ElapsedTimeFailMax = FMath::Max(ElapsedTimeFailMax, ElapsedTime);
		ElapsedTimeFailMin = FMath::Min(ElapsedTimeFailMin, ElapsedTime);
		// sum download rate for average calc
		DownloadBytesFailTotal += DownloadBytes;
	}
}
void UPhilipsHueBridge::HandleUserIDRequestComplete(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded)
{
	FString MessageBody = "";
	FString userid = "";
	// If HTTP fails client-side, this will still be called but with a NULL shared pointer!
	if (!HttpResponse.IsValid())
	{
		MessageBody = "{\"success\":\"Error: Unable to process HTTP Request!\"}";
	}
	else if (EHttpResponseCodes::IsOk(HttpResponse->GetResponseCode()))
	{
		

		MessageBody = HttpResponse->GetContentAsString();

		TSharedRef< TJsonReader<> > JsonReader = TJsonReaderFactory<>::Create(*MessageBody);
		int32 idx = MessageBody.Find("\"username\"");
		if (idx > 0){
			userid = MessageBody.Trim();
			userid.RemoveFromStart("[{\"success\":{\"username\":\"");
			userid.RemoveFromEnd("\"}}]");
			ConnectedUser = userid;
			SaveUserIDToFile();
			OnHueUserAuthorized.Broadcast(userid);
		}
		else
		{
			OnPushLinkRequested.Broadcast(Id);
		}
	}
	else
	{
		MessageBody = FString::Printf(TEXT("{\"success\":\"HTTP Error: %d\"}"), HttpResponse->GetResponseCode());
	}
}
static PyObject *py_ue_ihttp_request_get_response(ue_PyIHttpRequest *self, PyObject * args)
{
	FHttpResponsePtr response = self->http_request->GetResponse();
	if (!response.IsValid())
	{
		return PyErr_Format(PyExc_Exception, "unable to retrieve IHttpResponse");
	}
	return py_ue_new_ihttp_response(response.Get());
}
Example #12
0
bool FHttpRetrySystem::FManager::ShouldRetry(const FHttpRetryRequestEntry& HttpRetryRequestEntry)
{
    bool bResult = false;

    FHttpResponsePtr Response = HttpRetryRequestEntry.HttpRequest->GetResponse();
    if (!Response.IsValid() || Response->GetResponseCode() == 0)
    {
        bResult = true;
    }

    return bResult;
}
bool PlayFabRequestHandler::DecodeRequest(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded, PlayFab::FPlayFabBaseModel& OutResult, PlayFab::FPlayFabError& OutError)
{
    PlayFabRequestHandler::pendingCalls -= 1;

    FString ResponseStr, ErrorStr;
    if (bSucceeded && HttpResponse.IsValid())
    {
        if (EHttpResponseCodes::IsOk(HttpResponse->GetResponseCode()))
        {
            // Create the Json parser
            ResponseStr = HttpResponse->GetContentAsString();
            TSharedPtr<FJsonObject> JsonObject;
            TSharedRef<TJsonReader<> > JsonReader = TJsonReaderFactory<>::Create(ResponseStr);

            if (FJsonSerializer::Deserialize(JsonReader, JsonObject) && JsonObject.IsValid())
            {
                if (PlayFabRequestHandler::DecodeError(JsonObject, OutError))
                {
                    return false;
                }

                const TSharedPtr<FJsonObject>* DataJsonObject;
                if (JsonObject->TryGetObjectField(TEXT("data"), DataJsonObject))
                {
                    return OutResult.readFromValue(*DataJsonObject);
                }
            }
        }
        else
        {
            // Create the Json parser
            ResponseStr = HttpResponse->GetContentAsString();
            TSharedPtr<FJsonObject> JsonObject;
            TSharedRef<TJsonReader<> > JsonReader = TJsonReaderFactory<>::Create(ResponseStr);

            if (FJsonSerializer::Deserialize(JsonReader, JsonObject) && JsonObject.IsValid())
            {
                if (PlayFabRequestHandler::DecodeError(JsonObject, OutError))
                {
                    return false;
                }
            }
        }
    }

    // If we get here, we failed to connect meaningfully to the server - Assume a timeout
    OutError.HttpCode = 408;
    OutError.ErrorCode = PlayFabErrorConnectionTimeout;
    // For text returns, use the non-json response if possible, else default to no response
    OutError.ErrorName = OutError.ErrorMessage = OutError.HttpStatus = TEXT("Request Timeout or null response");

    return false;
}
void FHttpNetworkReplayStreamer::HttpStartDownloadingFinished( FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded )
{
	check( HttpState == EHttptate::StartDownloading );
	check( StreamerState == EStreamerState::NeedToDownloadHeader );

	HttpState = EHttptate::Idle;

	if ( bSucceeded && HttpResponse->GetResponseCode() == EHttpResponseCodes::Ok )
	{
		FString NumChunksString = HttpResponse->GetHeader( TEXT( "NumChunks" ) );
		FString DemoTimeString = HttpResponse->GetHeader( TEXT( "Time" ) );
		FString State = HttpResponse->GetHeader( TEXT( "State" ) );

		ViewerName = HttpResponse->GetHeader( TEXT( "Viewer" ) );

		bStreamIsLive = State == TEXT( "Live" );

		NumDownloadChunks = FCString::Atoi( *NumChunksString );
		DemoTimeInMS = FCString::Atoi( *DemoTimeString );

		UE_LOG( LogHttpReplay, Log, TEXT( "FHttpNetworkReplayStreamer::HttpStartDownloadingFinished. Viewer: %s, State: %s, NumChunks: %i, DemoTime: %2.2f" ), *ViewerName, *State, NumDownloadChunks, (float)DemoTimeInMS / 1000 );

		// First, download the header
		if ( NumDownloadChunks > 0 )
		{			
			StreamerState = EStreamerState::NeedToDownloadHeader;
		}
		else
		{
			UE_LOG( LogHttpReplay, Warning, TEXT( "FHttpNetworkReplayStreamer::HttpStartDownloadingFinished. NO CHUNKS" ) );

			StartStreamingDelegate.ExecuteIfBound( false, StreamArchive.IsSaving() );

			// Reset delegate
			StartStreamingDelegate = FOnStreamReadyDelegate();

			SetLastError( ENetworkReplayError::ServiceUnavailable );
		}
	}
	else
	{
		UE_LOG( LogHttpReplay, Error, TEXT( "FHttpNetworkReplayStreamer::HttpStartDownloadingFinished. FAILED" ) );

		StartStreamingDelegate.ExecuteIfBound( false, StreamArchive.IsSaving() );

		// Reset delegate
		StartStreamingDelegate = FOnStreamReadyDelegate();

		SetLastError( ENetworkReplayError::ServiceUnavailable );
	}
}
Example #15
0
bool FHttpRetrySystem::FManager::ShouldRetry(const FHttpRetryRequestEntry& HttpRetryRequestEntry)
{
    bool bResult = false;

    FHttpResponsePtr Response = HttpRetryRequestEntry.HttpRequest->GetResponse();
    if (!Response.IsValid() || 
		Response->GetResponseCode() == 0 || 
		HttpRetryRequestEntry.HttpRequest->RetryResponseCodesOverride.Contains(Response->GetResponseCode()) ||
		RetryResponseCodesDefault.Contains(Response->GetResponseCode()))
    {
        bResult = true;
    }

    return bResult;
}
Example #16
0
void UBPDownloader::HandleHeaderReceived(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded)
{
	if (bSucceeded && HttpResponse.IsValid())
	{
		FString FileLength = HttpResponse->GetHeader(L"Content-Length");// ();
		FileTotalBytes = (float)UKismetStringLibrary::Conv_StringToInt(FileLength);
		//Start Downloading
		StartDownload();
	}
	else
	{
		RemoveFromRoot();
		OnFail.Broadcast(0.f);//FilePath
	}
}
void FHttpNetworkReplayStreamer::HttpStopUploadingFinished( FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded )
{
	check( HttpState == EHttptate::StopUploading );
	check( StreamerState == EStreamerState::StreamingUpFinal );

	HttpState = EHttptate::Idle;
	StreamerState = EStreamerState::Idle;

	if ( bSucceeded && HttpResponse->GetResponseCode() == EHttpResponseCodes::Ok )
	{
		UE_LOG( LogHttpReplay, Log, TEXT( "FHttpNetworkReplayStreamer::HttpStopUploadingFinished. SessionName: %s" ), *SessionName );
	}
	else
	{
		UE_LOG( LogHttpReplay, Error, TEXT( "FHttpNetworkReplayStreamer::HttpStopUploadingFinished. FAILED" ) );
		SetLastError( ENetworkReplayError::ServiceUnavailable );
	}

	StreamArchive.ArIsLoading = false;
	StreamArchive.ArIsSaving = false;
	StreamArchive.Buffer.Empty();
	StreamArchive.Pos = 0;
	StreamFileCount = 0;
	bStopStreamingCalled = false;
	SessionName.Empty();
}
void FSimplygonRESTClient::ProcessJob_Response(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{
	if (!Response.IsValid())
	{
		SwarmTask->SetState(SRS_FAILED);
	}
	else if (EHttpResponseCodes::IsOk(Response->GetResponseCode()))
	{
		SwarmTask->SetState(SRS_JOBPROCESSING);
	}
	else
	{
		SwarmTask->SetState(SRS_FAILED);
		UE_LOG(LogSimplygonRESTClient, Warning, TEXT("Process job response: %i"), Response->GetResponseCode());
	}
}
void FHttpNetworkReplayStreamer::HttpUploadFinished( FHttpRequestPtr , FHttpResponsePtr HttpResponse, bool bSucceeded )
{
	check( HttpState == EHttptate::UploadingStream );
	check( StreamerState == EStreamerState::StreamingUp || StreamerState == EStreamerState::StreamingUpFinal );

	HttpState = EHttptate::Idle;

	if ( bSucceeded && HttpResponse->GetResponseCode() == EHttpResponseCodes::Ok )
	{
		UE_LOG( LogHttpReplay, Verbose, TEXT( "FHttpNetworkReplayStreamer::HttpUploadFinished." ) );

		if ( StreamerState == EStreamerState::StreamingUpFinal )
		{
			// Create the Http request and add to pending request list
			TSharedRef<class IHttpRequest> HttpRequest = FHttpModule::Get().CreateRequest();

			HttpRequest->OnProcessRequestComplete().BindRaw( this, &FHttpNetworkReplayStreamer::HttpStopUploadingFinished );

			HttpState = EHttptate::StopUploading;

			HttpRequest->SetURL( FString::Printf( TEXT( "%sstopuploading?Version=%s&Session=%s&NumChunks=%i&Time=%i" ), *ServerURL, *SessionVersion, *SessionName, StreamFileCount, DemoTimeInMS ) );
			HttpRequest->SetVerb( TEXT( "POST" ) );
			HttpRequest->SetHeader( TEXT( "Content-Type" ), TEXT( "application/octet-stream" ) );

			HttpRequest->ProcessRequest();
		}
	}
	else
	{
		UE_LOG( LogHttpReplay, Error, TEXT( "FHttpNetworkReplayStreamer::HttpUploadFinished. FAILED" ) );
		SetLastError( ENetworkReplayError::ServiceUnavailable );
	}
}
Example #20
0
int HttpRpcRequest::ParseRequestIdFromResponse(FHttpResponsePtr response) {
	FString requestIdString = response->GetHeader("X-Request-ID");
	if (requestIdString == "") {
		return -1;
	}
	return FCString::Atoi(*requestIdString);
}
void FSimplygonRESTClient::AccountInfo_Response(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{
	if (!Response.IsValid())
	{
		SwarmTask->SetState(SRS_FAILED);
	}
	else if (EHttpResponseCodes::IsOk(Response->GetResponseCode()))
	{
		FString msg = Response->GetContentAsString();
		UE_LOG(LogSimplygonRESTClient, Log, TEXT("Account info response: %s"), *msg);
	}
	else
	{
		SwarmTask->SetState(SRS_FAILED);
		UE_LOG(LogSimplygonRESTClient, Warning, TEXT("Account info response: %i"), Response->GetResponseCode());
	}
}
void FSimplygonRESTClient::UploadJobSettings_Response(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{
	if (!Response.IsValid())
	{
		SwarmTask->SetState(SRS_FAILED);
	}
	else if (EHttpResponseCodes::IsOk(Response->GetResponseCode()))
	{
		SwarmTask->SetState(SRS_JOBSETTINGSUPLOADED);
		SwarmTask->OnAssetUploaded().ExecuteIfBound(*SwarmTask);
	}
	else
	{
		SwarmTask->SetState(SRS_FAILED);
		UE_LOG(LogSimplygonRESTClient, Warning, TEXT("Upload job settings response: %i"), Response->GetResponseCode());
	}
}
Example #23
0
bool HttpRpcRequest::ParseMessageFromResponse(FHttpResponsePtr response) {
	const FString contentType = response->GetContentType();

	if (contentType.StartsWith(kContentTypeJson)) {

	} else if (contentType.StartsWith(kContentTypeASCII)) {
		if (!google::protobuf::TextFormat::ParseFromString(TCHAR_TO_UTF8(*response->GetContentAsString()), callState_.GetResponse())) {
			UE_LOG(HttpRpcRequestLog, Error, TEXT("ASCII response parse failed"));
			return false;
		}
		return true;
	} else if (contentType.StartsWith(kContentTypeBinary)) {

	} else {
		UE_LOG(HttpRpcRequestLog, Error, TEXT("Invalid content type '%s'"), *contentType);
	}
	return false;
}
Example #24
0
bool FCrashUpload::ParseServerResponse(FHttpResponsePtr Response)
{
	// Turn the snippet into a complete XML document, to keep the XML parser happy
	FXmlFile ParsedResponse(FString(TEXT("<Root>")) + Response->GetContentAsString() + TEXT("</Root>"), EConstructMethod::ConstructFromBuffer);
	UE_LOG(CrashReportClientLog, Log, TEXT("Response->GetContentAsString(): '%s'"), *Response->GetContentAsString());	
	if (!ParsedResponse.IsValid())
	{
		UE_LOG(CrashReportClientLog, Log, TEXT("Invalid response!"));	
		return false;
	}
	if (auto ResultNode = ParsedResponse.GetRootNode()->FindChildNode(TEXT("CrashReporterResult")))
	{
		UE_LOG(CrashReportClientLog, Log, TEXT("ResultNode->GetAttribute(TEXT(\"bSuccess\")) = %s"), *ResultNode->GetAttribute(TEXT("bSuccess")));	
		return ResultNode->GetAttribute(TEXT("bSuccess")) == TEXT("true");
	}
	UE_LOG(CrashReportClientLog, Log, TEXT("Could not find CrashReporterResult"));	
	return false;
}
void FHttpServiceTracker::EndpointMetrics::TrackRequest(const FHttpRequestPtr& HttpRequest)
{
	if(HttpRequest.IsValid())
	{
		// keep a histogram of response codes
		const FHttpResponsePtr HttpResponse = HttpRequest->GetResponse();

		const int32 ResponseCode = HttpResponse.IsValid() ? HttpResponse->GetResponseCode() : 0;
		// track all responses in a histogram
		ResponseCodes.FindOrAdd(ResponseCode)++;
		const float ElapsedTime = HttpRequest->GetElapsedTime();
		const int64 DownloadBytes = HttpResponse.IsValid() ? HttpResponse->GetContent().Num() : 0;
		// track successes/fails separately
		if (IsSuccessfulResponse(ResponseCode))
		{
			++SuccessCount;
			// sum elapsed time for average calc
			ElapsedTimeSuccessTotal += ElapsedTime;
			ElapsedTimeSuccessMax = FMath::Max(ElapsedTimeSuccessMax, ElapsedTime);
			ElapsedTimeSuccessMin = FMath::Min(ElapsedTimeSuccessMin, ElapsedTime);
			// sum download rate for average calc
			DownloadBytesSuccessTotal += DownloadBytes;
		}
		else
		{
			++FailCount;
			// sum elapsed time for average calc
			ElapsedTimeFailTotal += ElapsedTime;
			ElapsedTimeFailMax = FMath::Max(ElapsedTimeFailMax, ElapsedTime);
			ElapsedTimeFailMin = FMath::Min(ElapsedTimeFailMin, ElapsedTime);
			// sum download rate for average calc
			DownloadBytesFailTotal += DownloadBytes;
		}

		FString AnalyticsName = GetAnalyticsName(HttpRequest->GetURL());
		if (LastAnalyticsName.Len() > 0 && AnalyticsName != LastAnalyticsName)
		{
			UE_LOG(LogAnalytics, Warning, TEXT("Endpoint analytics name has changed from '%s' to '%s', aggregated stats will be incorrect"),
				*LastAnalyticsName, *AnalyticsName);
		}

		LastAnalyticsName = AnalyticsName;
	}
}
Example #26
0
void AVictoryPC::HTTPOnResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{
	FString ResponseStr = "AVictoryPC::HTTPOnResponseReceived>>> Connection Error";
	if(bWasSuccessful) 
	{
		ResponseStr = Response->GetContentAsString();
	} 
	 
	this->VictoryPC_GetMyIP_DataReceived(ResponseStr);
}
void FHttpNetworkReplayStreamer::HttpStartUploadingFinished( FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded )
{
	check( HttpState == EHttptate::StartUploading );
	check( StreamerState == EStreamerState::NeedToUploadHeader );

	HttpState = EHttptate::Idle;

	if ( bSucceeded && HttpResponse->GetResponseCode() == EHttpResponseCodes::Ok )
	{
		SessionName = HttpResponse->GetHeader( TEXT( "Session" ) );

		UE_LOG( LogHttpReplay, Log, TEXT( "FHttpNetworkReplayStreamer::HttpStartUploadingFinished. SessionName: %s" ), *SessionName );
	}
	else
	{
		UE_LOG( LogHttpReplay, Error, TEXT( "FHttpNetworkReplayStreamer::HttpStartUploadingFinished. FAILED" ) );
		SetLastError( ENetworkReplayError::ServiceUnavailable );
	}
}
void FAnalyticsProviderET::EventRequestComplete(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded)
{
	if (bSucceeded && HttpResponse.IsValid())
	{
		UE_LOG(LogAnalytics, VeryVerbose, TEXT("[%s] ET response for [%s]. Code: %d. Payload: %s"), *APIKey, *HttpRequest->GetURL(), HttpResponse->GetResponseCode(), *HttpResponse->GetContentAsString());
	}
	else
	{
		UE_LOG(LogAnalytics, VeryVerbose, TEXT("[%s] ET response for [%s]. No response"), *APIKey, *HttpRequest->GetURL());
	}
}
void UMasterServerFunctions::OnResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{
	FString MessageBody = "";

	if (!Response.IsValid()) { CurrentRequest.ResponseType = EHttpResponse::HR_NoData; Closed(MessageBody); return; }
	if (EHttpResponseCodes::IsOk(Response->GetResponseCode()))
	{
		if (Response->GetContentType().Equals("application/json"))
		{
			MessageBody = DecompressBytes(Response->GetContent());
			ProcessJSON(MessageBody);
		}
	}
	else
	{
		MessageBody = FString::Printf(TEXT("{\"success\":\"HTTP Error: %d\"}"), Response->GetResponseCode());
	}

	Closed(MessageBody);
}
Example #30
0
void HttpRpcRequest::onHttpRequestCompleted(FHttpRequestPtr request, FHttpResponsePtr response, bool bWasSuccessful) {
	if (!bWasSuccessful) {
		UE_LOG(HttpRpcRequestLog, Error, TEXT("HTTP request failed"));
		callState_.GetController()->SetFailed("HTTP request failed");
	} else {
		const int responseCode = response->GetResponseCode();
		if (responseCode != 200) {
			if ((responseCode >= 300) && (responseCode < 400)) {
				// TODO(san): Handle redirects.
				callState_.GetController()->SetFailed("Unsupported redirect");
			} else {
				UE_LOG(HttpRpcRequestLog, Error, TEXT("HTTP response code %d (%s)"), response->GetResponseCode(), *response->GetContentAsString());
				callState_.GetController()->SetFailed("Bad HTTP response code");
			}
		} else {
			// Successful HTTP response.
			int requestId = ParseRequestIdFromResponse(response);
			if (requestId == -1) {
				UE_LOG(HttpRpcRequestLog, Error, TEXT("HTTP response missing request id"));
				callState_.GetController()->SetFailed("Response missing request id");
				// TODO(san): Think about whether we should be strict about this given we have the request handy.
			} else if (requestId != FCString::Atoi(*request->GetHeader("X-Request-ID"))) {
				// If this happens legitimately then we are most likely inheriting a 'threading issue' from the
				// HTTP module - in which case we'll probably need to track outstanding requests ourselves.
				UE_LOG(HttpRpcRequestLog, Error, TEXT("Mismatched Request/Response!"));
				callState_.GetController()->SetFailed("Mismatched Request/Response ID");
			} else {
				// Request ID is valid. Extract the protobuf from the HTTP content buffer.
				if (!ParseMessageFromResponse(response)) {
					UE_LOG(HttpRpcRequestLog, Warning, TEXT("Failed to parse response protobuf"));
					callState_.GetController()->SetFailed("Failed to parse response protobuf");
				}
			}
		}
	}

	Closure* cachedClosure = callState_.GetDone();
	delete this;
	cachedClosure->Run();
}