2008-11-01 9 views
23

¿Alguien tiene alguna sugerencia (o una expresión regular) para analizar el encabezado HTTP Accept?Parse Aceptar encabezado

Estoy tratando de hacer algo de negociación de tipo de contenido en ASP.NET MVC. No parece haber un camino construido (lo cual está bien, porque hay muchas escuelas de pensamiento aquí), pero el análisis no es del todo trivial y prefiero no reinventar la rueda si alguien ya lo ha hecho está bien y está dispuesto a compartir.

+0

Buena pregunta: ¡Estoy buscando esto en otro proyecto, también! –

Respuesta

9

¿Has visto this article? Proporciona una implementación bastante completa para analizar el encabezado Aceptar y, posteriormente, hacer algo útil con él.

0

El RFC es bastante complejo. Si la expresión regular siguiera estas reglas al pie de la letra, se convertiría en varias líneas de longitud.

Si ya tiene el Accept-cabecera, e ignorar las citas y los parámetros, se puede hacer algo como esto para que coincida con cada par:

/([^()<>@,;:\\"\/[\]?={} \t]+)\/([^()<>@,;:\\"\/[\]?={} \t]+)/ 

* se incluye en la clase de caracteres, por lo que hace no necesita ningún caso especial en la expresión regular.

3

Tengo written a parser en PHP. No es complejo, pero le dará una variedad de tipos de mime en orden de preferencia.

+0

el sitio vinculado está "deshabilitado" – MageWind

1

encontrado otra aplicación en php here

0

a partir de .NET 4.5 (creo que es de Microsoft han hecho información sobre las versiones marco < 4,5 oscuros en lugar estos días), puede utilizar one of the the built in parsers de System.Net.Http.Headers:

public IOrderedEnumerable<MediaTypeWithQualityHeaderValue> GetMediaTypes(string headerValue) => 
    headerValue?.Split(',') 
     .Select(MediaTypeWithQualityHeaderValue.Parse) 
     .OrderByDescending(mt => mt.Quality.GetValueOrDefault(1)); 

entonces usted puede hacer algo como esto:

var headerValue = "application/json, text/javascript, */*; q=0.01"; 
var mediaTypes = GetMediaTypes(headerValue); 

que le da una buena lista de todos los tipos de medios, donde el preferidos opción es el primer elemento. He aquí una LINQPad Dump del resultado de la mediaTypes ejemplo:

LINQPad dump of results

Sombrero de punta a this answer, por meterme en el camino correcto.