Skip to content

Commit 672f70b

Browse files
committed
Lazy allocate StringBuilder for path encoding
1 parent 35d5d9c commit 672f70b

File tree

1 file changed

+42
-8
lines changed

1 file changed

+42
-8
lines changed

client/src/main/java/org/asynchttpclient/util/Utf8UrlEncoder.java

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,10 @@ private Utf8UrlEncoder() {
111111
}
112112

113113
public static String encodePath(String input) {
114-
StringBuilder sb = new StringBuilder(input.length() + 6);
115-
appendEncoded(sb, input, BUILT_PATH_UNTOUCHED_CHARS, false);
116-
return sb.toString();
114+
StringBuilder sb = lazyAppendEncoded(null, input, BUILT_PATH_UNTOUCHED_CHARS, false);
115+
return sb == null? input : sb.toString();
117116
}
118-
117+
119118
public static StringBuilder encodeAndAppendQuery(StringBuilder sb, String query) {
120119
return appendEncoded(sb, query, BUILT_QUERY_UNTOUCHED_CHARS, false);
121120
}
@@ -134,17 +133,52 @@ public static StringBuilder encodeAndAppendFormElement(StringBuilder sb, CharSeq
134133
return appendEncoded(sb, input, FORM_URL_ENCODED_SAFE_CHARS, true);
135134
}
136135

136+
private static StringBuilder lazyInitStringBuilder(CharSequence input, int firstNonUsAsciiPosition) {
137+
StringBuilder sb = new StringBuilder(input.length() + 6);
138+
for (int i = 0; i < firstNonUsAsciiPosition; i++) {
139+
sb.append(input.charAt(i));
140+
}
141+
return sb;
142+
}
143+
144+
private static StringBuilder lazyAppendEncoded(StringBuilder sb, CharSequence input, BitSet dontNeedEncoding, boolean encodeSpaceAsPlus) {
145+
int c;
146+
for (int i = 0; i < input.length(); i+= Character.charCount(c)) {
147+
c = Character.codePointAt(input, i);
148+
if (c <= 127) {
149+
if (dontNeedEncoding.get(c)) {
150+
if (sb != null) {
151+
sb.append((char) c);
152+
}
153+
} else {
154+
if (sb == null) {
155+
sb = lazyInitStringBuilder(input, i);
156+
}
157+
appendSingleByteEncoded(sb, c, encodeSpaceAsPlus);
158+
}
159+
} else {
160+
if (sb == null) {
161+
sb = lazyInitStringBuilder(input, i);
162+
}
163+
appendMultiByteEncoded(sb, c);
164+
}
165+
}
166+
return sb;
167+
}
168+
137169
private static StringBuilder appendEncoded(StringBuilder sb, CharSequence input, BitSet dontNeedEncoding, boolean encodeSpaceAsPlus) {
138170
int c;
139171
for (int i = 0; i < input.length(); i+= Character.charCount(c)) {
140172
c = Character.codePointAt(input, i);
141-
if (c <= 127)
142-
if (dontNeedEncoding.get(c))
173+
if (c <= 127) {
174+
if (dontNeedEncoding.get(c)) {
143175
sb.append((char) c);
144-
else
176+
} else {
145177
appendSingleByteEncoded(sb, c, encodeSpaceAsPlus);
146-
else
178+
}
179+
} else {
147180
appendMultiByteEncoded(sb, c);
181+
}
148182
}
149183
return sb;
150184
}

0 commit comments

Comments
 (0)