SocketHttpHandler: include host+IP information in HttpRequestException - #38131

Merged
antonfirsov merged 8 commits into
dotnet:masterfrom
antonfirsov:af/better-httpconnectexception
Jul 8, 2020
Merged

SocketHttpHandler: include host+IP information in HttpRequestException#38131
antonfirsov merged 8 commits into
dotnet:masterfrom
antonfirsov:af/better-httpconnectexception

Conversation

@antonfirsov

@antonfirsovantonfirsov commented Jun 19, 2020

Copy link
Copy Markdown
Contributor

Fix#1326 by appending host:port info to HttpRequestException's message when connection fails.

Didn't change the inner SocketException, since it would require subclassing SocketException, which would add unnecessary complexity here.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/ncl
Notify danmosemsft if you want to be subscribed.


[Fact]
[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This should likely belong to a SocketsHttpHandler test, but I'm new to HTTP codebase, and couldn't figure out where. Any suggestion?

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.

I think this is a good enough place for this test.

@antonfirsovantonfirsov added this to the 5.0.0 milestone Jun 19, 2020
@antonfirsov
antonfirsov requested a review from a teamJune 19, 2020 00:24

[Fact]
[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()

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.

I think this is a good enough place for this test.

[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()
{
using var client = new HttpClient(new SocketsHttpHandler());

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.

In tests, the HttpClient is usually created via CreateHttpClient(), e.g.: using HttpClient httpClient = CreateHttpClient();. Is there any reason here to create it directly?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Both questions depend on what we consider to be the SUT. I can't decide what is a good functional unit to test this feature against. HttpClient with default setup or SocketsHttpHandler?

I have no preference, want to go with existing practices.

@ManickaPManickaPJun 19, 2020

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.

Well, similarly looking test is here: https://github.com/dotnet/runtime/blob/master/src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.cs#L2667-L2677
But that's a shared test code which gets executed for WinHttpHandler as well.
Maybe it would be sufficient to just add to the existing test something like:

if (!IsWinHttpHandler)
{
Assert.Contains(expected, exception.Message);
}

Note that we have many such ifs in the shared test code, so this wouldn't be a revolutionary idea.

@antonfirsovantonfirsovJun 30, 2020

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Since I don't think it's worth to cover all the cases HttpClientHandlerTest covers, decided to keep the test in HttpClientTest. Added CreateHttpClient() usage.

@wfurtwfurt 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.

looks generally good to me. I left few comments.

}

[Fact]
[OuterLoop("Slow - Negative connection test")]

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.

why this would be slow if it connects to local host? that should fail quickly, right?

@antonfirsovantonfirsovJun 30, 2020

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

A failed connection attempt takes long on Windows. AFAIK this is because winsock will retry the connection up to 3 times even with localhost.

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.

how much delay do you see? The tests I was running were still pretty quick. I'm fine with leaving this outerloop.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Failing bare Socket connections attempts take almost 2 seconds usually. This test runs even longer for some reason (about 4 seconds on my PC).

Comment threadsrc/libraries/System.Net.Http/tests/FunctionalTests/HttpClientTest.cs Outdated
return CancellationHelper.ShouldWrapInOperationCanceledException(error, cancellationToken) ?
CancellationHelper.CreateOperationCanceledException(error, cancellationToken) :
new HttpRequestException(error.Message, error, RequestRetryType.RetryOnNextProxy);
new HttpRequestException($"{error.Message} {host}:{port}", error, RequestRetryType.RetryOnNextProxy);

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.

How this would look if host is IPv6 address? Do you know if it already comes in with the surrounding []?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yes, the brackets are being added here:

// TODO https://github.com/dotnet/runtime/issues/25782:
// Uri.IdnHost is missing '[', ']' characters around IPv6 address.
// So, we need to add them manually for now.
IdnHost=uri.HostNameType==UriHostNameType.IPv6?"["+uri.IdnHost+"]":uri.IdnHost;

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@wfurtwfurt 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.

LGTM

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

Opened #38945 for the unrelated test failure.

@antonfirsov
antonfirsov merged commit 80e954f into dotnet:masterJul 8, 2020
@ghostghost locked as resolved and limited conversation to collaborators Dec 8, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

SocketHttpHandler: exception is missing host/port text

5 participants

@antonfirsov@stephentoub@ManickaP@wfurt@Dotnet-GitSync-Bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

SocketHttpHandler: include host+IP information in HttpRequestException - #38131

Merged
antonfirsov merged 8 commits into
dotnet:masterfrom
antonfirsov:af/better-httpconnectexception
Jul 8, 2020
Merged

SocketHttpHandler: include host+IP information in HttpRequestException#38131
antonfirsov merged 8 commits into
dotnet:masterfrom
antonfirsov:af/better-httpconnectexception

Conversation

@antonfirsov

@antonfirsovantonfirsov commented Jun 19, 2020

Copy link
Copy Markdown
Contributor

Fix#1326 by appending host:port info to HttpRequestException's message when connection fails.

Didn't change the inner SocketException, since it would require subclassing SocketException, which would add unnecessary complexity here.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/ncl
Notify danmosemsft if you want to be subscribed.


[Fact]
[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This should likely belong to a SocketsHttpHandler test, but I'm new to HTTP codebase, and couldn't figure out where. Any suggestion?

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.

I think this is a good enough place for this test.

@antonfirsovantonfirsov added this to the 5.0.0 milestone Jun 19, 2020
@antonfirsov
antonfirsov requested a review from a teamJune 19, 2020 00:24

[Fact]
[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()

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.

I think this is a good enough place for this test.

[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()
{
using var client = new HttpClient(new SocketsHttpHandler());

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.

In tests, the HttpClient is usually created via CreateHttpClient(), e.g.: using HttpClient httpClient = CreateHttpClient();. Is there any reason here to create it directly?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Both questions depend on what we consider to be the SUT. I can't decide what is a good functional unit to test this feature against. HttpClient with default setup or SocketsHttpHandler?

I have no preference, want to go with existing practices.

@ManickaPManickaPJun 19, 2020

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.

Well, similarly looking test is here: https://github.com/dotnet/runtime/blob/master/src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.cs#L2667-L2677
But that's a shared test code which gets executed for WinHttpHandler as well.
Maybe it would be sufficient to just add to the existing test something like:

if (!IsWinHttpHandler)
{
Assert.Contains(expected, exception.Message);
}

Note that we have many such ifs in the shared test code, so this wouldn't be a revolutionary idea.

@antonfirsovantonfirsovJun 30, 2020

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Since I don't think it's worth to cover all the cases HttpClientHandlerTest covers, decided to keep the test in HttpClientTest. Added CreateHttpClient() usage.

@wfurtwfurt 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.

looks generally good to me. I left few comments.

}

[Fact]
[OuterLoop("Slow - Negative connection test")]

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.

why this would be slow if it connects to local host? that should fail quickly, right?

@antonfirsovantonfirsovJun 30, 2020

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

A failed connection attempt takes long on Windows. AFAIK this is because winsock will retry the connection up to 3 times even with localhost.

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.

how much delay do you see? The tests I was running were still pretty quick. I'm fine with leaving this outerloop.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Failing bare Socket connections attempts take almost 2 seconds usually. This test runs even longer for some reason (about 4 seconds on my PC).

Comment threadsrc/libraries/System.Net.Http/tests/FunctionalTests/HttpClientTest.cs Outdated
return CancellationHelper.ShouldWrapInOperationCanceledException(error, cancellationToken) ?
CancellationHelper.CreateOperationCanceledException(error, cancellationToken) :
new HttpRequestException(error.Message, error, RequestRetryType.RetryOnNextProxy);
new HttpRequestException($"{error.Message} {host}:{port}", error, RequestRetryType.RetryOnNextProxy);

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.

How this would look if host is IPv6 address? Do you know if it already comes in with the surrounding []?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yes, the brackets are being added here:

// TODO https://github.com/dotnet/runtime/issues/25782:
// Uri.IdnHost is missing '[', ']' characters around IPv6 address.
// So, we need to add them manually for now.
IdnHost=uri.HostNameType==UriHostNameType.IPv6?"["+uri.IdnHost+"]":uri.IdnHost;

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@wfurtwfurt 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.

LGTM

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

Opened #38945 for the unrelated test failure.

@antonfirsov
antonfirsov merged commit 80e954f into dotnet:masterJul 8, 2020
@ghostghost locked as resolved and limited conversation to collaborators Dec 8, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

SocketHttpHandler: exception is missing host/port text

5 participants

@antonfirsov@stephentoub@ManickaP@wfurt@Dotnet-GitSync-Bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

SocketHttpHandler: include host+IP information in HttpRequestException - #38131

Merged
antonfirsov merged 8 commits into
dotnet:masterfrom
antonfirsov:af/better-httpconnectexception
Jul 8, 2020
Merged

SocketHttpHandler: include host+IP information in HttpRequestException#38131
antonfirsov merged 8 commits into
dotnet:masterfrom
antonfirsov:af/better-httpconnectexception

Conversation

@antonfirsov

@antonfirsovantonfirsov commented Jun 19, 2020

Copy link
Copy Markdown
Contributor

Fix#1326 by appending host:port info to HttpRequestException's message when connection fails.

Didn't change the inner SocketException, since it would require subclassing SocketException, which would add unnecessary complexity here.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/ncl
Notify danmosemsft if you want to be subscribed.


[Fact]
[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This should likely belong to a SocketsHttpHandler test, but I'm new to HTTP codebase, and couldn't figure out where. Any suggestion?

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.

I think this is a good enough place for this test.

@antonfirsovantonfirsov added this to the 5.0.0 milestone Jun 19, 2020
@antonfirsov
antonfirsov requested a review from a teamJune 19, 2020 00:24

[Fact]
[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()

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.

I think this is a good enough place for this test.

[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()
{
using var client = new HttpClient(new SocketsHttpHandler());

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.

In tests, the HttpClient is usually created via CreateHttpClient(), e.g.: using HttpClient httpClient = CreateHttpClient();. Is there any reason here to create it directly?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Both questions depend on what we consider to be the SUT. I can't decide what is a good functional unit to test this feature against. HttpClient with default setup or SocketsHttpHandler?

I have no preference, want to go with existing practices.

@ManickaPManickaPJun 19, 2020

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.

Well, similarly looking test is here: https://github.com/dotnet/runtime/blob/master/src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.cs#L2667-L2677
But that's a shared test code which gets executed for WinHttpHandler as well.
Maybe it would be sufficient to just add to the existing test something like:

if (!IsWinHttpHandler)
{
Assert.Contains(expected, exception.Message);
}

Note that we have many such ifs in the shared test code, so this wouldn't be a revolutionary idea.

@antonfirsovantonfirsovJun 30, 2020

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Since I don't think it's worth to cover all the cases HttpClientHandlerTest covers, decided to keep the test in HttpClientTest. Added CreateHttpClient() usage.

@wfurtwfurt 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.

looks generally good to me. I left few comments.

}

[Fact]
[OuterLoop("Slow - Negative connection test")]

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.

why this would be slow if it connects to local host? that should fail quickly, right?

@antonfirsovantonfirsovJun 30, 2020

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

A failed connection attempt takes long on Windows. AFAIK this is because winsock will retry the connection up to 3 times even with localhost.

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.

how much delay do you see? The tests I was running were still pretty quick. I'm fine with leaving this outerloop.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Failing bare Socket connections attempts take almost 2 seconds usually. This test runs even longer for some reason (about 4 seconds on my PC).

Comment threadsrc/libraries/System.Net.Http/tests/FunctionalTests/HttpClientTest.cs Outdated
return CancellationHelper.ShouldWrapInOperationCanceledException(error, cancellationToken) ?
CancellationHelper.CreateOperationCanceledException(error, cancellationToken) :
new HttpRequestException(error.Message, error, RequestRetryType.RetryOnNextProxy);
new HttpRequestException($"{error.Message} {host}:{port}", error, RequestRetryType.RetryOnNextProxy);

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.

How this would look if host is IPv6 address? Do you know if it already comes in with the surrounding []?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yes, the brackets are being added here:

// TODO https://github.com/dotnet/runtime/issues/25782:
// Uri.IdnHost is missing '[', ']' characters around IPv6 address.
// So, we need to add them manually for now.
IdnHost=uri.HostNameType==UriHostNameType.IPv6?"["+uri.IdnHost+"]":uri.IdnHost;

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@wfurtwfurt 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.

LGTM

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

Opened #38945 for the unrelated test failure.

@antonfirsov
antonfirsov merged commit 80e954f into dotnet:masterJul 8, 2020
@ghostghost locked as resolved and limited conversation to collaborators Dec 8, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

SocketHttpHandler: exception is missing host/port text

5 participants

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

SocketHttpHandler: include host+IP information in HttpRequestException - #38131

Merged
antonfirsov merged 8 commits into
dotnet:masterfrom
antonfirsov:af/better-httpconnectexception
Jul 8, 2020
Merged

SocketHttpHandler: include host+IP information in HttpRequestException#38131
antonfirsov merged 8 commits into
dotnet:masterfrom
antonfirsov:af/better-httpconnectexception

Conversation

@antonfirsov

@antonfirsovantonfirsov commented Jun 19, 2020

Copy link
Copy Markdown
Contributor

Fix#1326 by appending host:port info to HttpRequestException's message when connection fails.

Didn't change the inner SocketException, since it would require subclassing SocketException, which would add unnecessary complexity here.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/ncl
Notify danmosemsft if you want to be subscribed.


[Fact]
[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This should likely belong to a SocketsHttpHandler test, but I'm new to HTTP codebase, and couldn't figure out where. Any suggestion?

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.

I think this is a good enough place for this test.

@antonfirsovantonfirsov added this to the 5.0.0 milestone Jun 19, 2020
@antonfirsov
antonfirsov requested a review from a teamJune 19, 2020 00:24

[Fact]
[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()

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.

I think this is a good enough place for this test.

[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()
{
using var client = new HttpClient(new SocketsHttpHandler());

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.

In tests, the HttpClient is usually created via CreateHttpClient(), e.g.: using HttpClient httpClient = CreateHttpClient();. Is there any reason here to create it directly?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Both questions depend on what we consider to be the SUT. I can't decide what is a good functional unit to test this feature against. HttpClient with default setup or SocketsHttpHandler?

I have no preference, want to go with existing practices.

@ManickaPManickaPJun 19, 2020

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.

Well, similarly looking test is here: https://github.com/dotnet/runtime/blob/master/src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.cs#L2667-L2677
But that's a shared test code which gets executed for WinHttpHandler as well.
Maybe it would be sufficient to just add to the existing test something like:

if (!IsWinHttpHandler)
{
Assert.Contains(expected, exception.Message);
}

Note that we have many such ifs in the shared test code, so this wouldn't be a revolutionary idea.

@antonfirsovantonfirsovJun 30, 2020

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Since I don't think it's worth to cover all the cases HttpClientHandlerTest covers, decided to keep the test in HttpClientTest. Added CreateHttpClient() usage.

@wfurtwfurt 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.

looks generally good to me. I left few comments.

}

[Fact]
[OuterLoop("Slow - Negative connection test")]

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.

why this would be slow if it connects to local host? that should fail quickly, right?

@antonfirsovantonfirsovJun 30, 2020

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

A failed connection attempt takes long on Windows. AFAIK this is because winsock will retry the connection up to 3 times even with localhost.

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.

how much delay do you see? The tests I was running were still pretty quick. I'm fine with leaving this outerloop.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Failing bare Socket connections attempts take almost 2 seconds usually. This test runs even longer for some reason (about 4 seconds on my PC).

Comment threadsrc/libraries/System.Net.Http/tests/FunctionalTests/HttpClientTest.cs Outdated
return CancellationHelper.ShouldWrapInOperationCanceledException(error, cancellationToken) ?
CancellationHelper.CreateOperationCanceledException(error, cancellationToken) :
new HttpRequestException(error.Message, error, RequestRetryType.RetryOnNextProxy);
new HttpRequestException($"{error.Message} {host}:{port}", error, RequestRetryType.RetryOnNextProxy);

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.

How this would look if host is IPv6 address? Do you know if it already comes in with the surrounding []?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yes, the brackets are being added here:

// TODO https://github.com/dotnet/runtime/issues/25782:
// Uri.IdnHost is missing '[', ']' characters around IPv6 address.
// So, we need to add them manually for now.
IdnHost=uri.HostNameType==UriHostNameType.IPv6?"["+uri.IdnHost+"]":uri.IdnHost;

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@wfurtwfurt 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.

LGTM

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

Opened #38945 for the unrelated test failure.

@antonfirsov
antonfirsov merged commit 80e954f into dotnet:masterJul 8, 2020
@ghostghost locked as resolved and limited conversation to collaborators Dec 8, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

SocketHttpHandler: exception is missing host/port text

5 participants

@antonfirsov@stephentoub@ManickaP@wfurt@Dotnet-GitSync-Bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

SocketHttpHandler: include host+IP information in HttpRequestException - #38131

Merged
antonfirsov merged 8 commits into
dotnet:masterfrom
antonfirsov:af/better-httpconnectexception
Jul 8, 2020
Merged

SocketHttpHandler: include host+IP information in HttpRequestException#38131
antonfirsov merged 8 commits into
dotnet:masterfrom
antonfirsov:af/better-httpconnectexception

Conversation

@antonfirsov

@antonfirsovantonfirsov commented Jun 19, 2020

Copy link
Copy Markdown
Contributor

Fix#1326 by appending host:port info to HttpRequestException's message when connection fails.

Didn't change the inner SocketException, since it would require subclassing SocketException, which would add unnecessary complexity here.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/ncl
Notify danmosemsft if you want to be subscribed.


[Fact]
[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This should likely belong to a SocketsHttpHandler test, but I'm new to HTTP codebase, and couldn't figure out where. Any suggestion?

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.

I think this is a good enough place for this test.

@antonfirsovantonfirsov added this to the 5.0.0 milestone Jun 19, 2020
@antonfirsov
antonfirsov requested a review from a teamJune 19, 2020 00:24

[Fact]
[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()

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.

I think this is a good enough place for this test.

[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()
{
using var client = new HttpClient(new SocketsHttpHandler());

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.

In tests, the HttpClient is usually created via CreateHttpClient(), e.g.: using HttpClient httpClient = CreateHttpClient();. Is there any reason here to create it directly?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Both questions depend on what we consider to be the SUT. I can't decide what is a good functional unit to test this feature against. HttpClient with default setup or SocketsHttpHandler?

I have no preference, want to go with existing practices.

@ManickaPManickaPJun 19, 2020

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.

Well, similarly looking test is here: https://github.com/dotnet/runtime/blob/master/src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.cs#L2667-L2677
But that's a shared test code which gets executed for WinHttpHandler as well.
Maybe it would be sufficient to just add to the existing test something like:

if (!IsWinHttpHandler)
{
Assert.Contains(expected, exception.Message);
}

Note that we have many such ifs in the shared test code, so this wouldn't be a revolutionary idea.

@antonfirsovantonfirsovJun 30, 2020

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Since I don't think it's worth to cover all the cases HttpClientHandlerTest covers, decided to keep the test in HttpClientTest. Added CreateHttpClient() usage.

@wfurtwfurt 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.

looks generally good to me. I left few comments.

}

[Fact]
[OuterLoop("Slow - Negative connection test")]

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.

why this would be slow if it connects to local host? that should fail quickly, right?

@antonfirsovantonfirsovJun 30, 2020

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

A failed connection attempt takes long on Windows. AFAIK this is because winsock will retry the connection up to 3 times even with localhost.

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.

how much delay do you see? The tests I was running were still pretty quick. I'm fine with leaving this outerloop.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Failing bare Socket connections attempts take almost 2 seconds usually. This test runs even longer for some reason (about 4 seconds on my PC).

Comment threadsrc/libraries/System.Net.Http/tests/FunctionalTests/HttpClientTest.cs Outdated
return CancellationHelper.ShouldWrapInOperationCanceledException(error, cancellationToken) ?
CancellationHelper.CreateOperationCanceledException(error, cancellationToken) :
new HttpRequestException(error.Message, error, RequestRetryType.RetryOnNextProxy);
new HttpRequestException($"{error.Message} {host}:{port}", error, RequestRetryType.RetryOnNextProxy);

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.

How this would look if host is IPv6 address? Do you know if it already comes in with the surrounding []?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yes, the brackets are being added here:

// TODO https://github.com/dotnet/runtime/issues/25782:
// Uri.IdnHost is missing '[', ']' characters around IPv6 address.
// So, we need to add them manually for now.
IdnHost=uri.HostNameType==UriHostNameType.IPv6?"["+uri.IdnHost+"]":uri.IdnHost;

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@wfurtwfurt 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.

LGTM

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

Opened #38945 for the unrelated test failure.

@antonfirsov
antonfirsov merged commit 80e954f into dotnet:masterJul 8, 2020
@ghostghost locked as resolved and limited conversation to collaborators Dec 8, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

SocketHttpHandler: exception is missing host/port text

5 participants

@antonfirsov@stephentoub@ManickaP@wfurt@Dotnet-GitSync-Bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

SocketHttpHandler: include host+IP information in HttpRequestException - #38131

Merged
antonfirsov merged 8 commits into
dotnet:masterfrom
antonfirsov:af/better-httpconnectexception
Jul 8, 2020
Merged

SocketHttpHandler: include host+IP information in HttpRequestException#38131
antonfirsov merged 8 commits into
dotnet:masterfrom
antonfirsov:af/better-httpconnectexception

Conversation

@antonfirsov

@antonfirsovantonfirsov commented Jun 19, 2020

Copy link
Copy Markdown
Contributor

Fix#1326 by appending host:port info to HttpRequestException's message when connection fails.

Didn't change the inner SocketException, since it would require subclassing SocketException, which would add unnecessary complexity here.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/ncl
Notify danmosemsft if you want to be subscribed.


[Fact]
[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This should likely belong to a SocketsHttpHandler test, but I'm new to HTTP codebase, and couldn't figure out where. Any suggestion?

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.

I think this is a good enough place for this test.

@antonfirsovantonfirsov added this to the 5.0.0 milestone Jun 19, 2020
@antonfirsov
antonfirsov requested a review from a teamJune 19, 2020 00:24

[Fact]
[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()

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.

I think this is a good enough place for this test.

[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()
{
using var client = new HttpClient(new SocketsHttpHandler());

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.

In tests, the HttpClient is usually created via CreateHttpClient(), e.g.: using HttpClient httpClient = CreateHttpClient();. Is there any reason here to create it directly?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Both questions depend on what we consider to be the SUT. I can't decide what is a good functional unit to test this feature against. HttpClient with default setup or SocketsHttpHandler?

I have no preference, want to go with existing practices.

@ManickaPManickaPJun 19, 2020

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.

Well, similarly looking test is here: https://github.com/dotnet/runtime/blob/master/src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.cs#L2667-L2677
But that's a shared test code which gets executed for WinHttpHandler as well.
Maybe it would be sufficient to just add to the existing test something like:

if (!IsWinHttpHandler)
{
Assert.Contains(expected, exception.Message);
}

Note that we have many such ifs in the shared test code, so this wouldn't be a revolutionary idea.

@antonfirsovantonfirsovJun 30, 2020

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Since I don't think it's worth to cover all the cases HttpClientHandlerTest covers, decided to keep the test in HttpClientTest. Added CreateHttpClient() usage.

@wfurtwfurt 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.

looks generally good to me. I left few comments.

}

[Fact]
[OuterLoop("Slow - Negative connection test")]

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.

why this would be slow if it connects to local host? that should fail quickly, right?

@antonfirsovantonfirsovJun 30, 2020

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

A failed connection attempt takes long on Windows. AFAIK this is because winsock will retry the connection up to 3 times even with localhost.

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.

how much delay do you see? The tests I was running were still pretty quick. I'm fine with leaving this outerloop.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Failing bare Socket connections attempts take almost 2 seconds usually. This test runs even longer for some reason (about 4 seconds on my PC).

Comment threadsrc/libraries/System.Net.Http/tests/FunctionalTests/HttpClientTest.cs Outdated
return CancellationHelper.ShouldWrapInOperationCanceledException(error, cancellationToken) ?
CancellationHelper.CreateOperationCanceledException(error, cancellationToken) :
new HttpRequestException(error.Message, error, RequestRetryType.RetryOnNextProxy);
new HttpRequestException($"{error.Message} {host}:{port}", error, RequestRetryType.RetryOnNextProxy);

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.

How this would look if host is IPv6 address? Do you know if it already comes in with the surrounding []?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yes, the brackets are being added here:

// TODO https://github.com/dotnet/runtime/issues/25782:
// Uri.IdnHost is missing '[', ']' characters around IPv6 address.
// So, we need to add them manually for now.
IdnHost=uri.HostNameType==UriHostNameType.IPv6?"["+uri.IdnHost+"]":uri.IdnHost;

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@wfurtwfurt 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.

LGTM

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

Opened #38945 for the unrelated test failure.

@antonfirsov
antonfirsov merged commit 80e954f into dotnet:masterJul 8, 2020
@ghostghost locked as resolved and limited conversation to collaborators Dec 8, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

SocketHttpHandler: exception is missing host/port text

5 participants

@antonfirsov@stephentoub@ManickaP@wfurt@Dotnet-GitSync-Bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

SocketHttpHandler: include host+IP information in HttpRequestException - #38131

Merged
antonfirsov merged 8 commits into
dotnet:masterfrom
antonfirsov:af/better-httpconnectexception
Jul 8, 2020
Merged

SocketHttpHandler: include host+IP information in HttpRequestException#38131
antonfirsov merged 8 commits into
dotnet:masterfrom
antonfirsov:af/better-httpconnectexception

Conversation

@antonfirsov

@antonfirsovantonfirsov commented Jun 19, 2020

Copy link
Copy Markdown
Contributor

Fix#1326 by appending host:port info to HttpRequestException's message when connection fails.

Didn't change the inner SocketException, since it would require subclassing SocketException, which would add unnecessary complexity here.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/ncl
Notify danmosemsft if you want to be subscribed.


[Fact]
[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This should likely belong to a SocketsHttpHandler test, but I'm new to HTTP codebase, and couldn't figure out where. Any suggestion?

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.

I think this is a good enough place for this test.

@antonfirsovantonfirsov added this to the 5.0.0 milestone Jun 19, 2020
@antonfirsov
antonfirsov requested a review from a teamJune 19, 2020 00:24

[Fact]
[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()

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.

I think this is a good enough place for this test.

[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()
{
using var client = new HttpClient(new SocketsHttpHandler());

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.

In tests, the HttpClient is usually created via CreateHttpClient(), e.g.: using HttpClient httpClient = CreateHttpClient();. Is there any reason here to create it directly?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Both questions depend on what we consider to be the SUT. I can't decide what is a good functional unit to test this feature against. HttpClient with default setup or SocketsHttpHandler?

I have no preference, want to go with existing practices.

@ManickaPManickaPJun 19, 2020

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.

Well, similarly looking test is here: https://github.com/dotnet/runtime/blob/master/src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.cs#L2667-L2677
But that's a shared test code which gets executed for WinHttpHandler as well.
Maybe it would be sufficient to just add to the existing test something like:

if (!IsWinHttpHandler)
{
Assert.Contains(expected, exception.Message);
}

Note that we have many such ifs in the shared test code, so this wouldn't be a revolutionary idea.

@antonfirsovantonfirsovJun 30, 2020

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Since I don't think it's worth to cover all the cases HttpClientHandlerTest covers, decided to keep the test in HttpClientTest. Added CreateHttpClient() usage.

@wfurtwfurt 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.

looks generally good to me. I left few comments.

}

[Fact]
[OuterLoop("Slow - Negative connection test")]

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.

why this would be slow if it connects to local host? that should fail quickly, right?

@antonfirsovantonfirsovJun 30, 2020

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

A failed connection attempt takes long on Windows. AFAIK this is because winsock will retry the connection up to 3 times even with localhost.

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.

how much delay do you see? The tests I was running were still pretty quick. I'm fine with leaving this outerloop.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Failing bare Socket connections attempts take almost 2 seconds usually. This test runs even longer for some reason (about 4 seconds on my PC).

Comment threadsrc/libraries/System.Net.Http/tests/FunctionalTests/HttpClientTest.cs Outdated
return CancellationHelper.ShouldWrapInOperationCanceledException(error, cancellationToken) ?
CancellationHelper.CreateOperationCanceledException(error, cancellationToken) :
new HttpRequestException(error.Message, error, RequestRetryType.RetryOnNextProxy);
new HttpRequestException($"{error.Message} {host}:{port}", error, RequestRetryType.RetryOnNextProxy);

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.

How this would look if host is IPv6 address? Do you know if it already comes in with the surrounding []?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yes, the brackets are being added here:

// TODO https://github.com/dotnet/runtime/issues/25782:
// Uri.IdnHost is missing '[', ']' characters around IPv6 address.
// So, we need to add them manually for now.
IdnHost=uri.HostNameType==UriHostNameType.IPv6?"["+uri.IdnHost+"]":uri.IdnHost;

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@wfurtwfurt 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.

LGTM

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

Opened #38945 for the unrelated test failure.

@antonfirsov
antonfirsov merged commit 80e954f into dotnet:masterJul 8, 2020
@ghostghost locked as resolved and limited conversation to collaborators Dec 8, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

SocketHttpHandler: exception is missing host/port text

5 participants

@antonfirsov@stephentoub@ManickaP@wfurt@Dotnet-GitSync-Bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

SocketHttpHandler: include host+IP information in HttpRequestException - #38131

Merged
antonfirsov merged 8 commits into
dotnet:masterfrom
antonfirsov:af/better-httpconnectexception
Jul 8, 2020
Merged

SocketHttpHandler: include host+IP information in HttpRequestException#38131
antonfirsov merged 8 commits into
dotnet:masterfrom
antonfirsov:af/better-httpconnectexception

Conversation

@antonfirsov

@antonfirsovantonfirsov commented Jun 19, 2020

Copy link
Copy Markdown
Contributor

Fix#1326 by appending host:port info to HttpRequestException's message when connection fails.

Didn't change the inner SocketException, since it would require subclassing SocketException, which would add unnecessary complexity here.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/ncl
Notify danmosemsft if you want to be subscribed.


[Fact]
[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This should likely belong to a SocketsHttpHandler test, but I'm new to HTTP codebase, and couldn't figure out where. Any suggestion?

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.

I think this is a good enough place for this test.

@antonfirsovantonfirsov added this to the 5.0.0 milestone Jun 19, 2020
@antonfirsov
antonfirsov requested a review from a teamJune 19, 2020 00:24

[Fact]
[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()

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.

I think this is a good enough place for this test.

[OuterLoop("Slow - Negative connection test")]
public async Task GetContentAsync_WhenCanNotConnect_ExceptionContainsHostInfo()
{
using var client = new HttpClient(new SocketsHttpHandler());

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.

In tests, the HttpClient is usually created via CreateHttpClient(), e.g.: using HttpClient httpClient = CreateHttpClient();. Is there any reason here to create it directly?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Both questions depend on what we consider to be the SUT. I can't decide what is a good functional unit to test this feature against. HttpClient with default setup or SocketsHttpHandler?

I have no preference, want to go with existing practices.

@ManickaPManickaPJun 19, 2020

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.

Well, similarly looking test is here: https://github.com/dotnet/runtime/blob/master/src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.cs#L2667-L2677
But that's a shared test code which gets executed for WinHttpHandler as well.
Maybe it would be sufficient to just add to the existing test something like:

if (!IsWinHttpHandler)
{
Assert.Contains(expected, exception.Message);
}

Note that we have many such ifs in the shared test code, so this wouldn't be a revolutionary idea.

@antonfirsovantonfirsovJun 30, 2020

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Since I don't think it's worth to cover all the cases HttpClientHandlerTest covers, decided to keep the test in HttpClientTest. Added CreateHttpClient() usage.

@wfurtwfurt 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.

looks generally good to me. I left few comments.

}

[Fact]
[OuterLoop("Slow - Negative connection test")]

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.

why this would be slow if it connects to local host? that should fail quickly, right?

@antonfirsovantonfirsovJun 30, 2020

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

A failed connection attempt takes long on Windows. AFAIK this is because winsock will retry the connection up to 3 times even with localhost.

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.

how much delay do you see? The tests I was running were still pretty quick. I'm fine with leaving this outerloop.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Failing bare Socket connections attempts take almost 2 seconds usually. This test runs even longer for some reason (about 4 seconds on my PC).

Comment threadsrc/libraries/System.Net.Http/tests/FunctionalTests/HttpClientTest.cs Outdated
return CancellationHelper.ShouldWrapInOperationCanceledException(error, cancellationToken) ?
CancellationHelper.CreateOperationCanceledException(error, cancellationToken) :
new HttpRequestException(error.Message, error, RequestRetryType.RetryOnNextProxy);
new HttpRequestException($"{error.Message} {host}:{port}", error, RequestRetryType.RetryOnNextProxy);

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.

How this would look if host is IPv6 address? Do you know if it already comes in with the surrounding []?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yes, the brackets are being added here:

// TODO https://github.com/dotnet/runtime/issues/25782:
// Uri.IdnHost is missing '[', ']' characters around IPv6 address.
// So, we need to add them manually for now.
IdnHost=uri.HostNameType==UriHostNameType.IPv6?"["+uri.IdnHost+"]":uri.IdnHost;

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@wfurtwfurt 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.

LGTM

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

Opened #38945 for the unrelated test failure.

@antonfirsov
antonfirsov merged commit 80e954f into dotnet:masterJul 8, 2020
@ghostghost locked as resolved and limited conversation to collaborators Dec 8, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

SocketHttpHandler: exception is missing host/port text

5 participants

@antonfirsov@stephentoub@ManickaP@wfurt@Dotnet-GitSync-Bot