http-mock-server/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy
2014-12-13 19:49:40 +01:00

63 lines
2.1 KiB
Groovy

package pl.touk.mockserver.server
import com.sun.net.httpserver.HttpExchange
import groovy.transform.PackageScope
import java.util.concurrent.CopyOnWriteArrayList
@PackageScope
class ContextExecutor {
private final HttpServerWraper httpServerWraper
final String path
private final List<Mock> mocks
ContextExecutor(HttpServerWraper httpServerWraper, Mock initialMock) {
this.httpServerWraper = httpServerWraper
this.path = initialMock.path
this.mocks = new CopyOnWriteArrayList<>([initialMock])
httpServerWraper.createContext(path, {
HttpExchange ex ->
MockRequest request = new MockRequest(ex.requestBody.text, ex.requestHeaders, ex.requestURI.query)
println "Mock received input"
for (Mock mock : mocks) {
try {
if (mock.match(ex.requestMethod, request)) {
MockResponse httpResponse = mock.apply(request)
fillExchange(ex, httpResponse)
return
}
} catch (Exception e) {
e.printStackTrace()
}
}
ex.sendResponseHeaders(404, 0)
ex.responseBody << request.text
ex.responseBody.close()
})
}
private static void fillExchange(HttpExchange httpExchange, MockResponse response) {
response.headers.each {
httpExchange.responseHeaders.add(it.key, it.value)
}
String responseText = response.response
httpExchange.sendResponseHeaders(response.statusCode, responseText ? responseText.length() : -1)
if (responseText) {
httpExchange.responseBody << responseText
httpExchange.responseBody.close()
}
}
int removeMock(String name) {
Mock mock = mocks.find { it.name == name }
if (mock) {
mocks.remove(mock)
return mock.counter
}
return 0
}
void addMock(Mock mock) {
mocks << mock
}
}