[llvm] [llvm][SupportHTTP] Apply WinHTTP timeout setting after WinHttpOpen (PR #188969)

via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 27 04:30:27 PDT 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-support

Author: Stefan Gränitz (weliveindetail)

<details>
<summary>Changes</summary>

`setTimeout()` required the session handle, but it was only created inside `HTTPClient::perform()`. This patch stores the incoming value and applies it after the session handle is created with `WinHttpOpen()`.

---
Full diff: https://github.com/llvm/llvm-project/pull/188969.diff


1 Files Affected:

- (modified) llvm/lib/Support/HTTP/HTTPClient.cpp (+12-9) 


``````````diff
diff --git a/llvm/lib/Support/HTTP/HTTPClient.cpp b/llvm/lib/Support/HTTP/HTTPClient.cpp
index ce6820dfb1f5a..66286210c4347 100644
--- a/llvm/lib/Support/HTTP/HTTPClient.cpp
+++ b/llvm/lib/Support/HTTP/HTTPClient.cpp
@@ -154,6 +154,7 @@ struct WinHTTPSession {
   HINTERNET ConnectHandle = nullptr;
   HINTERNET RequestHandle = nullptr;
   DWORD ResponseCode = 0;
+  DWORD TimeoutMs = 0;
 
   ~WinHTTPSession() {
     if (RequestHandle)
@@ -225,15 +226,7 @@ void HTTPClient::cleanup() {
 
 void HTTPClient::setTimeout(std::chrono::milliseconds Timeout) {
   WinHTTPSession *Session = static_cast<WinHTTPSession *>(Handle);
-  if (Session && Session->SessionHandle) {
-    DWORD TimeoutMs = static_cast<DWORD>(Timeout.count());
-    WinHttpSetOption(Session->SessionHandle, WINHTTP_OPTION_CONNECT_TIMEOUT,
-                     &TimeoutMs, sizeof(TimeoutMs));
-    WinHttpSetOption(Session->SessionHandle, WINHTTP_OPTION_RECEIVE_TIMEOUT,
-                     &TimeoutMs, sizeof(TimeoutMs));
-    WinHttpSetOption(Session->SessionHandle, WINHTTP_OPTION_SEND_TIMEOUT,
-                     &TimeoutMs, sizeof(TimeoutMs));
-  }
+  Session->TimeoutMs = static_cast<DWORD>(Timeout.count());
 }
 
 Error HTTPClient::perform(const HTTPRequest &Request,
@@ -265,6 +258,16 @@ Error HTTPClient::perform(const HTTPRequest &Request,
   if (!Session->SessionHandle)
     return createStringError(errc::io_error, "Failed to open WinHTTP session");
 
+  // Apply timeout if configured
+  if (Session->TimeoutMs > 0) {
+    WinHttpSetOption(Session->SessionHandle, WINHTTP_OPTION_CONNECT_TIMEOUT,
+                     &Session->TimeoutMs, sizeof(Session->TimeoutMs));
+    WinHttpSetOption(Session->SessionHandle, WINHTTP_OPTION_SEND_TIMEOUT,
+                     &Session->TimeoutMs, sizeof(Session->TimeoutMs));
+    WinHttpSetOption(Session->SessionHandle, WINHTTP_OPTION_RECEIVE_TIMEOUT,
+                     &Session->TimeoutMs, sizeof(Session->TimeoutMs));
+  }
+
   // Prevent fallback to TLS 1.0/1.1
   DWORD SecureProtocols =
       WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2 | WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3;

``````````

</details>


https://github.com/llvm/llvm-project/pull/188969


More information about the llvm-commits mailing list