Search in sources :

Example 46 with Body

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;
}
Also used : StringWriter(java.io.StringWriter) Html(com.googlecode.jatl.Html) ArrayList(java.util.ArrayList) List(java.util.List) HttpServerHandler(com.predic8.membrane.core.transport.http.HttpServerHandler)

Example 47 with Body

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;
}
Also used : Body(com.predic8.membrane.core.http.Body)

Example 48 with Body

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));
}
Also used : AbstractExchangeViewerListener(com.predic8.membrane.core.model.AbstractExchangeViewerListener)

Example 49 with Body

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));
}
Also used : ArrayList(java.util.ArrayList) AMQuota(com.predic8.membrane.core.interceptor.apimanagement.quota.AMQuota) IOException(java.io.IOException) Exchange(com.predic8.membrane.core.exchange.Exchange) ServiceProxy(com.predic8.membrane.core.rules.ServiceProxy) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Outcome(com.predic8.membrane.core.interceptor.Outcome) Test(org.junit.Test)

Example 50 with Body

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();
}
Also used : ArrayList(java.util.ArrayList) Request(com.predic8.membrane.core.http.Request) AMStatisticsCollector(com.predic8.membrane.core.interceptor.apimanagement.statistics.AMStatisticsCollector) Exchange(com.predic8.membrane.core.exchange.Exchange) Response(com.predic8.membrane.core.http.Response) ServiceProxy(com.predic8.membrane.core.rules.ServiceProxy) Test(org.junit.Test)

Aggregations

Exchange (com.predic8.membrane.core.exchange.Exchange)30 IOException (java.io.IOException)17 Response (com.predic8.membrane.core.http.Response)15 Request (com.predic8.membrane.core.http.Request)12 AbstractExchange (com.predic8.membrane.core.exchange.AbstractExchange)10 Test (org.junit.Test)10 CacheBuilder (com.google.common.cache.CacheBuilder)8 MCElement (com.predic8.membrane.annot.MCElement)6 Body (com.predic8.membrane.core.http.Body)6 HttpClient (com.predic8.membrane.core.transport.http.HttpClient)6 UnknownHostException (java.net.UnknownHostException)6 Message (com.predic8.membrane.core.http.Message)5 ServiceProxy (com.predic8.membrane.core.rules.ServiceProxy)5 InputStream (java.io.InputStream)5 JsonFactory (com.fasterxml.jackson.core.JsonFactory)4 JsonGenerator (com.fasterxml.jackson.core.JsonGenerator)4 HttpRouter (com.predic8.membrane.core.HttpRouter)4 AbstractExchangeSnapshot (com.predic8.membrane.core.exchange.snapshots.AbstractExchangeSnapshot)4 DynamicAbstractExchangeSnapshot (com.predic8.membrane.core.exchange.snapshots.DynamicAbstractExchangeSnapshot)4 Header (com.predic8.membrane.core.http.Header)4