2010-05-04 20 views

Respuesta

-1

Mayeb This one? UrlEncode Function

+0

Estoy buscando un método que no realiza la codificación requerida para la URL, pero solo tiene en cuenta las limitaciones específicas de los encabezados HTTP – antonio

-1

lo siento fuera de la cabeza, pero para su objeto de solicitud debe haber un objeto de encabezados que puede agregar.

es decir, request.headers.add ("blah");

Eso no se ve pero debe apuntar en la dirección correcta.

+0

La pregunta es sobre la codificación del valor del encabezado, no sobre la adición de un encabezado. –

7

Puede usar el HttpEncoder.HeaderNameValueEncode Method en .NET Framework 4.0 y superior.

Para versiones anteriores de .NET Framework, puede rodar su propio codificador, usando la lógica indica en la página de referencia HttpEncoder.HeaderNameValueEncode:

  • Todos los caracteres Unicode cuyo valor es inferior a 32 caracteres ASCII , excepto el carácter ASCII 9, están codificados en URL en un formato de% NN donde los caracteres N representan valores hexadecimales.

  • El carácter ASCII 9 (el carácter de tabulación horizontal) no tiene codificación URL.

  • El carácter ASCII 127 está codificado como% 7F.

  • Los demás caracteres no están codificados.

Actualización:

Como OliverBock señalar el método HttpEncoder.HeaderNameValueEncode está protegido e interna. Fui a abrir proyecto Mono fuente y encontré la implementación 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; 
} 

Para su información

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

+1

HeaderNameValueEncode() está protegido + interno. –

+1

@OliverBock tienes razón, actualizaste la publicación. – liuhongbo

+0

Lamentablemente, ni esta versión ni la versión .NET (vista a través de Reflector) se molestan en codificar correctamente los caracteres '%' que ya están en los datos. –

0

Esto hace el mismo trabajo que HeaderNameValueEncode(), sino también codificará% caracteres para que el encabezado pueda decodificarse confiablemente más tarde.

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

Para me ayudó Uri.EscapeDataString (HeaderValue)

Cuestiones relacionadas