Skip to content

Commit 3cd0685

Browse files
committed
Sanitize default user agents.
Fixes bumptech#2331.
1 parent 8a1dbe7 commit 3cd0685

File tree

2 files changed

+64
-1
lines changed

2 files changed

+64
-1
lines changed

library/src/main/java/com/bumptech/glide/load/model/LazyHeaders.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.bumptech.glide.load.model;
22

3+
import android.support.annotation.VisibleForTesting;
34
import android.text.TextUtils;
45
import java.util.ArrayList;
56
import java.util.Collections;
@@ -99,7 +100,7 @@ public int hashCode() {
99100
@SuppressWarnings("PMD.FieldDeclarationsShouldBeAtStartOfClass")
100101
public static final class Builder {
101102
private static final String USER_AGENT_HEADER = "User-Agent";
102-
private static final String DEFAULT_USER_AGENT = System.getProperty("http.agent");
103+
private static final String DEFAULT_USER_AGENT = getSanitizedUserAgent();
103104
private static final Map<String, List<LazyHeaderFactory>> DEFAULT_HEADERS;
104105

105106
// Set Accept-Encoding header to do our best to avoid gzip since it's both inefficient for
@@ -221,6 +222,31 @@ private Map<String, List<LazyHeaderFactory>> copyHeaders() {
221222
}
222223
return result;
223224
}
225+
226+
/**
227+
* Ensures that the default header will pass OkHttp3's checks for header values.
228+
*
229+
* <p>See #2331.
230+
*/
231+
@VisibleForTesting
232+
static String getSanitizedUserAgent() {
233+
String defaultUserAgent = System.getProperty("http.agent");
234+
if (TextUtils.isEmpty(defaultUserAgent)) {
235+
return defaultUserAgent;
236+
}
237+
238+
int length = defaultUserAgent.length();
239+
StringBuilder sb = new StringBuilder(defaultUserAgent.length());
240+
for (int i = 0; i < length; i++) {
241+
char c = defaultUserAgent.charAt(i);
242+
if ((c > '\u001f' || c == '\t') && c < '\u007f') {
243+
sb.append(c);
244+
} else {
245+
sb.append('?');
246+
}
247+
}
248+
return sb.toString();
249+
}
224250
}
225251

226252
static final class StringHeaderFactory implements LazyHeaderFactory {

library/src/test/java/com/bumptech/glide/load/model/LazyHeadersTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,43 @@ public void tearDown() {
3535
}
3636
}
3737

38+
// Tests for #2331.
39+
@Test
40+
public void getSanitizedUserAgent_withInvalidAgent_returnsAgentWithInvalidCharactersRemoved() {
41+
String invalidUserAgent =
42+
"Dalvik/2.1.0 (Linux; U; Android 5.0; P98 4G八核版(A8H8) Build/LRX21M)";
43+
String validUserAgent = "Dalvik/2.1.0 (Linux; U; Android 5.0; P98 4G???(A8H8) Build/LRX21M)";
44+
System.setProperty(DEFAULT_USER_AGENT_PROPERTY, invalidUserAgent);
45+
assertThat(LazyHeaders.Builder.getSanitizedUserAgent()).isEqualTo(validUserAgent);
46+
}
47+
48+
@Test
49+
public void getSanitizedUserAgent_withValidAgent_returnsUnmodifiedAgent() {
50+
String validUserAgent = "Dalvik/2.1.0 (Linux; U; Android 5.0; P98 4G(A8H8) Build/LRX21M)";
51+
System.setProperty(DEFAULT_USER_AGENT_PROPERTY, validUserAgent);
52+
assertThat(LazyHeaders.Builder.getSanitizedUserAgent()).isEqualTo(validUserAgent);
53+
}
54+
55+
@Test
56+
public void getSanitizedUserAgent_withMissingAgent_returnsNull() {
57+
System.clearProperty(DEFAULT_USER_AGENT_PROPERTY);
58+
assertThat(LazyHeaders.Builder.getSanitizedUserAgent()).isNull();
59+
}
60+
61+
@Test
62+
public void getSanitizedUserAgent_withEmptyStringAgent_returnsEmptyString() {
63+
String userAgent = "";
64+
System.setProperty(DEFAULT_USER_AGENT_PROPERTY, userAgent);
65+
assertThat(LazyHeaders.Builder.getSanitizedUserAgent()).isEqualTo(userAgent);
66+
}
67+
68+
@Test
69+
public void getSanitizedUserAgent_withWhitespace_returnsWhitespaceString() {
70+
String userAgent = " \t";
71+
System.setProperty(DEFAULT_USER_AGENT_PROPERTY, userAgent);
72+
assertThat(LazyHeaders.Builder.getSanitizedUserAgent()).isEqualTo(userAgent);
73+
}
74+
3875
@Test
3976
public void testIncludesEagerHeaders() {
4077
Map<String, String> headers = new Builder()

0 commit comments

Comments
 (0)