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

Add support for compressed requests, such as GZIP or DEFLATE #426

Closed
ezarko opened this issue Feb 20, 2020 · 13 comments
Closed

Add support for compressed requests, such as GZIP or DEFLATE #426

ezarko opened this issue Feb 20, 2020 · 13 comments
Labels

Comments

@ezarko
Copy link

ezarko commented Feb 20, 2020

I did a quick search in the code and see an HttpClient with these settings, but I am assuming that is used by the proxy. Can the server itself handle an incoming request with has been GZIP'd?

@ezarko
Copy link
Author

ezarko commented Feb 25, 2020

So an issue which we were having was resolved when we stopped sending it GZIP'd, so I guess that is the answer. Can we add support for GZIP/Deflate to the server?

@ezarko ezarko changed the title Does the server support compressed requests, such as GZIP or DEFLATE? Add support for compressed requests, such as GZIP or DEFLATE Feb 25, 2020
@StefH
Copy link
Collaborator

StefH commented Feb 25, 2020

  1. HttpClient is only used for Proxying
  2. You can create a PR to support GZIP/Deflate ? (I'm not sure if this functionality is out-of-the box for Owin/Kestrel and net452 / net46 / net core). Or that some helper code is needed like https://github.com/mikegore1000/SqueezeMe

@StefH StefH added the feature label Feb 25, 2020
@ezarko
Copy link
Author

ezarko commented Feb 25, 2020

I took a swing at it and created #430. I decided to let CI build it for me. Let's see what we get.

@ezarko
Copy link
Author

ezarko commented Mar 12, 2020

So I tried this in #430 ... The issue that I ran into has to do with framework version compatibility. I have the more or less correct approach, but it needs a little dedicated hand holding.

@StefH
Copy link
Collaborator

StefH commented Mar 13, 2020

I think it's easier to just view the Content-Encoding header and decide to automatically decompress this bytes in the BodyParser.cs file.

I'll take a look.

@StefH
Copy link
Collaborator

StefH commented Mar 14, 2020

@ezarko Can you try preview version on MyGet : WireMock.Net.1.1.10-ci-12887 ? This version should support gzip and deflate in the request

@StefH
Copy link
Collaborator

StefH commented Mar 19, 2020

@ezarko Did you have time to test this new version?
See https://github.com/WireMock-Net/WireMock.Net/wiki/MyGet-preview-versions

@StefH
Copy link
Collaborator

StefH commented Mar 25, 2020

@ezarko Can you please test if this works for you?

1 similar comment
@StefH
Copy link
Collaborator

StefH commented Apr 1, 2020

@ezarko Can you please test if this works for you?

@StefH
Copy link
Collaborator

StefH commented Apr 8, 2020

Hello @ezarko , did you have time yet to test this ?

@ezarko
Copy link
Author

ezarko commented Apr 10, 2020

@StefH sorry for taking so long to get back to you. If you can provide a Docker image, or give me instructions on how to build one myself using the preview version, I can get this tested next week.

Alternatively I can see about creating a test for it, if that helps. It should be as simple as:

echo ‘{“foo”:”bar”}’ | gzip -c | curl -H’Content-Type: application/json’ -H’Content-Encoding: Gzip’ --data-binary @-

Or you could prepare a gzip-ed file and put it in a test class as an array of bytes or whatever.

@StefH
Copy link
Collaborator

StefH commented Apr 10, 2020

I've already build a test like this:

[Theory]
        [InlineData("gzip")]
        [InlineData("deflate")]
        public async Task WireMockServer_Should_SupportRequestGZipAndDeflate(string contentEncoding)
        {
            // Arrange
            const string body = "hello wiremock";
            byte[] compressed = CompressionUtils.Compress(contentEncoding, Encoding.UTF8.GetBytes(body));

            var server = WireMockServer.Start();
            server.Given(
                Request.Create()
                    .WithPath("/foo")
                    .WithBody("hello wiremock")
            )
            .RespondWith(
                Response.Create().WithBody("OK")
            );

            var content = new StreamContent(new MemoryStream(compressed));
            content.Headers.ContentType = new MediaTypeHeaderValue("text/plain");
            content.Headers.ContentEncoding.Add(contentEncoding);

            // Act
            var response = await new HttpClient().PostAsync($"{server.Urls[0]}/foo", content);

            // Assert
            Check.That(await response.Content.ReadAsStringAsync()).Contains("OK");
        }

So I think we are good to go.

I will merge the PR and create a new Docker image this weekend and close this PR.

Just test it when you have time, and if you still find an problem, just create an issue.

@StefH
Copy link
Collaborator

StefH commented Apr 10, 2020

#439

@StefH StefH closed this as completed Apr 10, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants