package com.philemonworks.critter.rule;
import com.philemonworks.critter.HttpClient;
import com.philemonworks.critter.dao.RecordingDao;
import com.philemonworks.critter.proto.DefinitionsPerRule;
import com.sun.jersey.api.core.HttpContext;
import org.apache.http.client.methods.HttpRequestBase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.ws.rs.core.Response;
import java.net.URI;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class RuleContext implements ScriptContext {
private static final Logger LOG = LoggerFactory.getLogger(ScriptContext.class);
public Rule rule;
public HttpContext httpContext;
public HttpClient httpClient;
public URI forwardURI;
public HttpRequestBase forwardMethod;
public Response forwardResponse;
public Response proxyResponse;
// this caches the request entity stream contents
public byte[] requestEntityContent;
// for access by ProtobufPath
public DefinitionsPerRule protoDefinitions;
// for Record action
public Date requestReceivedDate = new Date();
public RecordingDao recordingDao;
public Map<String, String> parameters = new HashMap<String, String>();
@Override
public URI getUri() {
return forwardURI;
}
@Override
public String getMethod() {
if (httpContext.getRequest() == null) {
LOG.error("No request available, return <empty> HTTP method");
return "";
}
return httpContext.getRequest().getMethod();
}
@Override
public String getParameter(String name) {
return parameters.get(name);
}
@Override
public void setResponseBody(int status, String content) {
if (forwardResponse != null) {
forwardResponse = Response.fromResponse(forwardResponse).entity(content).build();
} else {
forwardResponse = Response.status(status).entity(content).build();
}
}
@Override
public String getHeader(String name) {
if (httpContext.getRequest() == null) {
LOG.error("No request available, return <empty> header value");
return "";
}
return httpContext.getRequest().getHeaderValue(name);
}
@Override
public void log(String what) {
LOG.debug(what);
}
public byte[] getRequestEntityContent() {
if (null == requestEntityContent) {
this.requestEntityContent = this.httpContext.getRequest().getEntity(byte[].class);
}
return this.requestEntityContent;
}
}