Add request validation against xsd
Change-Id: Iadf618e50d01dd92bf9eed5b8ed98138b56c20c9
This commit is contained in:
parent
aabc9d75f2
commit
9a14f9bfab
10 changed files with 205 additions and 10 deletions
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue