Last active
July 3, 2019 11:22
-
-
Save bademux/b2eb7e930207a521aa210d1ebcff21e0 to your computer and use it in GitHub Desktop.
Wiremock's request transformer, helps alter original request. Can be used to fix SOAP Headers passed as part of HTTP body
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import com.github.tomakehurst.wiremock.core.Options | |
import com.github.tomakehurst.wiremock.http.* | |
import com.github.tomakehurst.wiremock.jetty9.JettyHttpServerFactory | |
import java.nio.charset.Charset | |
import java.util.function.UnaryOperator | |
import static com.github.tomakehurst.wiremock.common.Encoding.encodeBase64 | |
import static com.github.tomakehurst.wiremock.common.Strings.stringFromBytes | |
import static java.nio.charset.StandardCharsets.UTF_8 | |
/** | |
* How to use | |
* wireMockConfig().httpServerFactory(createJettyHttpServerFactory({ | |
* new RequestTransformer.MutableBodyRequestDelegate(it, { //fix 'To' and 'MessageId' soap header | |
* new String(it) | |
* .replaceFirst(wireMockGus.url(''), SERVER_URL_GUS) | |
* .replaceFirst('(?<=>uuid:)(.*?)(?=</)', '00000000-0000-0000-0000-000000000000') | |
* .bytes | |
* }) | |
* })) | |
*/ | |
class RequestTransformer { | |
static HttpServerFactory createJettyHttpServerFactory(UnaryOperator<Request> transformer) { | |
return new JettyHttpServerFactory() { | |
@Override | |
HttpServer buildHttpServer(Options options, AdminRequestHandler adminRequestHandler, StubRequestHandler handler) { | |
return super.buildHttpServer(options, adminRequestHandler, new RequestHandlerDelegate(handler, transformer)) | |
} | |
} | |
} | |
static class MutableBodyRequestDelegate implements Request { | |
@Delegate | |
private final Request request | |
private final UnaryOperator<byte[]> bodyTransformer | |
MutableBodyRequestDelegate(Request request, UnaryOperator<byte[]> bodyTransformer) { | |
this.request = request | |
this.bodyTransformer = bodyTransformer | |
} | |
@Override | |
byte[] getBody() { | |
return bodyTransformer.apply(request.getBody()) | |
} | |
@Override | |
String getBodyAsString() { | |
return stringFromBytes(getBody(), encodingFromContentTypeHeaderOrUtf8()) | |
} | |
@Override | |
String getBodyAsBase64() { | |
return encodeBase64(getBody()) | |
} | |
private Charset encodingFromContentTypeHeaderOrUtf8() { | |
ContentTypeHeader contentTypeHeader = contentTypeHeader() | |
if (contentTypeHeader != null) { | |
return contentTypeHeader.charset() | |
} | |
return UTF_8 | |
} | |
} | |
private static class RequestHandlerDelegate extends StubRequestHandler { | |
@Delegate | |
private final StubRequestHandler stubRequestHandler | |
private final UnaryOperator<Request> requestTransformer | |
RequestHandlerDelegate(StubRequestHandler stubRequestHandler, UnaryOperator<Request> requestTransformer) { | |
super(null, null, null, null, null) | |
this.stubRequestHandler = stubRequestHandler | |
this.requestTransformer = requestTransformer | |
} | |
@Override | |
void handle(Request request, HttpResponder httpResponder) { | |
stubRequestHandler.handle(requestTransformer.apply(request), httpResponder) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment