@@ -212,9 +212,9 @@ public byte[] data
212
212
{
213
213
for ( int i = 0 ; i < formData . Count ; i ++ )
214
214
{
215
- byte [ ] name = WWWTranscoder . URLEncode ( System . Text . Encoding . UTF8 . GetBytes ( ( string ) fieldNames [ i ] ) ) ;
215
+ byte [ ] name = WWWTranscoder . DataEncode ( System . Text . Encoding . UTF8 . GetBytes ( ( string ) fieldNames [ i ] ) ) ;
216
216
byte [ ] formBytes = ( byte [ ] ) formData [ i ] ;
217
- byte [ ] value = WWWTranscoder . URLEncode ( formBytes ) ;
217
+ byte [ ] value = WWWTranscoder . DataEncode ( formBytes ) ;
218
218
219
219
if ( i > 0 ) memStream . Write ( ampersand , 0 , ( int ) ampersand . Length ) ;
220
220
memStream . Write ( name , 0 , ( int ) name . Length ) ;
@@ -234,10 +234,11 @@ internal class WWWTranscoder
234
234
private static byte [ ] ucHexChars = WWWForm . DefaultEncoding . GetBytes ( "0123456789ABCDEF" ) ;
235
235
private static byte [ ] lcHexChars = WWWForm . DefaultEncoding . GetBytes ( "0123456789abcdef" ) ;
236
236
private static byte urlEscapeChar = ( byte ) '%' ;
237
- private static byte urlSpace = ( byte ) '+' ;
237
+ private static byte [ ] urlSpace = new byte [ ] { ( byte ) '+' } ;
238
+ private static byte [ ] dataSpace = WWWForm . DefaultEncoding . GetBytes ( "%20" ) ;
238
239
private static byte [ ] urlForbidden = WWWForm . DefaultEncoding . GetBytes ( "@&;:<>=?\" '/\\ !#%+$,{}|^[]`" ) ;
239
240
private static byte qpEscapeChar = ( byte ) '=' ;
240
- private static byte qpSpace = ( byte ) '_' ;
241
+ private static byte [ ] qpSpace = new byte [ ] { ( byte ) '_' } ;
241
242
private static byte [ ] qpForbidden = WWWForm . DefaultEncoding . GetBytes ( "&;=?\" '%+_" ) ;
242
243
243
244
private static byte Hex2Byte ( byte [ ] b , int offset )
@@ -290,6 +291,22 @@ public static byte[] URLEncode(byte[] toEncode)
290
291
return Encode ( toEncode , urlEscapeChar , urlSpace , urlForbidden , false ) ;
291
292
}
292
293
294
+ public static string DataEncode ( string toEncode )
295
+ {
296
+ return DataEncode ( toEncode , Encoding . UTF8 ) ;
297
+ }
298
+
299
+ public static string DataEncode ( string toEncode , Encoding e )
300
+ {
301
+ byte [ ] data = Encode ( e . GetBytes ( toEncode ) , urlEscapeChar , dataSpace , urlForbidden , false ) ;
302
+ return WWWForm . DefaultEncoding . GetString ( data , 0 , data . Length ) ;
303
+ }
304
+
305
+ public static byte [ ] DataEncode ( byte [ ] toEncode )
306
+ {
307
+ return Encode ( toEncode , urlEscapeChar , dataSpace , urlForbidden , false ) ;
308
+ }
309
+
293
310
public static string QPEncode ( string toEncode )
294
311
{
295
312
return QPEncode ( toEncode , Encoding . UTF8 ) ;
@@ -306,7 +323,7 @@ public static byte[] QPEncode(byte[] toEncode)
306
323
return Encode ( toEncode , qpEscapeChar , qpSpace , qpForbidden , true ) ;
307
324
}
308
325
309
- public static byte [ ] Encode ( byte [ ] input , byte escapeChar , byte space , byte [ ] forbidden , bool uppercase )
326
+ public static byte [ ] Encode ( byte [ ] input , byte escapeChar , byte [ ] space , byte [ ] forbidden , bool uppercase )
310
327
{
311
328
using ( MemoryStream memStream = new MemoryStream ( input . Length * 2 ) )
312
329
{
@@ -315,7 +332,7 @@ public static byte[] Encode(byte[] input, byte escapeChar, byte space, byte[] fo
315
332
{
316
333
if ( input [ i ] == 32 )
317
334
{
318
- memStream . WriteByte ( space ) ;
335
+ memStream . Write ( space , 0 , space . Length ) ;
319
336
}
320
337
else if ( input [ i ] < 32 || input [ i ] > 126 || ByteArrayContains ( forbidden , input [ i ] ) )
321
338
{
@@ -361,6 +378,22 @@ public static byte[] URLDecode(byte[] toEncode)
361
378
return Decode ( toEncode , urlEscapeChar , urlSpace ) ;
362
379
}
363
380
381
+ public static string DataDecode ( string toDecode )
382
+ {
383
+ return DataDecode ( toDecode , Encoding . UTF8 ) ;
384
+ }
385
+
386
+ public static string DataDecode ( string toDecode , Encoding e )
387
+ {
388
+ byte [ ] data = Decode ( WWWForm . DefaultEncoding . GetBytes ( toDecode ) , urlEscapeChar , dataSpace ) ;
389
+ return e . GetString ( data , 0 , data . Length ) ;
390
+ }
391
+
392
+ public static byte [ ] DataDecode ( byte [ ] toDecode )
393
+ {
394
+ return Decode ( toDecode , urlEscapeChar , dataSpace ) ;
395
+ }
396
+
364
397
public static string QPDecode ( string toEncode )
365
398
{
366
399
return QPDecode ( toEncode , Encoding . UTF8 ) ;
@@ -377,15 +410,26 @@ public static byte[] QPDecode(byte[] toEncode)
377
410
return Decode ( toEncode , qpEscapeChar , qpSpace ) ;
378
411
}
379
412
380
- public static byte [ ] Decode ( byte [ ] input , byte escapeChar , byte space )
413
+ private static bool ByteSubArrayEquals ( byte [ ] array , int index , byte [ ] comperand )
414
+ {
415
+ if ( array . Length - index < comperand . Length )
416
+ return false ;
417
+ for ( int i = 0 ; i < comperand . Length ; ++ i )
418
+ if ( array [ index + i ] != comperand [ i ] )
419
+ return false ;
420
+ return true ;
421
+ }
422
+
423
+ public static byte [ ] Decode ( byte [ ] input , byte escapeChar , byte [ ] space )
381
424
{
382
425
using ( MemoryStream memStream = new MemoryStream ( input . Length ) )
383
426
{
384
427
// decode
385
428
for ( int i = 0 ; i < input . Length ; i ++ )
386
429
{
387
- if ( input [ i ] == space )
430
+ if ( ByteSubArrayEquals ( input , i , space ) )
388
431
{
432
+ i += space . Length - 1 ;
389
433
memStream . WriteByte ( ( byte ) 32 ) ;
390
434
}
391
435
else if ( input [ i ] == escapeChar && i + 2 < input . Length )
0 commit comments