From d70e063ed2fa374863a2c058af240cd9c344b6a6 Mon Sep 17 00:00:00 2001 From: Brett Hoerner Date: Thu, 9 Mar 2017 14:25:44 -0600 Subject: [PATCH 1/4] Add optional 'body' field to HttpInterface. --- .../raven/event/interfaces/HttpInterface.java | 20 +++++++++++++ .../marshaller/json/HttpInterfaceBinding.java | 29 ++++++++++++++----- .../raven/marshaller/json/JsonMarshaller.java | 19 ++---------- .../json/MessageInterfaceBinding.java | 22 +++----------- .../java/com/getsentry/raven/util/Util.java | 18 ++++++++++++ .../json/HttpInterfaceBindingTest.java | 2 ++ .../raven/marshaller/json/Http1.json | 4 ++- 7 files changed, 70 insertions(+), 44 deletions(-) diff --git a/raven/src/main/java/com/getsentry/raven/event/interfaces/HttpInterface.java b/raven/src/main/java/com/getsentry/raven/event/interfaces/HttpInterface.java index 2df8c4c3e4..a7c9d66db7 100644 --- a/raven/src/main/java/com/getsentry/raven/event/interfaces/HttpInterface.java +++ b/raven/src/main/java/com/getsentry/raven/event/interfaces/HttpInterface.java @@ -32,6 +32,7 @@ public class HttpInterface implements SentryInterface { private final String authType; private final String remoteUser; private final Map> headers; + private final String body; /** * This constructor is for compatibility reasons and should not be used. @@ -49,6 +50,17 @@ public HttpInterface(HttpServletRequest request) { * @param remoteAddressResolver RemoteAddressResolver */ public HttpInterface(HttpServletRequest request, RemoteAddressResolver remoteAddressResolver) { + this(request, remoteAddressResolver, null); + } + + /** + * Creates a an HTTP element for an {@link com.getsentry.raven.event.Event}. + * + * @param request Captured HTTP request to send to Sentry. + * @param remoteAddressResolver RemoteAddressResolver + * @param body HTTP request body (optional) + */ + public HttpInterface(HttpServletRequest request, RemoteAddressResolver remoteAddressResolver, String body) { this.requestUrl = request.getRequestURL().toString(); this.method = request.getMethod(); this.parameters = new HashMap<>(); @@ -79,6 +91,7 @@ public HttpInterface(HttpServletRequest request, RemoteAddressResolver remoteAdd for (String headerName : Collections.list(request.getHeaderNames())) { this.headers.put(headerName, Collections.list(request.getHeaders(headerName))); } + this.body = body; } @Override @@ -150,6 +163,10 @@ public String getRemoteUser() { return remoteUser; } + public String getBody() { + return body; + } + public Map> getHeaders() { return Collections.unmodifiableMap(headers); } @@ -226,6 +243,9 @@ public boolean equals(Object o) { if (serverName != null ? !serverName.equals(that.serverName) : that.serverName != null) { return false; } + if (body != null ? !body.equals(that.body) : that.body != null) { + return false; + } return true; } diff --git a/raven/src/main/java/com/getsentry/raven/marshaller/json/HttpInterfaceBinding.java b/raven/src/main/java/com/getsentry/raven/marshaller/json/HttpInterfaceBinding.java index 4f0c9ff4b1..b2838ce22d 100644 --- a/raven/src/main/java/com/getsentry/raven/marshaller/json/HttpInterfaceBinding.java +++ b/raven/src/main/java/com/getsentry/raven/marshaller/json/HttpInterfaceBinding.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.getsentry.raven.event.interfaces.HttpInterface; +import com.getsentry.raven.util.Util; import java.io.IOException; import java.util.Collection; @@ -11,9 +12,14 @@ * Binding system allowing to convert an {@link HttpInterface} into a JSON stream. */ public class HttpInterfaceBinding implements InterfaceBinding { + /** + * Maximum length for the HTTP request body. + */ + public static final int MAX_BODY_LENGTH = 1000; private static final String URL = "url"; private static final String METHOD = "method"; private static final String DATA = "data"; + private static final String BODY = "body"; private static final String QUERY_STRING = "query_string"; private static final String COOKIES = "cookies"; private static final String HEADERS = "headers"; @@ -36,7 +42,7 @@ public void writeInterface(JsonGenerator generator, HttpInterface httpInterface) generator.writeStringField(URL, httpInterface.getRequestUrl()); generator.writeStringField(METHOD, httpInterface.getMethod()); generator.writeFieldName(DATA); - writeData(generator, httpInterface.getParameters()); + writeData(generator, httpInterface.getParameters(), httpInterface.getBody()); generator.writeStringField(QUERY_STRING, httpInterface.getQueryString()); generator.writeFieldName(COOKIES); writeCookies(generator, httpInterface.getCookies()); @@ -91,19 +97,26 @@ private void writeCookies(JsonGenerator generator, Map cookies) generator.writeEndObject(); } - private void writeData(JsonGenerator generator, Map> parameterMap) throws IOException { - if (parameterMap == null) { + private void writeData(JsonGenerator generator, + Map> parameterMap, + String body) throws IOException { + if (parameterMap == null && body == null) { generator.writeNull(); return; } generator.writeStartObject(); - for (Map.Entry> parameter : parameterMap.entrySet()) { - generator.writeArrayFieldStart(parameter.getKey()); - for (String parameterValue : parameter.getValue()) { - generator.writeString(parameterValue); + if (body != null) { + generator.writeStringField(BODY, Util.trimString(body, MAX_BODY_LENGTH)); + } + if (parameterMap != null) { + for (Map.Entry> parameter : parameterMap.entrySet()) { + generator.writeArrayFieldStart(parameter.getKey()); + for (String parameterValue : parameter.getValue()) { + generator.writeString(parameterValue); + } + generator.writeEndArray(); } - generator.writeEndArray(); } generator.writeEndObject(); } diff --git a/raven/src/main/java/com/getsentry/raven/marshaller/json/JsonMarshaller.java b/raven/src/main/java/com/getsentry/raven/marshaller/json/JsonMarshaller.java index 3914c77505..bfccbd6d22 100644 --- a/raven/src/main/java/com/getsentry/raven/marshaller/json/JsonMarshaller.java +++ b/raven/src/main/java/com/getsentry/raven/marshaller/json/JsonMarshaller.java @@ -8,6 +8,7 @@ import com.getsentry.raven.event.Event; import com.getsentry.raven.event.interfaces.SentryInterface; import com.getsentry.raven.marshaller.Marshaller; +import com.getsentry.raven.util.Util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -167,7 +168,7 @@ private void writeContent(JsonGenerator generator, Event event) throws IOExcepti generator.writeStartObject(); generator.writeStringField(EVENT_ID, formatId(event.getId())); - generator.writeStringField(MESSAGE, trimMessage(event.getMessage())); + generator.writeStringField(MESSAGE, Util.trimString(event.getMessage(), maxMessageLength)); generator.writeStringField(TIMESTAMP, ISO_FORMAT.get().format(event.getTimestamp())); generator.writeStringField(LEVEL, formatLevel(event.getLevel())); generator.writeStringField(LOGGER, event.getLogger()); @@ -333,22 +334,6 @@ private void writeContexts(JsonGenerator generator, Map maxMessageLength) { - return message.substring(0, maxMessageLength); - } else { - return message; - } - } - /** * Formats the {@code UUID} to send only the 32 necessary characters. * diff --git a/raven/src/main/java/com/getsentry/raven/marshaller/json/MessageInterfaceBinding.java b/raven/src/main/java/com/getsentry/raven/marshaller/json/MessageInterfaceBinding.java index 57efedcea5..6c24e5216c 100644 --- a/raven/src/main/java/com/getsentry/raven/marshaller/json/MessageInterfaceBinding.java +++ b/raven/src/main/java/com/getsentry/raven/marshaller/json/MessageInterfaceBinding.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.getsentry.raven.event.interfaces.MessageInterface; +import com.getsentry.raven.util.Util; import java.io.IOException; @@ -38,33 +39,18 @@ public MessageInterfaceBinding(int maxMessageLength) { this.maxMessageLength = maxMessageLength; } - /** - * Trims a message, ensuring that the maximum length {@link #maxMessageLength} isn't reached. - * - * @param message message to format. - * @return trimmed message (shortened if necessary). - */ - private String trimMessage(String message) { - if (message == null) { - return null; - } else if (message.length() > maxMessageLength) { - return message.substring(0, maxMessageLength); - } else { - return message; - } - } - @Override public void writeInterface(JsonGenerator generator, MessageInterface messageInterface) throws IOException { generator.writeStartObject(); - generator.writeStringField(MESSAGE_PARAMETER, trimMessage(messageInterface.getMessage())); + generator.writeStringField(MESSAGE_PARAMETER, Util.trimString(messageInterface.getMessage(), maxMessageLength)); generator.writeArrayFieldStart(PARAMS_PARAMETER); for (String parameter : messageInterface.getParameters()) { generator.writeString(parameter); } generator.writeEndArray(); if (messageInterface.getFormatted() != null) { - generator.writeStringField(FORMATTED_PARAMETER, trimMessage(messageInterface.getFormatted())); + generator.writeStringField(FORMATTED_PARAMETER, + Util.trimString(messageInterface.getFormatted(), maxMessageLength)); } generator.writeEndObject(); } diff --git a/raven/src/main/java/com/getsentry/raven/util/Util.java b/raven/src/main/java/com/getsentry/raven/util/Util.java index 209266759b..3c45509a05 100644 --- a/raven/src/main/java/com/getsentry/raven/util/Util.java +++ b/raven/src/main/java/com/getsentry/raven/util/Util.java @@ -109,4 +109,22 @@ public static Double parseDouble(String value, Double defaultValue) { } return Double.parseDouble(value); } + + /** + * Trims a String, ensuring that the maximum length isn't reached. + * + * @param string string to trim + * @param maxMessageLength maximum length of the string + * @return trimmed string + */ + public static String trimString(String string, int maxMessageLength) { + if (string == null) { + return null; + } else if (string.length() > maxMessageLength) { + return string.substring(0, maxMessageLength); + } else { + return string; + } + } + } diff --git a/raven/src/test/java/com/getsentry/raven/marshaller/json/HttpInterfaceBindingTest.java b/raven/src/test/java/com/getsentry/raven/marshaller/json/HttpInterfaceBindingTest.java index c5f16c9d05..ca4a1ebdea 100644 --- a/raven/src/test/java/com/getsentry/raven/marshaller/json/HttpInterfaceBindingTest.java +++ b/raven/src/test/java/com/getsentry/raven/marshaller/json/HttpInterfaceBindingTest.java @@ -55,6 +55,8 @@ public void testHeaders() throws Exception { result = "5.6.7.8"; mockMessageInterface.getLocalName(); result = "local-name"; + mockMessageInterface.getBody(); + result = "body"; }}; interfaceBinding.writeInterface(jsonGeneratorParser.generator(), mockMessageInterface); diff --git a/raven/src/test/resources/com/getsentry/raven/marshaller/json/Http1.json b/raven/src/test/resources/com/getsentry/raven/marshaller/json/Http1.json index d0bf64965c..54eb182203 100644 --- a/raven/src/test/resources/com/getsentry/raven/marshaller/json/Http1.json +++ b/raven/src/test/resources/com/getsentry/raven/marshaller/json/Http1.json @@ -1,7 +1,9 @@ { "url": "http://host/url", "method": "GET", - "data": {}, + "data": { + "body": "body" + }, "query_string": "query", "cookies": { "Cookie1": "Value1" From 03907eb354a781ec88dfb90734099d5ba4309ee4 Mon Sep 17 00:00:00 2001 From: Brett Hoerner Date: Fri, 10 Mar 2017 15:18:23 -0600 Subject: [PATCH 2/4] Adjust body length based on SDK docs. --- .../raven/marshaller/json/HttpInterfaceBinding.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/raven/src/main/java/com/getsentry/raven/marshaller/json/HttpInterfaceBinding.java b/raven/src/main/java/com/getsentry/raven/marshaller/json/HttpInterfaceBinding.java index b2838ce22d..bd75fe1c15 100644 --- a/raven/src/main/java/com/getsentry/raven/marshaller/json/HttpInterfaceBinding.java +++ b/raven/src/main/java/com/getsentry/raven/marshaller/json/HttpInterfaceBinding.java @@ -14,8 +14,12 @@ public class HttpInterfaceBinding implements InterfaceBinding { /** * Maximum length for the HTTP request body. + * + * See the SDK reference + * for more information. */ - public static final int MAX_BODY_LENGTH = 1000; + public static final int MAX_BODY_LENGTH = 2048; + private static final String URL = "url"; private static final String METHOD = "method"; private static final String DATA = "data"; From 73ba3abc5439eda487b3127dcdb98c007d96b43e Mon Sep 17 00:00:00 2001 From: Brett Hoerner Date: Mon, 13 Mar 2017 15:07:39 -0500 Subject: [PATCH 3/4] Fixes. --- .../com/getsentry/raven/event/interfaces/HttpInterface.java | 4 ++-- raven/src/main/java/com/getsentry/raven/util/Util.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/raven/src/main/java/com/getsentry/raven/event/interfaces/HttpInterface.java b/raven/src/main/java/com/getsentry/raven/event/interfaces/HttpInterface.java index a7c9d66db7..8ef96aeb5d 100644 --- a/raven/src/main/java/com/getsentry/raven/event/interfaces/HttpInterface.java +++ b/raven/src/main/java/com/getsentry/raven/event/interfaces/HttpInterface.java @@ -44,7 +44,7 @@ public HttpInterface(HttpServletRequest request) { } /** - * Creates a an HTTP element for an {@link com.getsentry.raven.event.Event}. + * Creates an HTTP element for an {@link com.getsentry.raven.event.Event}. * * @param request Captured HTTP request to send to Sentry. * @param remoteAddressResolver RemoteAddressResolver @@ -54,7 +54,7 @@ public HttpInterface(HttpServletRequest request, RemoteAddressResolver remoteAdd } /** - * Creates a an HTTP element for an {@link com.getsentry.raven.event.Event}. + * Creates an HTTP element for an {@link com.getsentry.raven.event.Event}. * * @param request Captured HTTP request to send to Sentry. * @param remoteAddressResolver RemoteAddressResolver diff --git a/raven/src/main/java/com/getsentry/raven/util/Util.java b/raven/src/main/java/com/getsentry/raven/util/Util.java index 3c45509a05..40c8dc947c 100644 --- a/raven/src/main/java/com/getsentry/raven/util/Util.java +++ b/raven/src/main/java/com/getsentry/raven/util/Util.java @@ -121,7 +121,7 @@ public static String trimString(String string, int maxMessageLength) { if (string == null) { return null; } else if (string.length() > maxMessageLength) { - return string.substring(0, maxMessageLength); + return string.substring(0, maxMessageLength - 3) + "..."; } else { return string; } From 2134aede62a822bd5dcd58a5fde247e3e35de8fd Mon Sep 17 00:00:00 2001 From: Brett Hoerner Date: Mon, 13 Mar 2017 15:10:30 -0500 Subject: [PATCH 4/4] Checkstyle. :( --- raven/src/main/java/com/getsentry/raven/util/Util.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/raven/src/main/java/com/getsentry/raven/util/Util.java b/raven/src/main/java/com/getsentry/raven/util/Util.java index 40c8dc947c..ea7c84d586 100644 --- a/raven/src/main/java/com/getsentry/raven/util/Util.java +++ b/raven/src/main/java/com/getsentry/raven/util/Util.java @@ -121,7 +121,9 @@ public static String trimString(String string, int maxMessageLength) { if (string == null) { return null; } else if (string.length() > maxMessageLength) { + // CHECKSTYLE.OFF: MagicNumber return string.substring(0, maxMessageLength - 3) + "..."; + // CHECKSTYLE.ON: MagicNumber } else { return string; }