Skip to content

Instantly share code, notes, and snippets.

@bademux
Last active July 3, 2019 11:22
Show Gist options
  • Save bademux/b2eb7e930207a521aa210d1ebcff21e0 to your computer and use it in GitHub Desktop.
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
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