Skip to content

Commit 7d0a217

Browse files
Pre-gzip the crashlytics payloads before sending them up (#1404)
* Pre-gzip the crashlytics payloads before sending them up the firelog pipeline
1 parent 59e9c3a commit 7d0a217

File tree

6 files changed

+57
-11
lines changed

6 files changed

+57
-11
lines changed

firebase-crashlytics/src/androidTest/java/com/google/firebase/crashlytics/internal/common/BytesBackedNativeSessionFileTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public void testAsFilePayload_convertsToFilePayload() {
4949
new BytesBackedNativeSessionFile("file_name", "file", testBytes);
5050
CrashlyticsReport.FilesPayload.File filesPayload = nativeSessionFile.asFilePayload();
5151
assertNotNull(filesPayload);
52-
assertArrayEquals(testBytes, filesPayload.getContents());
52+
assertArrayEquals(testBytes, TestUtils.inflateGzipToRawBytes(filesPayload.getContents()));
5353
assertEquals("file_name", filesPayload.getFilename());
5454
}
5555

firebase-crashlytics/src/androidTest/java/com/google/firebase/crashlytics/internal/common/FileBackedNativeSessionFileTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public void testAsFilePayload_convertsToFilePayload() {
8585
new FileBackedNativeSessionFile("file_name", "file", testFile);
8686
CrashlyticsReport.FilesPayload.File filesPayload = nativeSessionFile.asFilePayload();
8787
assertNotNull(filesPayload);
88-
assertArrayEquals(testContents, filesPayload.getContents());
88+
assertArrayEquals(testContents, TestUtils.inflateGzipToRawBytes(filesPayload.getContents()));
8989
assertEquals("file_name", filesPayload.getFilename());
9090
}
9191

@@ -95,7 +95,7 @@ public void testAsFilePayloadWhenEmpty_returnsEmptyPayload() {
9595
new FileBackedNativeSessionFile("file_name", "file", emptyFile);
9696
CrashlyticsReport.FilesPayload.File filesPayload = nativeSessionFile.asFilePayload();
9797
assertNotNull(filesPayload);
98-
assertArrayEquals(emptyContents, filesPayload.getContents());
98+
assertArrayEquals(emptyContents, TestUtils.inflateGzipToRawBytes(filesPayload.getContents()));
9999
assertEquals("file_name", filesPayload.getFilename());
100100
}
101101

firebase-crashlytics/src/androidTest/java/com/google/firebase/crashlytics/internal/common/SessionReportingCoordinatorTest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
package com.google.firebase.crashlytics.internal.common;
1616

17+
import static org.junit.Assert.assertArrayEquals;
1718
import static org.junit.Assert.assertEquals;
1819
import static org.mockito.ArgumentMatchers.any;
1920
import static org.mockito.ArgumentMatchers.anyBoolean;
@@ -339,7 +340,10 @@ public void testFinalizeSessionWithNativeEvent_createsCrashlyticsReportWithNativ
339340
verify(reportPersistence).finalizeSessionWithNativeEvent(eq("id"), filesPayload.capture());
340341
CrashlyticsReport.FilesPayload ndkPayloadFinalized = filesPayload.getValue();
341342
assertEquals(1, ndkPayloadFinalized.getFiles().size());
342-
assertEquals(testBytes, ndkPayloadFinalized.getFiles().get(0).getContents());
343+
344+
assertArrayEquals(
345+
testBytes,
346+
TestUtils.inflateGzipToRawBytes(ndkPayloadFinalized.getFiles().get(0).getContents()));
343347
assertEquals(byteBackedSessionName, ndkPayloadFinalized.getFiles().get(0).getFilename());
344348
}
345349

firebase-crashlytics/src/androidTest/java/com/google/firebase/crashlytics/internal/common/TestUtils.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,12 @@
1515
package com.google.firebase.crashlytics.internal.common;
1616

1717
import java.io.BufferedWriter;
18+
import java.io.ByteArrayInputStream;
19+
import java.io.ByteArrayOutputStream;
1820
import java.io.File;
1921
import java.io.FileWriter;
2022
import java.io.IOException;
23+
import java.util.zip.GZIPInputStream;
2124

