Skip to content

bitreq: Fix connection persistence, pool refresh - #661

Closed
tnull wants to merge 5 commits into
rust-bitcoin:masterfrom
tnull:2026-07-bitreq-persistence-pool
Closed

bitreq: Fix connection persistence, pool refresh#661
tnull wants to merge 5 commits into
rust-bitcoin:masterfrom
tnull:2026-07-bitreq-persistence-pool

Conversation

@tnull

Copy link
Copy Markdown
Collaborator

Based on #660.
Closes#659.

Honor HTTP persistence rules
Reuse HTTP/1.1 connections unless either endpoint requests
closure, and require explicit keep-alive only for HTTP/1.0. This
allows compliant servers to omit redundant keep-alive headers while
still preventing reuse after a close option.
Refresh async pool entries on reuse A cache hit must make its connection the most recently used entry.
Without that refresh, inserting another origin can evict an actively
reused connection and retain an older idle one.

tnull added 3 commits July 11, 2026 15:21
Exercise the HTTP/1.1 wire grammar so request generation and
response parsing gaps are visible before behavior is changed.
Co-Authored-By: HAL 9000
Cover response length and chunk decoding rules so incomplete or
ambiguous messages cannot pass unnoticed.
Co-Authored-By: HAL 9000
Cover persistence, closure, and pipelining rules so connection
reuse can be corrected against explicit expectations.
Refs: rust-bitcoin#659
Co-Authored-By: HAL 9000

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, changes in this PR LGTM, had one question in the dep PR though.

Comment threadbitreq/src/connection.rs Outdated
Comment threadbitreq/src/client.rs Outdated
tnull added 2 commits July 20, 2026 09:50
Reuse HTTP/1.1 connections unless either endpoint requests
closure, and require explicit keep-alive only for HTTP/1.0. This
allows compliant servers to omit redundant keep-alive headers while
still preventing reuse after a close option.
Fixesrust-bitcoin#659
Co-Authored-By: HAL 9000
A cache hit must make its connection the most recently used entry.
Without that refresh, inserting another origin can evict an actively
reused connection and retain an older idle one.
Co-Authored-By: HAL 9000
@tnull
tnullforce-pushed the 2026-07-bitreq-persistence-pool branch from b925c3e to f46ab3aCompareJuly 20, 2026 07:50
@tnull

Copy link
Copy Markdown
CollaboratorAuthor

Force-pushed with the following changes:

