@@ -111,11 +111,10 @@ private Utf8UrlEncoder() {
111
111
}
112
112
113
113
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 ();
117
116
}
118
-
117
+
119
118
public static StringBuilder encodeAndAppendQuery (StringBuilder sb , String query ) {
120
119
return appendEncoded (sb , query , BUILT_QUERY_UNTOUCHED_CHARS , false );
121
120
}
@@ -134,17 +133,52 @@ public static StringBuilder encodeAndAppendFormElement(StringBuilder sb, CharSeq
134
133
return appendEncoded (sb , input , FORM_URL_ENCODED_SAFE_CHARS , true );
135
134
}
136
135
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
+
137
169
private static StringBuilder appendEncoded (StringBuilder sb , CharSequence input , BitSet dontNeedEncoding , boolean encodeSpaceAsPlus ) {
138
170
int c ;
139
171
for (int i = 0 ; i < input .length (); i += Character .charCount (c )) {
140
172
c = Character .codePointAt (input , i );
141
- if (c <= 127 )
142
- if (dontNeedEncoding .get (c ))
173
+ if (c <= 127 ) {
174
+ if (dontNeedEncoding .get (c )) {
143
175
sb .append ((char ) c );
144
- else
176
+ } else {
145
177
appendSingleByteEncoded (sb , c , encodeSpaceAsPlus );
146
- else
178
+ }
179
+ } else {
147
180
appendMultiByteEncoded (sb , c );
181
+ }
148
182
}
149
183
return sb ;
150
184
}
0 commit comments