2225
final class TestUtils {
2326
private TestUtils() {}
@@ -33,4 +36,19 @@ public static void writeStringToFile(String s, File f) throws IOException {
3336
}
3437
}
3538
}
39+
40+
public static byte[] inflateGzipToRawBytes(byte[] compressed) {
41+
try (ByteArrayInputStream bis = new ByteArrayInputStream(compressed);
42+
GZIPInputStream gis = new GZIPInputStream(bis);
43+
ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
44+
int value = gis.read();
45+
while (value != -1) {
46+
bos.write(value);
47+
value = gis.read();
48+
}
49+
return bos.toByteArray();
50+
} catch (Exception e) {
51+
return null;
52+
}
53+
}
3654
}

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/BytesBackedNativeSessionFile.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@
1818
import androidx.annotation.Nullable;
1919
import com.google.firebase.crashlytics.internal.model.CrashlyticsReport;
2020
import java.io.ByteArrayInputStream;
21+
import java.io.ByteArrayOutputStream;
22+
import java.io.IOException;
2123
import java.io.InputStream;
24+
import java.util.zip.GZIPOutputStream;
2225

2326
/** A {@link NativeSessionFile} backed by a byte array. */
2427
class BytesBackedNativeSessionFile implements NativeSessionFile {
@@ -50,15 +53,32 @@ public InputStream getStream() {
5053
@Override
5154
@Nullable
5255
public CrashlyticsReport.FilesPayload.File asFilePayload() {
53-
return isEmpty()
56+
byte[] gzippedBytes = asGzippedBytes();
57+
return gzippedBytes == null
5458
? null
5559
: CrashlyticsReport.FilesPayload.File.builder()
56-
.setContents(bytes)
60+
.setContents(gzippedBytes)
5761
.setFilename(dataTransportFilename)
5862
.build();
5963
}
6064

6165
private boolean isEmpty() {
6266
return bytes == null || bytes.length == 0;
6367
}
68+
69+
@Nullable
70+
private byte[] asGzippedBytes() {
71+
if (isEmpty()) {
72+
return null;
73+
}
74+
75+
try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
76+
GZIPOutputStream gos = new GZIPOutputStream(bos)) {
77+
gos.write(bytes);
78+
gos.finish();
79+
return bos.toByteArray();
80+
} catch (IOException e) {
81+
return null;
82+
}
83+
}
6484
}

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/FileBackedNativeSessionFile.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.io.FileNotFoundException;
2424
import java.io.IOException;
2525
import java.io.InputStream;
26+
import java.util.zip.GZIPOutputStream;
2627

2728
/** A {@link NativeSessionFile} backed by a {@link File} currently on disk. */
2829
class FileBackedNativeSessionFile implements NativeSessionFile {
@@ -62,7 +63,7 @@ public InputStream getStream() {
6263
@Override
6364
@Nullable
6465
public CrashlyticsReport.FilesPayload.File asFilePayload() {
65-
byte[] bytes = asBytes();
66+
byte[] bytes = asGzippedBytes();
6667
return bytes != null
6768
? CrashlyticsReport.FilesPayload.File.builder()
6869
.setContents(bytes)
@@ -71,17 +72,20 @@ public CrashlyticsReport.FilesPayload.File asFilePayload() {
7172
: null;
7273
}
7374

74-
private byte[] asBytes() {
75+
@Nullable
76+
private byte[] asGzippedBytes() {
7577
final byte[] readBuffer = new byte[8192];
76-
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
77-
try (InputStream stream = getStream()) {
78+
try (InputStream stream = getStream();
79+
ByteArrayOutputStream bos = new ByteArrayOutputStream();
80+
GZIPOutputStream gos = new GZIPOutputStream(bos)) {
7881
if (stream == null) {
7982
return null;
8083
}
8184
int read;
8285
while ((read = stream.read(readBuffer)) > 0) {
83-
bos.write(readBuffer, 0, read);
86+
gos.write(readBuffer, 0, read);
8487
}
88+
gos.finish();
8589
return bos.toByteArray();
8690
} catch (IOException e) {
8791
return null;

0 commit comments

Comments
 (0)