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:
- This timeout is applied per request, not for the entire HTTP session.
- It’s used to detect inactivity on an established connection, which is different from the connection timeout or total request timeout.
- 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:
- Set it to a value that allows enough time for typical server responses but isn’t so long that it unnecessarily delays error detection.
- Consider the nature of your HTTP requests when setting this value. Long-running or streaming requests may need a longer activity timeout.
- Use in conjunction with other timeout settings for comprehensive request management.
- Monitor and adjust based on real-world performance and error rates.
- 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]
- INI Section:
HTTP
- Raw value:
30
- Is Array:
False
#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
/**