2010-05-04 18 views

risposta

-1

Mayeb Questo? UrlEncode Function

+0

Sto cercando un metodo che non esegue la codifica richiesta per l'URL ma considera solo i limiti specifici delle intestazioni HTTP – antonio

-1

scusate la parte superiore della mia testa ma per l'oggetto di richiesta dovrebbe esserci un oggetto di intestazione che è possibile aggiungere a.

, ad esempio request.headers.add ("blah");

Questo non è azzeccato ma dovrebbe indirizzarti nella giusta direzione.

+0

La domanda riguarda la codifica del valore dell'intestazione, non l'aggiunta dell'intestazione. –

7

È possibile utilizzare HttpEncoder.HeaderNameValueEncode Method in .NET Framework 4.0 e versioni successive.

Per le versioni precedenti di .NET Framework, è possibile ripristinare il proprio codificatore, utilizzando la logica annotato sulla pagina di riferimento HttpEncoder.HeaderNameValueEncode:

  • Tutti i personaggi il cui valore Unicode è inferiore a 32 caratteri ASCII , eccetto il carattere ASCII 9, sono codificati tramite URL in un formato di% NN dove i caratteri N rappresentano valori esadecimali.

  • Il carattere ASCII 9 (il carattere di tabulazione orizzontale) non è codificato tramite URL.

  • Il carattere ASCII 127 è codificato come% 7F.

  • Tutti gli altri caratteri non sono codificati.

Aggiornamento:

Come OliverBock sottolineare il metodo HttpEncoder.HeaderNameValueEncode è protetto e interno. Sono andato a aprire il progetto Mono fonte e ho trovato l'implementazione del mono

void HeaderNameValueEncode (string headerName, string headerValue, out string encodedHeaderName, out string encodedHeaderValue) 
{ 
     if (String.IsNullOrEmpty (headerName)) 
       encodedHeaderName = headerName; 
     else 
       encodedHeaderName = EncodeHeaderString (headerName); 

     if (String.IsNullOrEmpty (headerValue)) 
       encodedHeaderValue = headerValue; 
     else 
       encodedHeaderValue = EncodeHeaderString (headerValue); 
} 

static void StringBuilderAppend (string s, ref StringBuilder sb) 
{ 
     if (sb == null) 
       sb = new StringBuilder (s); 
     else 
       sb.Append (s); 
} 

static string EncodeHeaderString (string input) 
{ 
     StringBuilder sb = null; 

     for (int i = 0; i < input.Length; i++) { 
       char ch = input [i]; 

       if ((ch < 32 && ch != 9) || ch == 127) 
         StringBuilderAppend (String.Format ("%{0:x2}", (int)ch), ref sb); 
     } 

     if (sb != null) 
       return sb.ToString(); 

     return input; 
} 

Cordiali saluti

[qui] (https://github.com/mono/mono/blob/master/mcs/class/System.Web/System.Web.Util/HttpEncoder.cs)

+1

HeaderNameValueEncode() è protetto + interno. –

+1

@OliverBock hai ragione, aggiornato il post. – liuhongbo

+0

Purtroppo né questa versione né la versione .NET (vista tramite Reflector) si preoccupano di codificare correttamente i caratteri '%' già presenti nei dati. –

0

Questo fa lo stesso lavoro di HeaderNameValueEncode(), ma sarà anche codificare% caratteri in modo che l'intestazione possa essere decodificata in modo affidabile in seguito.

static string EncodeHeaderValue(string value) 
{ 
    return Regex.Replace(value, @"[\u0000-\u0008\u000a-\u001f%\u007f]", (m) => "%"+((int)m.Value[0]).ToString("x2")); 
} 

static string DecodeHeaderValue(string encoded) 
{ 
    return Regex.Replace(encoded, @"%([0-9a-f]{2})", (m) => new String((char)Convert.ToInt32(m.Groups[1].Value, 16), 1), RegexOptions.IgnoreCase); 
} 
2

Per me ha aiutato Uri.EscapeDataString (HeaderValue)

Problemi correlati