Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Treblle reporting a score of 0 for HTTP2/3 support #8

Open
PTAdvanced opened this issue Feb 9, 2024 · 3 comments
Open

Treblle reporting a score of 0 for HTTP2/3 support #8

PTAdvanced opened this issue Feb 9, 2024 · 3 comments

Comments

@PTAdvanced
Copy link
Contributor

PTAdvanced commented Feb 9, 2024

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.

@cindreta
Copy link
Member

cindreta commented Feb 9, 2024

Hey @PTAdvanced these are amazing insights. It's interesting that the two of them are getting such different results. I think a PR might make sense. Any wisdom on why this is different @m-jovanovic

I'll also take a look at the logs to see if i can do something from a back-end perspective.

@PTAdvanced
Copy link
Contributor Author

Hey @cindreta

Are you able to provide any information on how Treblle determines if a request was HTTP/2 or HTTP/3? Is Treblle using the value in the payload,

payload.Data.Server.Protocol

And is it expecting the values to be:

HTTP/1.1
or
HTTP/2
or
HTTP/3

If so, I will put a pull request together utilising the httpContext.Request.Protocol and ensure that the correct values are passed through.

Thanks

@WaveRider95
Copy link
Collaborator

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.

Hi @PTAdvanced ,
Great insights!
The main difference between httpContext.Request.Protocol and httpContext.GetServerVariable("SERVER_PROTOCOL") is that the first one is more up-to-date way used in .net core and the latter is a kind of legacy way used in .net framework for IIS-hosted applications.
I have created and merged a PR with an updated way of fetching a few of those variables in AddServer() method.

Someone who has worked on Dashboard is better suited to answer what values will Treble accept. I would start with checking if the value check is case-sensitive.

Best regards

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants