Hi There
I noticed that Treblle is reporting a zero score for HTTP2/3 support for my API. My service is configured for HTTP/2 support, and I can see in Chrome Dev Tools that the protocol used is H2 when calling my API.
Digging into the code for the Payload Factory I can see this
private static void AddServer(HttpContext httpContext, TrebllePayload payload)
{
payload.Data.Server.Ip = httpContext.GetServerVariable("LOCAL_ADDR");
payload.Data.Server.Timezone = (!string.IsNullOrEmpty(TimeZoneInfo.Local.StandardName))
? TimeZoneInfo.Local.StandardName
: "UTC";
payload.Data.Server.Software = httpContext.GetServerVariable("SERVER_SOFTWARE");
payload.Data.Server.Signature = null;
payload.Data.Server.Protocol = httpContext.GetServerVariable("SERVER_PROTOCOL");
payload.Data.Server.Os.Name = Environment.OSVersion.ToString();
payload.Data.Server.Os.Release = Environment.OSVersion.Version.ToString();
payload.Data.Server.Os.Architecture = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
}
If I change the protocol line to
private static void AddServer(HttpContext httpContext, TrebllePayload payload)
{
payload.Data.Server.Ip = httpContext.GetServerVariable("LOCAL_ADDR");
payload.Data.Server.Timezone = (!string.IsNullOrEmpty(TimeZoneInfo.Local.StandardName))
? TimeZoneInfo.Local.StandardName
: "UTC";
payload.Data.Server.Software = httpContext.GetServerVariable("SERVER_SOFTWARE");
payload.Data.Server.Signature = null;
payload.Data.Server.Protocol = httpContext.Request.Protocol;
payload.Data.Server.Os.Name = Environment.OSVersion.ToString();
payload.Data.Server.Os.Release = Environment.OSVersion.Version.ToString();
payload.Data.Server.Os.Architecture = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
}
httpContext.Request.Protocol
returns a value of HTTP/2 whereas httpContext.GetServerVariable("SERVER_PROTOCOL")
returns a value of HTTP/1.1
I've tried researching why the two methods return different values, but cannot find an answer.
I would be happy to submit a pull-request with this change, but I wondered if you know why the 2 methods differ, and whether we can rely on the httpContext.Request.Protocol
property to get the true HTTP protocol version?
Secondary to this, when I have tested locally using httpContext.Request.Protocol
and sending Treblle the value HTTP/2, Treblle is still giving my API a score of 0 for HTTP2/3 support. What are the values that treblle will accept? I reviewed the SDKs for the Ruby and .NET integrations, and they are both using the SERVER_PROTOCOL server variable, which would return HTTP/2 I believe when HTTP/2 is being used.