HttpActivityTimeout

HttpActivityTimeout

#Overview

name: HttpActivityTimeout

The value of this variable can be defined or overridden in .ini config files. 1 .ini config file referencing this setting variable.

It is referenced in 17 C++ source files.

#Summary

#Usage in the C++ source code

The purpose of HttpActivityTimeout is to set a timeout duration for checking ongoing activity on an established HTTP connection. It is primarily used in the HTTP networking system of Unreal Engine 5.

This setting variable is relied upon by the HTTP module of Unreal Engine, which is part of the Online subsystem. It’s used in various parts of the HTTP request handling process, including request creation, configuration, and timeout management.

The value of this variable is typically set in the engine configuration files (GEngineIni) under the [HTTP] section. It can also be set programmatically through the FHttpModule class.

HttpActivityTimeout interacts with other HTTP-related variables such as HttpTotalTimeout, HttpConnectionTimeout, HttpReceiveTimeout, and HttpSendTimeout. These variables collectively control different aspects of HTTP request timing and behavior.

Developers must be aware that:

  1. This timeout is applied per request, not for the entire HTTP session.
  2. It’s used to detect inactivity on an established connection, which is different from the connection timeout or total request timeout.
  3. The value is in seconds and should be set to a reasonable duration based on the expected response times of the server and network conditions.

Best practices when using this variable include:

  1. Set it to a value that allows enough time for typical server responses but isn’t so long that it unnecessarily delays error detection.
  2. Consider the nature of your HTTP requests when setting this value. Long-running or streaming requests may need a longer activity timeout.
  3. Use in conjunction with other timeout settings for comprehensive request management.
  4. Monitor and adjust based on real-world performance and error rates.
  5. Be cautious when modifying this value during runtime, as it could affect ongoing requests.

#Setting Variables

#References In INI files

Location: <Workspace>/Engine/Config/BaseEngine.ini:32, section: [HTTP]

#References in C++ code

#Callsites

This variable is referenced in the following C++ source code:

#Loc: <Workspace>/Engine/Source/Programs/WebTests/Private/TestHttp.cpp:44

Scope (from outer to inner):

file
class        class FMockHttpModule : public FHttpModule

Source code excerpt:

	using FHttpModule::HttpConnectionTimeout;
	using FHttpModule::HttpTotalTimeout;
	using FHttpModule::HttpActivityTimeout;
};

class FHttpTestLogLevelInitializer
{
public:
	FHttpTestLogLevelInitializer()

#Loc: <Workspace>/Engine/Source/Programs/WebTests/Private/TestHttp.cpp:244

Scope: file

Source code excerpt:

	UNSCOPED_INFO(NumRequests);
	HttpModule->HttpTotalTimeout = 2.0f;
	HttpModule->HttpActivityTimeout = 1.0f;

