Add request validation against xsd

Change-Id: Iadf618e50d01dd92bf9eed5b8ed98138b56c20c9
This commit is contained in:
Dominik Adam Przybysz 2015-10-24 13:46:52 +02:00
parent aabc9d75f2
commit 9a14f9bfab
10 changed files with 205 additions and 10 deletions

View file

@ -64,7 +64,8 @@ class HttpMockServer {
responseHeaders: it.responseHeadersClosureText,
soap: it.soap,
method: it.method,
statusCode: it.statusCode as int
statusCode: it.statusCode as int,
schema: it.schema
)
}
)
@ -95,6 +96,7 @@ class HttpMockServer {
mock.statusCode = request.statusCode
mock.method = request.method
mock.responseHeaders = request.responseHeaders
mock.schema = request.schema
return mock
}
@ -135,12 +137,12 @@ class HttpMockServer {
queryParams: new MockRequestReport.QueryParams(queryParams: it.request.query.collect {
new Parameter(name: it.key, value: it.value)
}),
path: new MockRequestReport.Path(pathParts: it.request.path)
path: new MockRequestReport.Path(pathParts: it.request.path)
),
response: new MockResponseReport(
statusCode: it.response.statusCode,
text: it.response.text,
headers: new MockResponseReport.Headers(headers: it.response.headers.collect {
headers: new MockResponseReport.Headers(headers: it.response.headers.collect {
new Parameter(name: it.key, value: it.value)
})
)
@ -162,6 +164,7 @@ class HttpMockServer {
}
private static void createErrorResponse(HttpExchange ex, Exception e) {
log.warn('Exception occured', e)
createResponse(ex, new ExceptionOccured(value: e.message), 400)
}

View file

@ -5,6 +5,10 @@ import groovy.transform.PackageScope
import groovy.util.logging.Slf4j
import pl.touk.mockserver.api.common.Method
import javax.xml.XMLConstants
import javax.xml.transform.stream.StreamSource
import javax.xml.validation.SchemaFactory
import javax.xml.validation.Validator
import java.util.concurrent.CopyOnWriteArrayList
@PackageScope
@ -25,6 +29,8 @@ class Mock implements Comparable<Mock> {
Method method = Method.POST
int counter = 0
final List<MockEvent> history = new CopyOnWriteArrayList<>()
String schema
private Validator validator
Mock(String name, String path, int port) {
if (!(name)) {
@ -41,6 +47,20 @@ class Mock implements Comparable<Mock> {
MockResponse apply(MockRequest request) {
log.debug("Mock $name invoked")
if (validator) {
try {
log.debug('Validating...')
if (soap) {
validator.validate(new StreamSource(new StringReader(request.textWithoutSoap)))
} else {
validator.validate(new StreamSource(new StringReader(request.text)))
}
} catch (Exception e) {
MockResponse response = new MockResponse(400, e.message, [:])
history << new MockEvent(request, response)
return response
}
}
++counter
String responseText = response(request)
String response = soap ? wrapSoap(responseText) : responseText
@ -106,4 +126,17 @@ class Mock implements Comparable<Mock> {
int compareTo(Mock o) {
return name.compareTo(o.name)
}
void setSchema(String schema) {
this.schema = schema
if (schema) {
try {
validator = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
.newSchema(new File(this.class.getResource("/$schema").path))
.newValidator()
} catch (Exception e) {
throw new RuntimeException('mock request schema is invalid schema', e)
}
}
}
}

View file

@ -4,6 +4,7 @@ import com.sun.net.httpserver.Headers
import groovy.json.JsonSlurper
import groovy.transform.PackageScope
import groovy.util.slurpersupport.GPathResult
import groovy.xml.XmlUtil
@PackageScope
class MockRequest {
@ -69,4 +70,7 @@ class MockRequest {
} as Map<String, String>
}
String getTextWithoutSoap() {
return XmlUtil.serialize(soap)
}
}