thrift-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Lewis Jackson (Jira)" <j...@apache.org>
Subject [jira] [Created] (THRIFT-5239) THttpTransport should support passing in an HttpClient
Date Thu, 25 Jun 2020 10:54:00 GMT
Lewis Jackson created THRIFT-5239:
-------------------------------------

             Summary: THttpTransport should support passing in an HttpClient
                 Key: THRIFT-5239
                 URL: https://issues.apache.org/jira/browse/THRIFT-5239
             Project: Thrift
          Issue Type: Bug
          Components: netstd - Library
            Reporter: Lewis Jackson


This issue is very similar to the Java one documented here: https://issues.apache.org/jira/browse/THRIFT-970

.NET Core supports using an _[IHttpClientFactory|https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.1]_
to request instances of HttpClient. This factory will pool clients to avoid exhausting sockets
in the OS. Microsoft currently do not recommend creating a new _HttpClient_ per request, consumers
currently have to find a way to pool Thrift clients in order to conform to this practice.

The line which instantiates a new _HttpClient_ can be found [here|https://github.com/apache/thrift/blob/283410126ccb3ac4990045e07cccb5df11ee2a16/lib/netstd/Thrift/Transport/Client/THttpTransport.cs#L141].

This proposal would require a new constructor which allowed an instance of _HttpClient_ to
be passed in. The consumer could use this constructor like this:

{code:c#}
var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
var httpClient = httpClientFactory.CreateClient("thrift");
var transport = new THttpTransport(httpClient);
{code}

After registering their own named _IHttpClientFactory_ in the _ServiceCollection_:

{code:c#}
var certificates = GetCertificates();

services.AddHttpClient("thrift", c =>
{
    c.BaseAddress = new Uri("https://foo.bar/Service.thrift");

    c.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-thrift"));
    c.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));
    c.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));

    c.DefaultRequestHeaders.Add("CUSTOM-HEADER", "HEADER-VALUE");
})
  .ConfigurePrimaryHttpMessageHandler(() =>
  {
      var handler = new HttpClientHandler()
      {
          AutomaticDecompression = System.Net.DecompressionMethods.Deflate | System.Net.DecompressionMethods.GZip
      };
      handler.ClientCertificates.AddRange(certificates);
      return handler;
  });
{code}

Rather than relying on users to properly configure request headers and decompression methods
themselves, an extension method to _ServiceCollection_ could be defined:

{code:c#}
services.AddThriftHttpClient("thrift", uri, customRequestHeaders, userAgent, certificates);
{code}

This would more closely match the current constructor of _THttpTransport_.

We've forked the _THttpTransport _ file to support this behaviour for internal purposes, so
I could put up a sample PR if requested.




--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Mime
View raw message