diff --git a/bitreq/src/client.rs b/bitreq/src/client.rs
index f2a9bb25..d71c349c 100644
--- a/bitreq/src/client.rs+++ b/bitreq/src/client.rs@@ -69,5 +69,6 @@ impl Client {
let mut state = self.r#async.lock().unwrap();
- if let Some(conn) = state.connections.get(&owned_key).cloned() {+ if let Some(conn) = state.connections.get(&owned_key) {+ let conn = Arc::clone(conn);
state.lru_order.retain(|key| key != &owned_key);
state.lru_order.push_back(owned_key.clone());
diff --git a/bitreq/src/connection.rs b/bitreq/src/connection.rs
index 1fe7b92c..3b28bad4 100644
--- a/bitreq/src/connection.rs+++ b/bitreq/src/connection.rs@@ -587,5 +587,5 @@ impl AsyncConnection {
.await?;
- let connection = response.headers.get("connection").map(String::as_str);+ let connection = response.headers.get("connection");
let received_close =
connection.is_some_and(|value| has_connection_option(value, "close"));

@tnull
tnull requested a review from TheBlueMattJuly 20, 2026 07:51
@tcharding

Copy link
Copy Markdown
Member

Please note development has migrated to https://git.rust-bitcoin.org/rust-bitcoin/corepc. Any further comments or pushes here on github may be ignored or lost. Closing since I know @tnull is ok with the migration.

@tnulltnull mentioned this pull request Aug 12, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bitreq::Client only reuses an HTTP/1.1 connection when the response explicitly contains Connection: keep-alive

3 participants

@tnull@tcharding@TheBlueMatt
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
`bitreq`: Fix connection persistence, pool refresh by tnull · Pull Request #661 · rust-bitcoin/corepc · GitHub
Skip to content

bitreq: Fix connection persistence, pool refresh - #661

Closed
tnull wants to merge 5 commits into
rust-bitcoin:masterfrom
tnull:2026-07-bitreq-persistence-pool
Closed

bitreq: Fix connection persistence, pool refresh#661
tnull wants to merge 5 commits into
rust-bitcoin:masterfrom
tnull:2026-07-bitreq-persistence-pool

Conversation

@tnull

Copy link
Copy Markdown
Collaborator

Based on #660.
Closes#659.

Honor HTTP persistence rules
Reuse HTTP/1.1 connections unless either endpoint requests
closure, and require explicit keep-alive only for HTTP/1.0. This
allows compliant servers to omit redundant keep-alive headers while
still preventing reuse after a close option.
Refresh async pool entries on reuse A cache hit must make its connection the most recently used entry.
Without that refresh, inserting another origin can evict an actively
reused connection and retain an older idle one.

tnull added 3 commits July 11, 2026 15:21
Exercise the HTTP/1.1 wire grammar so request generation and
response parsing gaps are visible before behavior is changed.
Co-Authored-By: HAL 9000
Cover response length and chunk decoding rules so incomplete or
ambiguous messages cannot pass unnoticed.
Co-Authored-By: HAL 9000
Cover persistence, closure, and pipelining rules so connection
reuse can be corrected against explicit expectations.
Refs: rust-bitcoin#659
Co-Authored-By: HAL 9000

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, changes in this PR LGTM, had one question in the dep PR though.

Comment threadbitreq/src/connection.rs Outdated
Comment threadbitreq/src/client.rs Outdated
tnull added 2 commits July 20, 2026 09:50
Reuse HTTP/1.1 connections unless either endpoint requests
closure, and require explicit keep-alive only for HTTP/1.0. This
allows compliant servers to omit redundant keep-alive headers while
still preventing reuse after a close option.
Fixesrust-bitcoin#659
Co-Authored-By: HAL 9000
A cache hit must make its connection the most recently used entry.
Without that refresh, inserting another origin can evict an actively
reused connection and retain an older idle one.
Co-Authored-By: HAL 9000
@tnull
tnullforce-pushed the 2026-07-bitreq-persistence-pool branch from b925c3e to f46ab3aCompareJuly 20, 2026 07:50
@tnull

Copy link
Copy Markdown
CollaboratorAuthor

Force-pushed with the following changes:

diff --git a/bitreq/src/client.rs b/bitreq/src/client.rs
index f2a9bb25..d71c349c 100644
--- a/bitreq/src/client.rs+++ b/bitreq/src/client.rs@@ -69,5 +69,6 @@ impl Client {
let mut state = self.r#async.lock().unwrap();
- if let Some(conn) = state.connections.get(&owned_key).cloned() {+ if let Some(conn) = state.connections.get(&owned_key) {+ let conn = Arc::clone(conn);
state.lru_order.retain(|key| key != &owned_key);
state.lru_order.push_back(owned_key.clone());
diff --git a/bitreq/src/connection.rs b/bitreq/src/connection.rs
index 1fe7b92c..3b28bad4 100644
--- a/bitreq/src/connection.rs+++ b/bitreq/src/connection.rs@@ -587,5 +587,5 @@ impl AsyncConnection {
.await?;
- let connection = response.headers.get("connection").map(String::as_str);+ let connection = response.headers.get("connection");
let received_close =
connection.is_some_and(|value| has_connection_option(value, "close"));

@tnull
tnull requested a review from TheBlueMattJuly 20, 2026 07:51
@tcharding

Copy link
Copy Markdown
Member

Please note development has migrated to https://git.rust-bitcoin.org/rust-bitcoin/corepc. Any further comments or pushes here on github may be ignored or lost. Closing since I know @tnull is ok with the migration.

@tnulltnull mentioned this pull request Aug 12, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bitreq::Client only reuses an HTTP/1.1 connection when the response explicitly contains Connection: keep-alive

3 participants

@tnull@tcharding@TheBlueMatt
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' `bitreq`: Fix connection persistence, pool refresh by tnull · Pull Request #661 · rust-bitcoin/corepc · GitHub
Skip to content

bitreq: Fix connection persistence, pool refresh - #661

Closed
tnull wants to merge 5 commits into
rust-bitcoin:masterfrom
tnull:2026-07-bitreq-persistence-pool
Closed

bitreq: Fix connection persistence, pool refresh#661
tnull wants to merge 5 commits into
rust-bitcoin:masterfrom
tnull:2026-07-bitreq-persistence-pool

Conversation

@tnull

Copy link
Copy Markdown
Collaborator

Based on #660.
Closes#659.

Honor HTTP persistence rules
Reuse HTTP/1.1 connections unless either endpoint requests
closure, and require explicit keep-alive only for HTTP/1.0. This
allows compliant servers to omit redundant keep-alive headers while
still preventing reuse after a close option.
Refresh async pool entries on reuse A cache hit must make its connection the most recently used entry.
Without that refresh, inserting another origin can evict an actively
reused connection and retain an older idle one.

tnull added 3 commits July 11, 2026 15:21
Exercise the HTTP/1.1 wire grammar so request generation and
response parsing gaps are visible before behavior is changed.
Co-Authored-By: HAL 9000
Cover response length and chunk decoding rules so incomplete or
ambiguous messages cannot pass unnoticed.
Co-Authored-By: HAL 9000
Cover persistence, closure, and pipelining rules so connection
reuse can be corrected against explicit expectations.
Refs: rust-bitcoin#659
Co-Authored-By: HAL 9000

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, changes in this PR LGTM, had one question in the dep PR though.

Comment threadbitreq/src/connection.rs Outdated
Comment threadbitreq/src/client.rs Outdated
tnull added 2 commits July 20, 2026 09:50
Reuse HTTP/1.1 connections unless either endpoint requests
closure, and require explicit keep-alive only for HTTP/1.0. This
allows compliant servers to omit redundant keep-alive headers while
still preventing reuse after a close option.
Fixesrust-bitcoin#659
Co-Authored-By: HAL 9000
A cache hit must make its connection the most recently used entry.
Without that refresh, inserting another origin can evict an actively
reused connection and retain an older idle one.
Co-Authored-By: HAL 9000
@tnull
tnullforce-pushed the 2026-07-bitreq-persistence-pool branch from b925c3e to f46ab3aCompareJuly 20, 2026 07:50
@tnull

Copy link
Copy Markdown
CollaboratorAuthor

Force-pushed with the following changes:

diff --git a/bitreq/src/client.rs b/bitreq/src/client.rs
index f2a9bb25..d71c349c 100644
--- a/bitreq/src/client.rs+++ b/bitreq/src/client.rs@@ -69,5 +69,6 @@ impl Client {
let mut state = self.r#async.lock().unwrap();
- if let Some(conn) = state.connections.get(&owned_key).cloned() {+ if let Some(conn) = state.connections.get(&owned_key) {+ let conn = Arc::clone(conn);
state.lru_order.retain(|key| key != &owned_key);
state.lru_order.push_back(owned_key.clone());
diff --git a/bitreq/src/connection.rs b/bitreq/src/connection.rs
index 1fe7b92c..3b28bad4 100644
--- a/bitreq/src/connection.rs+++ b/bitreq/src/connection.rs@@ -587,5 +587,5 @@ impl AsyncConnection {
.await?;
- let connection = response.headers.get("connection").map(String::as_str);+ let connection = response.headers.get("connection");
let received_close =
connection.is_some_and(|value| has_connection_option(value, "close"));

@tnull
tnull requested a review from TheBlueMattJuly 20, 2026 07:51
@tcharding

Copy link
Copy Markdown
Member

Please note development has migrated to https://git.rust-bitcoin.org/rust-bitcoin/corepc. Any further comments or pushes here on github may be ignored or lost. Closing since I know @tnull is ok with the migration.

@tnulltnull mentioned this pull request Aug 12, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bitreq::Client only reuses an HTTP/1.1 connection when the response explicitly contains Connection: keep-alive

3 participants

@tnull@tcharding@TheBlueMatt
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' `bitreq`: Fix connection persistence, pool refresh by tnull · Pull Request #661 · rust-bitcoin/corepc · GitHub
Skip to content

bitreq: Fix connection persistence, pool refresh - #661

Closed
tnull wants to merge 5 commits into
rust-bitcoin:masterfrom
tnull:2026-07-bitreq-persistence-pool
Closed

bitreq: Fix connection persistence, pool refresh#661
tnull wants to merge 5 commits into
rust-bitcoin:masterfrom
tnull:2026-07-bitreq-persistence-pool

Conversation

@tnull

Copy link
Copy Markdown
Collaborator

Based on #660.
Closes#659.

Honor HTTP persistence rules
Reuse HTTP/1.1 connections unless either endpoint requests
closure, and require explicit keep-alive only for HTTP/1.0. This
allows compliant servers to omit redundant keep-alive headers while
still preventing reuse after a close option.
Refresh async pool entries on reuse A cache hit must make its connection the most recently used entry.
Without that refresh, inserting another origin can evict an actively
reused connection and retain an older idle one.

tnull added 3 commits July 11, 2026 15:21
Exercise the HTTP/1.1 wire grammar so request generation and
response parsing gaps are visible before behavior is changed.
Co-Authored-By: HAL 9000
Cover response length and chunk decoding rules so incomplete or
ambiguous messages cannot pass unnoticed.
Co-Authored-By: HAL 9000
Cover persistence, closure, and pipelining rules so connection
reuse can be corrected against explicit expectations.
Refs: rust-bitcoin#659
Co-Authored-By: HAL 9000

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, changes in this PR LGTM, had one question in the dep PR though.

Comment threadbitreq/src/connection.rs Outdated
Comment threadbitreq/src/client.rs Outdated
tnull added 2 commits July 20, 2026 09:50
Reuse HTTP/1.1 connections unless either endpoint requests
closure, and require explicit keep-alive only for HTTP/1.0. This
allows compliant servers to omit redundant keep-alive headers while
still preventing reuse after a close option.
Fixesrust-bitcoin#659
Co-Authored-By: HAL 9000
A cache hit must make its connection the most recently used entry.
Without that refresh, inserting another origin can evict an actively
reused connection and retain an older idle one.
Co-Authored-By: HAL 9000
@tnull
tnullforce-pushed the 2026-07-bitreq-persistence-pool branch from b925c3e to f46ab3aCompareJuly 20, 2026 07:50
@tnull

Copy link
Copy Markdown
CollaboratorAuthor

Force-pushed with the following changes:

diff --git a/bitreq/src/client.rs b/bitreq/src/client.rs
index f2a9bb25..d71c349c 100644
--- a/bitreq/src/client.rs+++ b/bitreq/src/client.rs@@ -69,5 +69,6 @@ impl Client {
let mut state = self.r#async.lock().unwrap();
- if let Some(conn) = state.connections.get(&owned_key).cloned() {+ if let Some(conn) = state.connections.get(&owned_key) {+ let conn = Arc::clone(conn);
state.lru_order.retain(|key| key != &owned_key);
state.lru_order.push_back(owned_key.clone());
diff --git a/bitreq/src/connection.rs b/bitreq/src/connection.rs
index 1fe7b92c..3b28bad4 100644
--- a/bitreq/src/connection.rs+++ b/bitreq/src/connection.rs@@ -587,5 +587,5 @@ impl AsyncConnection {
.await?;
- let connection = response.headers.get("connection").map(String::as_str);+ let connection = response.headers.get("connection");
let received_close =
connection.is_some_and(|value| has_connection_option(value, "close"));

@tnull
tnull requested a review from TheBlueMattJuly 20, 2026 07:51
@tcharding

Copy link
Copy Markdown
Member

Please note development has migrated to https://git.rust-bitcoin.org/rust-bitcoin/corepc. Any further comments or pushes here on github may be ignored or lost. Closing since I know @tnull is ok with the migration.

@tnulltnull mentioned this pull request Aug 12, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bitreq::Client only reuses an HTTP/1.1 connection when the response explicitly contains Connection: keep-alive

3 participants

@tnull@tcharding@TheBlueMatt
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' `bitreq`: Fix connection persistence, pool refresh by tnull · Pull Request #661 · rust-bitcoin/corepc · GitHub
Skip to content

bitreq: Fix connection persistence, pool refresh - #661

Closed
tnull wants to merge 5 commits into
rust-bitcoin:masterfrom
tnull:2026-07-bitreq-persistence-pool
Closed

bitreq: Fix connection persistence, pool refresh#661
tnull wants to merge 5 commits into
rust-bitcoin:masterfrom
tnull:2026-07-bitreq-persistence-pool

Conversation

@tnull

Copy link
Copy Markdown
Collaborator

Based on #660.
Closes#659.

Honor HTTP persistence rules
Reuse HTTP/1.1 connections unless either endpoint requests
closure, and require explicit keep-alive only for HTTP/1.0. This
allows compliant servers to omit redundant keep-alive headers while
still preventing reuse after a close option.
Refresh async pool entries on reuse A cache hit must make its connection the most recently used entry.
Without that refresh, inserting another origin can evict an actively
reused connection and retain an older idle one.

tnull added 3 commits July 11, 2026 15:21
Exercise the HTTP/1.1 wire grammar so request generation and
response parsing gaps are visible before behavior is changed.
Co-Authored-By: HAL 9000
Cover response length and chunk decoding rules so incomplete or
ambiguous messages cannot pass unnoticed.
Co-Authored-By: HAL 9000
Cover persistence, closure, and pipelining rules so connection
reuse can be corrected against explicit expectations.
Refs: rust-bitcoin#659
Co-Authored-By: HAL 9000

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, changes in this PR LGTM, had one question in the dep PR though.

Comment threadbitreq/src/connection.rs Outdated
Comment threadbitreq/src/client.rs Outdated
tnull added 2 commits July 20, 2026 09:50
Reuse HTTP/1.1 connections unless either endpoint requests
closure, and require explicit keep-alive only for HTTP/1.0. This
allows compliant servers to omit redundant keep-alive headers while
still preventing reuse after a close option.
Fixesrust-bitcoin#659
Co-Authored-By: HAL 9000
A cache hit must make its connection the most recently used entry.
Without that refresh, inserting another origin can evict an actively
reused connection and retain an older idle one.
Co-Authored-By: HAL 9000
@tnull
tnullforce-pushed the 2026-07-bitreq-persistence-pool branch from b925c3e to f46ab3aCompareJuly 20, 2026 07:50
@tnull

Copy link
Copy Markdown
CollaboratorAuthor

Force-pushed with the following changes:

diff --git a/bitreq/src/client.rs b/bitreq/src/client.rs
index f2a9bb25..d71c349c 100644
--- a/bitreq/src/client.rs+++ b/bitreq/src/client.rs@@ -69,5 +69,6 @@ impl Client {
let mut state = self.r#async.lock().unwrap();
- if let Some(conn) = state.connections.get(&owned_key).cloned() {+ if let Some(conn) = state.connections.get(&owned_key) {+ let conn = Arc::clone(conn);
state.lru_order.retain(|key| key != &owned_key);
state.lru_order.push_back(owned_key.clone());
diff --git a/bitreq/src/connection.rs b/bitreq/src/connection.rs
index 1fe7b92c..3b28bad4 100644
--- a/bitreq/src/connection.rs+++ b/bitreq/src/connection.rs@@ -587,5 +587,5 @@ impl AsyncConnection {
.await?;
- let connection = response.headers.get("connection").map(String::as_str);+ let connection = response.headers.get("connection");
let received_close =
connection.is_some_and(|value| has_connection_option(value, "close"));

@tnull
tnull requested a review from TheBlueMattJuly 20, 2026 07:51
@tcharding

Copy link
Copy Markdown
Member

Please note development has migrated to https://git.rust-bitcoin.org/rust-bitcoin/corepc. Any further comments or pushes here on github may be ignored or lost. Closing since I know @tnull is ok with the migration.

@tnulltnull mentioned this pull request Aug 12, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bitreq::Client only reuses an HTTP/1.1 connection when the response explicitly contains Connection: keep-alive

3 participants

@tnull@tcharding@TheBlueMatt
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' `bitreq`: Fix connection persistence, pool refresh by tnull · Pull Request #661 · rust-bitcoin/corepc · GitHub
Skip to content

bitreq: Fix connection persistence, pool refresh - #661

Closed
tnull wants to merge 5 commits into
rust-bitcoin:masterfrom
tnull:2026-07-bitreq-persistence-pool
Closed

bitreq: Fix connection persistence, pool refresh#661
tnull wants to merge 5 commits into
rust-bitcoin:masterfrom
tnull:2026-07-bitreq-persistence-pool

Conversation

@tnull

Copy link
Copy Markdown
Collaborator

Based on #660.
Closes#659.

Honor HTTP persistence rules
Reuse HTTP/1.1 connections unless either endpoint requests
closure, and require explicit keep-alive only for HTTP/1.0. This
allows compliant servers to omit redundant keep-alive headers while
still preventing reuse after a close option.
Refresh async pool entries on reuse A cache hit must make its connection the most recently used entry.
Without that refresh, inserting another origin can evict an actively
reused connection and retain an older idle one.

tnull added 3 commits July 11, 2026 15:21
Exercise the HTTP/1.1 wire grammar so request generation and
response parsing gaps are visible before behavior is changed.
Co-Authored-By: HAL 9000
Cover response length and chunk decoding rules so incomplete or
ambiguous messages cannot pass unnoticed.
Co-Authored-By: HAL 9000
Cover persistence, closure, and pipelining rules so connection
reuse can be corrected against explicit expectations.
Refs: rust-bitcoin#659
Co-Authored-By: HAL 9000

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, changes in this PR LGTM, had one question in the dep PR though.

Comment threadbitreq/src/connection.rs Outdated
Comment threadbitreq/src/client.rs Outdated
tnull added 2 commits July 20, 2026 09:50
Reuse HTTP/1.1 connections unless either endpoint requests
closure, and require explicit keep-alive only for HTTP/1.0. This
allows compliant servers to omit redundant keep-alive headers while
still preventing reuse after a close option.
Fixesrust-bitcoin#659
Co-Authored-By: HAL 9000
A cache hit must make its connection the most recently used entry.
Without that refresh, inserting another origin can evict an actively
reused connection and retain an older idle one.
Co-Authored-By: HAL 9000
@tnull
tnullforce-pushed the 2026-07-bitreq-persistence-pool branch from b925c3e to f46ab3aCompareJuly 20, 2026 07:50
@tnull

Copy link
Copy Markdown
CollaboratorAuthor

Force-pushed with the following changes:

diff --git a/bitreq/src/client.rs b/bitreq/src/client.rs
index f2a9bb25..d71c349c 100644
--- a/bitreq/src/client.rs+++ b/bitreq/src/client.rs@@ -69,5 +69,6 @@ impl Client {
let mut state = self.r#async.lock().unwrap();
- if let Some(conn) = state.connections.get(&owned_key).cloned() {+ if let Some(conn) = state.connections.get(&owned_key) {+ let conn = Arc::clone(conn);
state.lru_order.retain(|key| key != &owned_key);
state.lru_order.push_back(owned_key.clone());
diff --git a/bitreq/src/connection.rs b/bitreq/src/connection.rs
index 1fe7b92c..3b28bad4 100644
--- a/bitreq/src/connection.rs+++ b/bitreq/src/connection.rs@@ -587,5 +587,5 @@ impl AsyncConnection {
.await?;
- let connection = response.headers.get("connection").map(String::as_str);+ let connection = response.headers.get("connection");
let received_close =
connection.is_some_and(|value| has_connection_option(value, "close"));

@tnull
tnull requested a review from TheBlueMattJuly 20, 2026 07:51
@tcharding

Copy link
Copy Markdown
Member

Please note development has migrated to https://git.rust-bitcoin.org/rust-bitcoin/corepc. Any further comments or pushes here on github may be ignored or lost. Closing since I know @tnull is ok with the migration.

@tnulltnull mentioned this pull request Aug 12, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bitreq::Client only reuses an HTTP/1.1 connection when the response explicitly contains Connection: keep-alive

3 participants

@tnull@tcharding@TheBlueMatt
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); `bitreq`: Fix connection persistence, pool refresh by tnull · Pull Request #661 · rust-bitcoin/corepc · GitHub
Skip to content

bitreq: Fix connection persistence, pool refresh - #661

Closed
tnull wants to merge 5 commits into
rust-bitcoin:masterfrom
tnull:2026-07-bitreq-persistence-pool
Closed

bitreq: Fix connection persistence, pool refresh#661
tnull wants to merge 5 commits into
rust-bitcoin:masterfrom
tnull:2026-07-bitreq-persistence-pool

Conversation

@tnull

Copy link
Copy Markdown
Collaborator

Based on #660.
Closes#659.

Honor HTTP persistence rules
Reuse HTTP/1.1 connections unless either endpoint requests
closure, and require explicit keep-alive only for HTTP/1.0. This
allows compliant servers to omit redundant keep-alive headers while
still preventing reuse after a close option.
Refresh async pool entries on reuse A cache hit must make its connection the most recently used entry.
Without that refresh, inserting another origin can evict an actively
reused connection and retain an older idle one.

tnull added 3 commits July 11, 2026 15:21
Exercise the HTTP/1.1 wire grammar so request generation and
response parsing gaps are visible before behavior is changed.
Co-Authored-By: HAL 9000
Cover response length and chunk decoding rules so incomplete or
ambiguous messages cannot pass unnoticed.
Co-Authored-By: HAL 9000
Cover persistence, closure, and pipelining rules so connection
reuse can be corrected against explicit expectations.
Refs: rust-bitcoin#659
Co-Authored-By: HAL 9000

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, changes in this PR LGTM, had one question in the dep PR though.

Comment threadbitreq/src/connection.rs Outdated
Comment threadbitreq/src/client.rs Outdated
tnull added 2 commits July 20, 2026 09:50
Reuse HTTP/1.1 connections unless either endpoint requests
closure, and require explicit keep-alive only for HTTP/1.0. This
allows compliant servers to omit redundant keep-alive headers while
still preventing reuse after a close option.
Fixesrust-bitcoin#659
Co-Authored-By: HAL 9000
A cache hit must make its connection the most recently used entry.
Without that refresh, inserting another origin can evict an actively
reused connection and retain an older idle one.
Co-Authored-By: HAL 9000
@tnull
tnullforce-pushed the 2026-07-bitreq-persistence-pool branch from b925c3e to f46ab3aCompareJuly 20, 2026 07:50
@tnull

Copy link
Copy Markdown
CollaboratorAuthor

Force-pushed with the following changes:

diff --git a/bitreq/src/client.rs b/bitreq/src/client.rs
index f2a9bb25..d71c349c 100644
--- a/bitreq/src/client.rs+++ b/bitreq/src/client.rs@@ -69,5 +69,6 @@ impl Client {
let mut state = self.r#async.lock().unwrap();
- if let Some(conn) = state.connections.get(&owned_key).cloned() {+ if let Some(conn) = state.connections.get(&owned_key) {+ let conn = Arc::clone(conn);
state.lru_order.retain(|key| key != &owned_key);
state.lru_order.push_back(owned_key.clone());
diff --git a/bitreq/src/connection.rs b/bitreq/src/connection.rs
index 1fe7b92c..3b28bad4 100644
--- a/bitreq/src/connection.rs+++ b/bitreq/src/connection.rs@@ -587,5 +587,5 @@ impl AsyncConnection {
.await?;
- let connection = response.headers.get("connection").map(String::as_str);+ let connection = response.headers.get("connection");
let received_close =
connection.is_some_and(|value| has_connection_option(value, "close"));

@tnull
tnull requested a review from TheBlueMattJuly 20, 2026 07:51
@tcharding

Copy link
Copy Markdown
Member

Please note development has migrated to https://git.rust-bitcoin.org/rust-bitcoin/corepc. Any further comments or pushes here on github may be ignored or lost. Closing since I know @tnull is ok with the migration.

@tnulltnull mentioned this pull request Aug 12, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bitreq::Client only reuses an HTTP/1.1 connection when the response explicitly contains Connection: keep-alive

3 participants

@tnull@tcharding@TheBlueMatt