/** * Copyright 2013-2014 Recruit Technologies Co., Ltd. and contributors * (see CONTRIBUTORS.md) * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. A copy of the * License is distributed with this work in the LICENSE.md file. You may * also obtain a copy of the License from * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.gennai.gungnir.server; import java.util.Arrays; import java.util.Iterator; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import org.gennai.gungnir.server.ProxyServer.SLF4JHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.twitter.finagle.Httpx; import com.twitter.finagle.ListeningServer; import com.twitter.finagle.Service; import com.twitter.finagle.httpx.Cookie; import com.twitter.finagle.httpx.Request; import com.twitter.finagle.httpx.Response; import com.twitter.finagle.httpx.Status; import com.twitter.util.Await; import com.twitter.util.Future; import com.twitter.util.TimeoutException; public final class TestServer { private static final Logger LOG = LoggerFactory.getLogger(TestServer.class); public static class HttpServer extends Service<Request, Response> { private AtomicInteger cnt; private ExecutorService metricsExecutor; public HttpServer() { cnt = new AtomicInteger(); metricsExecutor = Executors.newSingleThreadExecutor(); metricsExecutor.execute(new Runnable() { @Override public void run() { for (;;) { int c = cnt.getAndSet(0); if (c > 0) { LOG.info("{}", c); } try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { break; } } } }); } @Override public Future<Response> apply(Request request) { if (LOG.isDebugEnabled()) { LOG.debug("URI: {}", request.uri()); LOG.debug("Content: {}", request.contentString()); LOG.debug("Content-Length: {}", request.contentLength().get()); LOG.debug("Content-Type: {} {}", request.contentType().get(), request.contentType().get().equals(Request.ContentTypeJson())); LOG.debug("Length: {}", request.length()); LOG.debug("Params: {}", request.getParams()); LOG.debug("Chunked: {}", request.isChunked()); LOG.debug("Remote: {}:{}", request.remoteHost(), request.remotePort()); for (Iterator<Cookie> it = request.getCookies(); it.hasNext();) { Cookie cookie = it.next(); LOG.debug("Cookie: {}={}", cookie.name(), cookie.value()); } for (Map.Entry<String, String> entry : request.headers()) { LOG.debug("Header: {}", entry); } } cnt.incrementAndGet(); Response response = Response.apply(request.version(), Status.NoContent()); // response.headerMap().put(Fields.SetCookie(), new Cookie("name", "value")); return Future.value(response); } } private TestServer() { } public static void main(String[] args) { java.util.logging.Logger logger = java.util.logging.Logger.getLogger("com.twitter"); logger.setUseParentHandlers(false); logger.addHandler(new SLF4JHandler()); final ListeningServer server = Httpx.serve(args[0], new HttpServer()); try { Await.result(server.announce(args[1] + "!0")); } catch (Exception e) { throw new RuntimeException(e); } try { LOG.info("Test server start " + Arrays.toString(args)); Await.ready(server); } catch (TimeoutException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }