diff --git a/sdk/src/androidTest/java/com/bugsnag/android/JsonWriterTest.java b/sdk/src/androidTest/java/com/bugsnag/android/JsonWriterTest.java new file mode 100644 index 0000000000..ef906211d6 --- /dev/null +++ b/sdk/src/androidTest/java/com/bugsnag/android/JsonWriterTest.java @@ -0,0 +1,27 @@ +package com.bugsnag.android; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; + +public class JsonWriterTest { + + @Test(expected = IOException.class) + public void testClose() throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + OutputStreamWriter writer = new OutputStreamWriter(baos); + JsonWriter jsonWriter = new JsonWriter(writer); + + jsonWriter.beginObject().endObject(); + jsonWriter.flush(); + assertEquals("{}", new String(baos.toByteArray(), "UTF-8")); + + jsonWriter.close(); + writer.write(5); // can't write to a closed stream, throws IOException + } + +} diff --git a/sdk/src/main/java/com/bugsnag/android/DefaultHttpClient.java b/sdk/src/main/java/com/bugsnag/android/DefaultHttpClient.java index 348b65010b..1265f783f5 100644 --- a/sdk/src/main/java/com/bugsnag/android/DefaultHttpClient.java +++ b/sdk/src/main/java/com/bugsnag/android/DefaultHttpClient.java @@ -3,11 +3,13 @@ import android.net.ConnectivityManager; import android.net.NetworkInfo; +import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; +import java.nio.charset.Charset; import java.util.Map; class DefaultHttpClient implements ErrorReportApiClient, SessionTrackingApiClient { @@ -65,15 +67,16 @@ private int makeRequest(String urlString, conn.addRequestProperty(entry.getKey(), entry.getValue()); } - OutputStream out = null; + JsonStream stream = null; try { - out = conn.getOutputStream(); - JsonStream stream = new JsonStream(new OutputStreamWriter(out)); + OutputStream out = conn.getOutputStream(); + Charset charset = Charset.forName("UTF-8"); + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, charset)); + stream = new JsonStream(writer); streamable.toStream(stream); - stream.close(); } finally { - IOUtils.closeQuietly(out); + IOUtils.closeQuietly(stream); } diff --git a/sdk/src/main/java/com/bugsnag/android/FileStore.java b/sdk/src/main/java/com/bugsnag/android/FileStore.java index 8aedc53bfd..4e26717b34 100644 --- a/sdk/src/main/java/com/bugsnag/android/FileStore.java +++ b/sdk/src/main/java/com/bugsnag/android/FileStore.java @@ -4,8 +4,11 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import java.io.BufferedWriter; import java.io.File; +import java.io.FileOutputStream; import java.io.FileWriter; +import java.io.OutputStreamWriter; import java.io.Writer; import java.util.ArrayList; import java.util.Arrays; @@ -83,23 +86,21 @@ String write(@NonNull T streamable) { String filename = getFilename(streamable); - Writer out = null; + JsonStream stream = null; lock.lock(); try { - out = new FileWriter(filename); - - JsonStream stream = new JsonStream(out); + FileOutputStream fos = new FileOutputStream(filename); + Writer out = new BufferedWriter(new OutputStreamWriter(fos, "UTF-8")); + stream = new JsonStream(out); stream.value(streamable); - stream.close(); - Logger.info(String.format("Saved unsent payload to disk (%s) ", filename)); return filename; } catch (Exception exception) { Logger.warn(String.format("Couldn't save unsent payload to disk (%s) ", filename), exception); } finally { - IOUtils.closeQuietly(out); + IOUtils.closeQuietly(stream); lock.unlock(); } return null; diff --git a/sdk/src/main/java/com/bugsnag/android/JsonStream.java b/sdk/src/main/java/com/bugsnag/android/JsonStream.java index 21147a9c1d..64a7049543 100644 --- a/sdk/src/main/java/com/bugsnag/android/JsonStream.java +++ b/sdk/src/main/java/com/bugsnag/android/JsonStream.java @@ -3,9 +3,12 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import java.io.BufferedReader; import java.io.File; -import java.io.FileReader; +import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; import java.io.Writer; public class JsonStream extends JsonWriter { @@ -57,9 +60,10 @@ public void value(@NonNull File file) throws IOException { beforeValue(false); // add comma if in array // Copy the file contents onto the stream - FileReader input = null; + Reader input = null; try { - input = new FileReader(file); + FileInputStream fis = new FileInputStream(file); + input = new BufferedReader(new InputStreamReader(fis, "UTF-8")); IOUtils.copy(input, out); } finally { IOUtils.closeQuietly(input);