Warm tip: This article is reproduced from serverfault.com, please click

Wiremock proxying to different Url like Apache ProxyPass

发布于 2021-02-19 22:13:40

I am trying to achieve something very simple:

Proxy a request to

mock.com/foo?paramA=valueA&paramB=valueB

to

backend.com/bar?paramA=valueA&paramB=valueB

And I would like to do this with a json config.

The problem is that proxyBaseUrl always takes the FULL Url from the input and appends it, so

{
    "request": {
        "method": "GET",
        "urlPattern": "/foo/.*"
    },
    "response": {
        "proxyBaseUrl": "http://backend.com/bar"
    }
}

I get a request to http://backend.com/bar/foo?paramA=valueA&paramB=valueB which is obviously not what I need.

I need some way to grab part of the request url with a capture group, e.g.

"urlPattern": "/foo/(.*)"

and then a way to insert the captured group - and only that - into the target url path.

How can this be done, with a JSON config?

I have checked the wiremock documentation and browsed a dozen discussions but it's still not clear to me.

These two postings had the same question and did not receive any answers:

https://groups.google.com/g/wiremock-user/c/UPO2vw4Jmhw/m/Rx0e8FtZBQAJ

https://groups.google.com/g/wiremock-user/c/EVw1qK7k8Fo/m/5iYg1SQEBAAJ

So I am wondering if this is at all possible in wiremock? (in Apache it's a 2-liner)

Questioner
Deeepdigger
Viewed
0
agoff 2021-02-22 22:08:45

As far as I know, proxying isn't configurable in this way. Looking at the documentation, WireMock will only proxy the same request via the proxyBaseUrl.

Unfortunately, it looks like your best bet is going to be to write a custom response transformer that does this redirect for you. I don't think the request/response objects given in the transformer class will handle redirection on their own, so you will probably need to set up your own client to forward the requests.

Psuedo code like:

class MyCustomTransformer extends ResponseTransformer {
    public String getName() {
         return "MyCustomTransformer";
    }

    @Override
    public Response transform(Request request, Response response, FileSource files, Parameters parameters) {
        Pattern pattern = Pattern.compile("/regex/url/to/match/");
        Matcher matcher = pattern.matcher(request.getUrl());

        if (matcher.matches()) {
            // Code to modify request and send via your own client
            // For the example, you've saved the returned response as `responseBody`
            return Response.Builder.like(response).but().body(responseBody.toJSONString()).build();
        } else {
            return response
        }
    }

}