use of com.predic8.membrane.core.http.Body in project service-proxy by membrane.
the class IndexInterceptor method handleRequest.
@Override
public Outcome handleRequest(final Exchange exc) throws Exception {
StringWriter sw = new StringWriter();
new Html(sw) {
{
html();
head();
title().text(Constants.PRODUCT_NAME + ": Service Proxies").end();
style();
raw("<!--\r\n" + "body { font-family: sans-serif; }\r\n" + "h1 { font-size: 24pt; }\r\n" + "td, th { border: 1px solid black; padding: 0pt 10pt; }\r\n" + "table { border-collapse: collapse; }\r\n" + ".help { margin-top:20pt; color:#AAAAAA; padding:1em 0em 0em 0em; font-size:10pt; }\r\n" + ".footer { color:#AAAAAA; padding:0em 0em; font-size:10pt; }\r\n" + ".footer a { color:#AAAAAA; }\r\n" + ".footer a:hover { color:#000000; }\r\n" + "-->");
end();
end();
body();
h1().text("Service Proxies").end();
List<ServiceInfo> services = getServices(exc);
if (services.isEmpty())
p().text("There are no services defined.").end();
else
createIndexTable(services, exc.getHandler() instanceof HttpServerHandler);
p().classAttr("help").text("The hyperlinks might not work due to semantics which is not known to " + Constants.PRODUCT_NAME + ".").end();
p().classAttr("footer").raw(Constants.HTML_FOOTER).end();
end();
end();
}
private void createIndexTable(List<ServiceInfo> services, boolean showSSL) {
table().cellspacing("0").cellpadding("0").border("" + 1);
tr();
th().text("Name").end();
th().text("Virtual Host").end();
th().text("Port").end();
th().text("Path").end();
if (showSSL)
th().text("SSL").end();
end();
for (ServiceInfo ri : services) {
tr();
td();
if (ri.url != null && !"POST".equals(ri.method)) {
a().href(ri.url);
text(ri.name);
end();
} else {
text(ri.name);
}
end();
td().raw(ri.host).end();
td().raw(ri.port).end();
td().raw(ri.path).end();
if (showSSL)
td().raw(ri.ssl ? "yes" : "").end();
end();
}
end();
}
};
exc.setResponse(Response.ok(sw.toString()).build());
return Outcome.RETURN;
}
use of com.predic8.membrane.core.http.Body in project service-proxy by membrane.
the class LimitInterceptor method handleMessage.
private Outcome handleMessage(Exchange exc, Message msg) throws IOException {
if (maxBodyLength == -1)
return Outcome.CONTINUE;
long len = msg.getHeader().getContentLength();
if (len != -1 && len > maxBodyLength) {
log.info("Message length (" + len + ") exceeded limit (" + maxBodyLength + ")");
exc.setResponse(createFailureResponse());
return Outcome.ABORT;
}
msg.setBody(new Body(new LengthLimitingStream(msg.getBodyAsStream())));
return Outcome.CONTINUE;
}
use of com.predic8.membrane.core.http.Body in project service-proxy by membrane.
the class LimitedMemoryExchangeStore method addObservers.
private void addObservers(AbstractExchange exc, AbstractExchange excCopy, Flow flow) throws Exception {
Message msg = null;
if (flow == Flow.REQUEST) {
msg = exc.getRequest();
} else
msg = exc.getResponse();
msg.addObserver(new MessageObserver() {
@Override
public void bodyRequested(AbstractBody body) {
}
@Override
public void bodyComplete(AbstractBody body) {
try {
cleanSnapshot(Exchange.updateCopy(exc, excCopy));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
exc.addExchangeViewerListener(new AbstractExchangeViewerListener() {
@Override
public void setExchangeFinished() {
try {
cleanSnapshot(Exchange.updateCopy(exc, excCopy));
} catch (Exception e) {
e.printStackTrace();
}
}
});
cleanSnapshot(Exchange.updateCopy(exc, excCopy));
}
use of com.predic8.membrane.core.http.Body in project service-proxy by membrane.
the class AMQuotaInterceptorTest method testAMQuota.
@Test
public void testAMQuota() throws IOException, InterruptedException {
final Exchange exc = new Exchange(null);
exc.setRequest(new Request.Builder().header("Test", "test").body("hello").build());
exc.setResponse(new Response.ResponseBuilder().header("Test2", "test2").body("Hello back!").build());
exc.setProperty(Exchange.API_KEY, "junit");
exc.setRule(new ServiceProxy());
exc.getRule().setName("junit API");
ApiManagementConfiguration amc = new ApiManagementConfiguration(System.getProperty("user.dir"), "src\\test\\resources\\apimanagement\\api.yaml");
long reqSize = exc.getRequest().getHeader().toString().getBytes().length + exc.getRequest().getHeader().getContentLength();
long respSize = exc.getResponse().getHeader().toString().getBytes().length + exc.getResponse().getHeader().getContentLength();
assertEquals(31 + 5, reqSize);
assertEquals(34 + 11, respSize);
final AMQuota amq = new AMQuota();
amq.setAmc(amc);
ArrayList<Thread> threads = new ArrayList<Thread>();
final AtomicInteger continues = new AtomicInteger();
final AtomicInteger returns = new AtomicInteger();
for (int i = 0; i < 1000; i++) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
Outcome out = amq.handleRequest(exc);
if (out == Outcome.CONTINUE) {
continues.incrementAndGet();
} else if (out == Outcome.RETURN) {
returns.incrementAndGet();
}
amq.handleResponse(exc);
} catch (Exception e) {
e.printStackTrace();
}
}
});
threads.add(t);
// t.start();
// doing sync because else we cant predictably count request/response pairs
t.run();
}
for (Thread t : threads) {
t.join();
}
// the limit is ( or should be ) 120B
// 31+5 ( Req ) + 34+11 ( Resp ) = 81 for every completed exchange
// the second request adds another 31+5 -> 81 + 36 = 117 < 120B -> after the second request it should block because the limit is 120b and the following response would bring it over the limit ( responses never block, only requests )
assertEquals(2, continues.get());
assertEquals(998, returns.get());
Thread.sleep(2000);
assertEquals(Outcome.CONTINUE, amq.handleRequest(exc));
}
use of com.predic8.membrane.core.http.Body in project service-proxy by membrane.
the class AMStatisticsCollectorTest method testThreadedStatisticCollection.
@Test
public void testThreadedStatisticCollection() throws InterruptedException {
final AMStatisticsCollector amSc = new AMStatisticsCollector();
amSc.setCollectTimeInSeconds(2);
ArrayList<Thread> threads = new ArrayList<Thread>();
for (int i = 0; i < 1000; i++) {
final int j = i;
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
Exchange exc = new Exchange(null);
exc.setRequest(new Request.Builder().header("Test", "Test").body("Hello").build());
exc.setResponse(new Response.ResponseBuilder().header("Test", "Test").body("Hello back").build());
exc.setProperty(Exchange.API_KEY, "junit-" + j);
exc.setRule(new ServiceProxy());
exc.getRule().setName("junit API");
for (int k = 0; k < 10; k++) {
amSc.addExchangeToQueue(exc);
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
threads.add(t);
t.start();
}
for (Thread t : threads) {
t.join();
}
Thread.sleep(amSc.getCollectTimeInSeconds() * 1000 * 2);
amSc.shutdown();
}
Aggregations