@Override protected Map<String, Object> toJsonMap(IAccessEvent event) { return new MapBuilder(timestampFormatter, customFieldNames, additionalFields, includes.size()) .addNumber("port", isIncluded(AccessAttribute.LOCAL_PORT), event::getLocalPort) .addNumber("contentLength", isIncluded(AccessAttribute.CONTENT_LENGTH), event::getContentLength) .addTimestamp("timestamp", isIncluded(AccessAttribute.TIMESTAMP), event.getTimeStamp()) .add("method", isIncluded(AccessAttribute.METHOD), event::getMethod) .add("protocol", isIncluded(AccessAttribute.PROTOCOL), event::getProtocol) .add("requestContent", isIncluded(AccessAttribute.REQUEST_CONTENT), event::getRequestContent) .add("remoteAddress", isIncluded(AccessAttribute.REMOTE_ADDRESS), event::getRemoteAddr) .add("remoteUser", isIncluded(AccessAttribute.REMOTE_USER), event::getRemoteUser) .addMap("headers", !requestHeaders.isEmpty(), () -> filterHeaders(event.getRequestHeaderMap(), requestHeaders)) .addMap("params", isIncluded(AccessAttribute.REQUEST_PARAMETERS), event::getRequestParameterMap) .addNumber("requestTime", isIncluded(AccessAttribute.REQUEST_TIME), event::getElapsedTime) .add("uri", isIncluded(AccessAttribute.REQUEST_URI), event::getRequestURI) .add("url", isIncluded(AccessAttribute.REQUEST_URL), event::getRequestURL) .add("pathQuery", isIncluded(AccessAttribute.PATH_QUERY), () -> event.getRequestURI() + event.getQueryString()) .add("remoteHost", isIncluded(AccessAttribute.REMOTE_HOST), event::getRemoteHost) .add("responseContent", isIncluded(AccessAttribute.RESPONSE_CONTENT), event::getResponseContent) .addMap("responseHeaders", !responseHeaders.isEmpty(), () -> filterHeaders(event.getResponseHeaderMap(), responseHeaders)) .add("serverName", isIncluded(AccessAttribute.SERVER_NAME), event::getServerName) .addNumber("status", isIncluded(AccessAttribute.STATUS_CODE), event::getStatusCode) .add("userAgent", isIncluded(AccessAttribute.USER_AGENT), () -> event.getRequestHeader(USER_AGENT)) .add("version", jsonProtocolVersion != null, jsonProtocolVersion) .build(); }
@Override protected void preprocess(IAccessEvent event) { event.prepareForDeferredProcessing(); } };
void addAccessEvent(PreparedStatement stmt, IAccessEvent event) throws SQLException { stmt.setLong(1, event.getTimeStamp()); stmt.setString(2, event.getRequestURI()); stmt.setString(3, event.getRequestURL()); stmt.setString(4, event.getRemoteHost()); stmt.setString(5, event.getRemoteUser()); stmt.setString(6, event.getRemoteAddr()); stmt.setString(7, event.getProtocol()); stmt.setString(8, event.getMethod()); stmt.setString(9, event.getServerName()); stmt.setString(10, event.getRequestContent()); }
@Test public void testSerialization() throws IOException, ClassNotFoundException { Object o = buildSerializedAccessEvent(); assertNotNull(o); IAccessEvent aeBack = (IAccessEvent) o; assertEquals(DummyResponse.DUMMY_DEFAULT_HDEADER_MAP, aeBack.getResponseHeaderMap()); assertEquals(DummyResponse.DUMMY_DEFAULT_HDEADER_MAP.get("x"), aeBack.getResponseHeader("x")); assertEquals(DummyResponse.DUMMY_DEFAULT_HDEADER_MAP.get("headerName1"), aeBack.getResponseHeader("headerName1")); assertEquals(DummyResponse.DUMMY_DEFAULT_HDEADER_MAP.size(), aeBack.getResponseHeaderNameList().size()); assertEquals(DummyResponse.DUMMY_DEFAULT_CONTENT_COUNT, aeBack.getContentLength()); assertEquals(DummyResponse.DUMMY_DEFAULT_STATUS, aeBack.getStatusCode()); assertEquals(DummyRequest.DUMMY_CONTENT_STRING, aeBack.getRequestContent()); assertEquals(DummyRequest.DUMMY_RESPONSE_CONTENT_STRING, aeBack.getResponseContent()); assertEquals(DummyRequest.DUMMY_DEFAULT_ATTR_MAP.get("testKey"), aeBack.getAttribute("testKey")); }
@Override public void writeTo(JsonGenerator generator, IAccessEvent event) throws IOException { JsonWritingUtils.writeStringField(generator, getFieldName(), String.format("%s - %s [%s] \"%s\" %s %s", event.getRemoteHost(), event.getRemoteUser() == null ? "-" : event.getRemoteUser(), getFormattedTimestamp(event), event.getRequestURL(), event.getStatusCode(), event.getContentLength())); }
@Override protected long getTimestamp(IAccessEvent event) { return event.getTimeStamp(); }
@Test public void callingPrepareForDeferredProcessingShouldBeIdempotent() { String key = "key-"+diff; String val = "val-"+diff; IAccessEvent ae = DummyAccessEventBuilder.buildNewAccessEvent(); DummyRequest request = (DummyRequest) ae.getRequest(); Map<String, String> headersMap = request.getHeaders(); Map<String, String[]> parametersMap = request.getParameterMap(); headersMap.put(key, val); request.setAttribute(key, val); parametersMap.put(key, new String[] {val}); ae.prepareForDeferredProcessing(); assertEquals(val, ae.getAttribute(key)); assertEquals(val, ae.getRequestHeader(key)); assertEquals(val, ae.getRequestParameter(key)[0]); request.setAttribute(key, "change"); headersMap.put(key, "change"); parametersMap.put(key, new String[] {"change"}); ae.prepareForDeferredProcessing(); assertEquals(val, ae.getAttribute(key)); assertEquals(val, ae.getRequestHeader(key)); assertEquals(val, ae.getRequestParameter(key)[0]); }
@Override public String convert(IAccessEvent ae) { StringBuilder buf = new StringBuilder(); buf.append(ae.getRequestURL()); buf.append(CoreConstants.LINE_SEPARATOR); Enumeration headerNames = ae.getRequestHeaderNames(); while (headerNames.hasMoreElements()) { String name = (String) headerNames.nextElement(); buf.append(name); buf.append(": "); buf.append(ae.getRequestHeader(name)); buf.append(CoreConstants.LINE_SEPARATOR); } buf.append(CoreConstants.LINE_SEPARATOR); buf.append(ae.getRequestContent()); return buf.toString(); }
@Override public String convert(IAccessEvent accessEvent) { return accessEvent.getRequestURI(); }
@Override public String convert(IAccessEvent accessEvent) { if (!isStarted()) { return "INACTIVE_HEADER_CONV"; } if (key != null) { return accessEvent.getRequestHeader(key); } else { return accessEvent.getRequestHeaderMap().toString(); } }
@Override public String convert(IAccessEvent accessEvent) { String user = accessEvent.getRemoteUser(); if (user == null) { return IAccessEvent.NA; } else { return user; } }
/** * Verifies that the request headers does not have contain the given one. * * @param name the request header name. * @return this instance. * @see IAccessEvent#getRequestHeader(String) */ public S doesNotHaveRequestHeader(String name) { String actualRequestHeader = actual.getRequestHeader(name); Assertions.assertThat(actualRequestHeader).isEqualTo(NA); return myself; }
@Test public void eventGoesToAppenders() throws Exception { URL url = new URL(JETTY_FIXTURE.getUrl()); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); String result = Util.readToString(connection.getInputStream()); assertEquals("hello world", result); NotifyingListAppender listAppender = (NotifyingListAppender) REQUEST_LOG_IMPL.getAppender("list"); IAccessEvent event = listAppender.list.poll(TIMEOUT, TimeUnit.SECONDS); assertNotNull("No events received", event); assertEquals("127.0.0.1", event.getRemoteHost()); assertEquals("localhost", event.getServerName()); listAppender.list.clear(); }
@Test public void testAttributesAreNotTakenFromRecycledRequestWhenProcessingDeferred() { DummyRequest request = new DummyRequest(); DummyResponse response = new DummyResponse(); DummyServerAdapter adapter = new DummyServerAdapter(request, response); IAccessEvent event = new AccessEvent(request, response, adapter); request.setAttribute("testKey", "ORIGINAL"); event.prepareForDeferredProcessing(); request.setAttribute("testKey", "NEW"); // Event should capture the original value assertEquals("ORIGINAL", event.getAttribute("testKey")); } }
@Override public String convert(IAccessEvent accessEvent) { long len = accessEvent.getContentLength(); if (len == IAccessEvent.SENTINEL) { return IAccessEvent.NA; } else { return Long.toString(len); } }
@Override public String convert(IAccessEvent accessEvent) { return accessEvent.getMethod(); } }
@Override public String convert(IAccessEvent accessEvent) { return accessEvent.getProtocol(); } }
@Override public String convert(IAccessEvent accessEvent) { return accessEvent.getRemoteHost(); }
@Override public void writeTo(JsonGenerator generator, IAccessEvent event) throws IOException { Map<String, String> headers; if (filter == null) { headers = event.getRequestHeaderMap(); } else { headers = new HashMap<>(event.getRequestHeaderMap().size()); for (Map.Entry<String, String> header : event.getRequestHeaderMap().entrySet()) { if (filter.includeHeader(header.getKey(), header.getValue())) { headers.put(header.getKey(), header.getValue()); } } } JsonWritingUtils.writeMapStringFields(generator, getFieldName(), headers, lowerCaseHeaderNames); }
void addRequestHeaders(IAccessEvent event, Connection connection, long eventId) throws SQLException { Enumeration names = event.getRequestHeaderNames(); if (names.hasMoreElements()) { PreparedStatement insertHeaderStatement = connection.prepareStatement(insertHeaderSQL); while (names.hasMoreElements()) { String key = (String) names.nextElement(); String value = (String) event.getRequestHeader(key); insertHeaderStatement.setLong(1, eventId); insertHeaderStatement.setString(2, key); insertHeaderStatement.setString(3, value); if (cnxSupportsBatchUpdates) { insertHeaderStatement.addBatch(); } else { insertHeaderStatement.execute(); } } if (cnxSupportsBatchUpdates) { insertHeaderStatement.executeBatch(); } insertHeaderStatement.close(); } }