	DYNAMIC_SECTION(" making " << NumRequests << " requests")
	{
		DisableWarningsInThisTest();

		uint32 ChunkSize = 1024 * 1024;

#Loc: <Workspace>/Engine/Source/Programs/WebTests/Private/TestHttp.cpp:438

Scope: file

Source code excerpt:

	DisableWarningsInThisTest();

	HttpModule->HttpActivityTimeout = 3.0f; // Make sure this won't be triggered before establishing connection
	HttpModule->HttpConnectionTimeout = 15.0f;

	TSharedRef<IHttpRequest> HttpRequest = CreateRequest();

	HttpRequest->SetURL(UrlWithInvalidPortToTestConnectTimeout());
	HttpRequest->SetVerb(TEXT("GET"));

#Loc: <Workspace>/Engine/Source/Programs/WebTests/Private/TestHttp.cpp:895

Scope: file

Source code excerpt:


	float ActivityTimeoutSetting = 3.0f;
	HttpModule->HttpActivityTimeout = ActivityTimeoutSetting;

	TSharedPtr<IHttpRequest> HttpRequest = CreateRequest();

	SECTION("By default activity timeout from http module")
	{
	}

#Loc: <Workspace>/Engine/Source/Programs/WebTests/Private/TestHttp.cpp:935

Scope: file

Source code excerpt:

TEST_CASE_METHOD(FWaitUntilCompleteHttpFixture, "Http request won't trigger activity timeout after cancelling", HTTP_TAG)
{
	HttpModule->HttpActivityTimeout = 2.0f;

	TSharedPtr<IHttpRequest> HttpRequest = CreateRequest();
	HttpRequest->SetURL(UrlStreamDownload(3/*Chunks*/, HTTP_TEST_TIMEOUT_CHUNK_SIZE, 5/*ChunkLatency*/));
	HttpRequest->SetVerb(TEXT("GET"));
	HttpRequest->SetDelegateThreadPolicy(EHttpRequestDelegateThreadPolicy::CompleteOnHttpThread);

#Loc: <Workspace>/Engine/Source/Programs/WebTests/Private/TestHttp.cpp:961

Scope: file

Source code excerpt:

	DisableWarningsInThisTest();

	HttpModule->HttpActivityTimeout = 2.0f;
	HttpModule->HttpTotalTimeout = 3.5f;

	TSharedPtr<IHttpRequest> HttpRequest = CreateRequest();
	HttpRequest->SetURL(UrlStreamDownload(5/*Chunks*/, HTTP_TEST_TIMEOUT_CHUNK_SIZE, 1/*ChunkLatency*/));
	HttpRequest->SetVerb(TEXT("GET"));
	HttpRequest->SetDelegateThreadPolicy(EHttpRequestDelegateThreadPolicy::CompleteOnHttpThread);

#Loc: <Workspace>/Engine/Source/Programs/WebTests/Private/TestHttp.cpp:982

Scope: file

Source code excerpt:

TEST_CASE_METHOD(FWaitUntilCompleteHttpFixture, "Http request receive won't timeout for streaming request", HTTP_TAG)
{
	HttpModule->HttpActivityTimeout = 3.0f;

	TSharedPtr<IHttpRequest> HttpRequest = CreateRequest();
	HttpRequest->SetURL(UrlStreamDownload(3/*Chunks*/, HTTP_TEST_TIMEOUT_CHUNK_SIZE, 2/*ChunkLatency*/)); // Needs 6s to complete
	HttpRequest->SetVerb(TEXT("GET"));

	const double StartTime = FPlatformTime::Seconds();

#Loc: <Workspace>/Engine/Source/Programs/WebTests/Private/TestHttp.cpp:994

Scope (from outer to inner):

file
lambda-function

Source code excerpt:

		CHECK(HttpResponse->GetResponseCode() == 200);
		const double DurationInSeconds = FPlatformTime::Seconds() - StartTime;
		CHECK(DurationInSeconds > HttpModule->HttpActivityTimeout);
	});
	HttpRequest->ProcessRequest();
}

TEST_CASE_METHOD(FWaitUntilCompleteHttpFixture, "Http request total timeout with get", HTTP_TAG)
{

#Loc: <Workspace>/Engine/Source/Programs/WebTests/Private/TestHttp.cpp:1028

Scope: file

Source code excerpt:


	float TimeoutSetting = 3.0f;
	HttpModule->HttpActivityTimeout = 2.5f; // Make sure it won't fail because of receive timeout
	HttpModule->HttpTotalTimeout = TimeoutSetting;

	if (bRetryEnabled)
	{
		TimeoutSetting = 4.0f; // This will override http module default timeout
		HttpRetryManager->RetryTimeoutRelativeSecondsDefault = TimeoutSetting;

#Loc: <Workspace>/Engine/Source/Programs/WebTests/Private/TestHttp.cpp:1836

Scope: file

Source code excerpt:

	{
		HttpRequest->SetURL(UrlStreamDownload(2/*Chunks*/, HTTP_TEST_TIMEOUT_CHUNK_SIZE, 2/*ChunkLatency*/));
		HttpModule->HttpActivityTimeout = 1.0f;

		ExpectedTimeoutDuration = 2.0f; // each request will take 1s, 1st retry back off takes 0s

#if WITH_CURL_XCURL
		// Unlike libCurl, currently there is an issue in xCurl that it triggers CURLINFO_HEADER_OUT even if can't 
		// connect. Had to disable that code, make sure not to treat that event as connected

#Loc: <Workspace>/Engine/Source/Programs/WebTests/Private/TestHttp.cpp:1962

Scope: file

Source code excerpt:

	DisableWarningsInThisTest();

	HttpModule->HttpActivityTimeout = 2.0f;

	TSharedPtr<IHttpRequest> HttpRequest = CreateRequest();
	HttpRequest->SetURL(UrlStreamDownload(3/*Chunks*/, HTTP_TEST_TIMEOUT_CHUNK_SIZE, 5/*ChunkLatency*/));
	HttpRequest->OnProcessRequestComplete().BindLambda([](FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded) {
		CHECK(HttpRequest->GetStatus() == EHttpRequestStatus::Failed);
		CHECK(HttpRequest->GetFailureReason() == EHttpFailureReason::ConnectionError);

#Loc: <Workspace>/Engine/Source/Runtime/Online/HTTP/Private/Apple/ApplePlatformHttp.cpp:237

Scope: file

Source code excerpt:

	Config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;

	float HttpActivityTimeout = FHttpModule::Get().GetHttpActivityTimeout();
	check(HttpActivityTimeout > 0);
	Config.timeoutIntervalForRequest = HttpActivityTimeout;
	
#if WITH_SSL
	// Load SSL module during HTTP module's StatupModule() to make sure module manager figures out the dependencies correctly
	// and doesn't unload SSL before unloading HTTP module at exit
	FSslModule::Get();

#Loc: <Workspace>/Engine/Source/Runtime/Online/HTTP/Private/GenericPlatform/HttpRequestCommon.cpp:259

Scope (from outer to inner):

file
function     void FHttpRequestCommon::StartActivityTimeoutTimer

Source code excerpt:

	}

	float HttpActivityTimeout = GetActivityTimeoutOrDefault();
	if (HttpActivityTimeout == 0)
	{
		return;
	}

	StartActivityTimeoutTimerBy(HttpActivityTimeout);

	ResetActivityTimeoutTimer(TEXTVIEW("Connected"));
}

void FHttpRequestCommon::StartActivityTimeoutTimerBy(double DelayToTrigger)
{

#Loc: <Workspace>/Engine/Source/Runtime/Online/HTTP/Private/HttpModule.cpp:54

Scope (from outer to inner):

file
function     void FHttpModule::UpdateConfigs

Source code excerpt:

	GConfig->GetFloat(TEXT("HTTP"), TEXT("HttpTotalTimeout"), HttpTotalTimeout, GEngineIni);
	GConfig->GetFloat(TEXT("HTTP"), TEXT("HttpConnectionTimeout"), HttpConnectionTimeout, GEngineIni);
	GConfig->GetFloat(TEXT("HTTP"), TEXT("HttpActivityTimeout"), HttpActivityTimeout, GEngineIni);
	GConfig->GetFloat(TEXT("HTTP"), TEXT("HttpReceiveTimeout"), HttpReceiveTimeout, GEngineIni);
	GConfig->GetFloat(TEXT("HTTP"), TEXT("HttpSendTimeout"), HttpSendTimeout, GEngineIni);
	GConfig->GetInt(TEXT("HTTP"), TEXT("HttpMaxConnectionsPerServer"), HttpMaxConnectionsPerServer, GEngineIni);
	GConfig->GetBool(TEXT("HTTP"), TEXT("bEnableHttp"), bEnableHttp, GEngineIni);
	GConfig->GetBool(TEXT("HTTP"), TEXT("bUseNullHttp"), bUseNullHttp, GEngineIni);
	GConfig->GetFloat(TEXT("HTTP"), TEXT("HttpDelayTime"), HttpDelayTime, GEngineIni);

#Loc: <Workspace>/Engine/Source/Runtime/Online/HTTP/Private/HttpModule.cpp:88

Scope (from outer to inner):

file
function     void FHttpModule::StartupModule

Source code excerpt:

	HttpTotalTimeout = 0.0f;
	HttpConnectionTimeout = 30.0f;
	HttpActivityTimeout = 30.0f;
	HttpReceiveTimeout = HttpConnectionTimeout;
	HttpSendTimeout = HttpConnectionTimeout;
	HttpMaxConnectionsPerServer = 16;
	bEnableHttp = true;
	bUseNullHttp = false;
	HttpDelayTime = 0;

#Loc: <Workspace>/Engine/Source/Runtime/Online/HTTP/Public/HttpModule.h:138

Scope (from outer to inner):

file
class        class FHttpModule : public IModuleInterface, public FSelfRegisteringExec
function     inline float GetHttpActivityTimeout

Source code excerpt:

	inline float GetHttpActivityTimeout() const
	{
		return HttpActivityTimeout;
	}

	/**
	 * @return max number of simultaneous connections to a specific server
	 */
	inline int32 GetHttpMaxConnectionsPerServer() const

#Loc: <Workspace>/Engine/Source/Runtime/Online/HTTP/Public/HttpModule.h:341

Scope (from outer to inner):

file
class        class FHttpModule : public IModuleInterface, public FSelfRegisteringExec

Source code excerpt:

	float HttpTotalTimeout;
	/**  timeout in seconds to check there is any ongoing activity on the established connection */
	float HttpActivityTimeout;

private:

	// IModuleInterface

	/**