private void setupTraceLog(HttpContext httpContext, String queue, AccessLog accessLog) throws IOException { String clientIp = httpContext.getClientIp(); // DBへのアクセスログ採取有無 if (!isLogging(clientIp, "accessDb." + queue)) { return; } // DBに記録する accessLog.insert(); // リクエストStreamのpeek処理 if (isLogging(clientIp, "accessTrace.request." + queue)) { PeekStream requestPeeker = accessLog.setupPeekRequest(); httpContext.peekRequest(requestPeeker); context.enque(requestPeeker, Config.QUEUE_PEEK); // 既に受け取っているヘッダ部分をPeekStreamに流し込む HttpParser requestParser = httpContext.getRequestParser(); OutputStream os = requestPeeker.getPeekOutputStream(); requestParser.writeSeriarizeHeader(os); } // レスポンスStreamのpeek処理 if (isLogging(clientIp, "accessTrace.response." + queue)) { PeekStream responsePeeker = accessLog.setupPeekResponse(); httpContext.peekResponse(responsePeeker); context.enque(responsePeeker, Config.QUEUE_PEEK); } }
// URIと設定から呼び出し先QUEUEを決める。 private MappingEntry mappingQueue(HttpContext httpContext) { String uri = httpContext.getRequestUri(); if (MappingEntry.controllerEntry.matches(uri)) { // controllerへのリクエストか? httpContext.setAttribute(HttpContext.ATTRIBUTE_MAPPING_ENTRY, MappingEntry.controllerEntry); return MappingEntry.controllerEntry; } String clientIp = httpContext.getClientIp(); // リクエストがReplay対象か? if (config.isReplay(clientIp, uri)) { return MappingEntry.replayEntry; } if (httpContext.isProxyRequest()) { // TODO 強制的にWebサーバとして動作するモード要, // requestLineがhttp://から始まってもクライアントが間違って送ってきたと判断する return MappingEntry.proxyEntry; } MappingEntry mappingEntry = config.mapping(uri); if (mappingEntry == null) { return null; } // マッピング先がReplay対象か? if (config.isReplay(clientIp, mappingEntry.getDestination())) { return MappingEntry.replayEntry; } httpContext.setAttribute(HttpContext.ATTRIBUTE_MAPPING_ENTRY, mappingEntry); return mappingEntry; }