2012-08-26 22 views
22

Nagłówek żądania HTTP/1.1 Accept jest określony w RFC 2616, section 14.1.Jak interpretować pusty nagłówek HTTP Accept?

składnia Za podana jest tak:

Accept   = "Accept" ":" 
        #(media-range [ accept-params ]) 

# bez numeru stwierdza zero lub więcej według section 2.1. Jednak sekcja 14.1 nie zawiera żadnych stwierdzeń dotyczących interpretacji pustego nagłówka Accept. Jest to przeciwieństwo do section 14.2, które mówi o Accept-Encoding, w którym jest używane nie tylko 1# (jeden lub więcej), ale także przypadek dla pustego nagłówka Accept-Encoding jest określony, co jest dość dziwne. Niektóre inne sekcje dotyczące nagłówków żądań są również specyficzne dla specjalnego przypadku pustej wartości.

Jeżeli jedna traktować pustyAccept nagłówek równoważnie do nieistniejącegoAccept nagłówku? Czy są jakieś oficjalne materiały na ten temat?

Odpowiedz

22

Od RFC2616 Sec4.2:

Każdy nagłówek pole składa się z nazwy a następnie dwukropek (":") oraz wartości pola.

Na pierwszy rzut oka wydawałoby się, że umieszcza wiadomości, które określają puste wartości nagłówków w źle skonstruowanej, niezgodnej kategorii. Jednak zwiększona forma BNF nakreślono w RFC2616 Sec2.1 wskazuje

„#element” pozwala na dowolną liczbę, włącznie zera

Ponieważ jest to deklaracja używany do określenia wartości nagłówka Accept, wydaje się, że puste wartości są ważne.

analizowania pustych nagłówki i nagłówki z białych spacji może być problematyczne, ponieważ należy do kierunku od specyfikacji:

pole, zawartość nie zawiera żadnych początkowych lub końcowe LWS: liniowa białej przestrzeni występującej zanim pierwszy nieliniowy znak wartości pola lub po ostatnim nieliniowym znaku wartości pola . Takie wiodące lub końcowe LWS MOGĄ być usuwane bez zmiany semantyki wartości pola. Każde LWS występujące pomiędzy polem o treści MOŻE zostać zastąpione pojedynczym SP przed interpretacją wartości pola lub przesłaniem komunikatu poniżej.

IMHO, wysłanie pustego nagłówka jest całkowicie bezsensowne. Nie powinno się tego robić, a parsery mogą nieprawidłowo analizować te nagłówki.Tradycyjnie, ludzie, którzy chcą obejść te ograniczenia, gdy do czynienia z elementów niezgodnych określono wartości „pseudo-empty” tak:

X-MyCustomHeader: ""

Jeśli chcesz po prostu potwierdzić, że pole nagłówka został wysłany jako część w postaci przełącznika boolowskiego, rozważ wysyłanie wartości zastępczej, jak wyżej, zamiast pustej wartości.


Aktualizacja

Chyba nie było bardzo jasne, bezpośrednio odpowiadając na pytanie: w przypadku pustego nagłówka Accept naprawdę masz dwie opcje:

  • Wyślij 406 Not Acceptable odpowiedź, aby poinformować klienta, że ​​nie oferuje żadnych typów zawartości dla pustej wartości Accept (duh).

to jest uzasadnione, ale nie jest to wymagane RFC2616 Sec14.1:

Jeśli pole Zebrane nagłówek jest obecne, a serwer nie może wysłać odpowiedź które są akceptowalne według nomenklatury Accept pola wartością , wtedy serwer POWINIEN wysłać odpowiedź 406 (nieakceptowalną).

  • Albo, ponieważ nie jest to wymagane i jest to bardzo mało prawdopodobne, że użytkownik nie akceptuje żadnych rodzajów treści (w przeciwnym razie, dlaczego mieliby przejmować wysłać wniosek?) ... Proponuję traktowanie pustej wartości Accept: (jeśli odrzucanie wiadomości nie jest opcją) jest takie samo jak Accept: */*.
+0

Nie zgadzam się z pustymi nagłówkami, które są zniekształcone, zwłaszcza że sama specyfikacja odnosi się do pustych nagłówków (zobacz mój przykład Accept-Encoding). Aby nadać kontekst, rozwijam oprogramowanie pośredniczące Pythona i zastanawiam się nad ewentualnymi i testuję je. Poszedłem do założenia '' */* '', które wydaje mi się rozsądne. Dzięki za poświęcenie czasu! –

+0

Uważam także, że "400 Złych Zleceń" byłoby bardziej odpowiednie niż "Niedozwolone 406", przynajmniej jeśli założymy, że jest to naruszenie specyfikacji. W tym przypadku nie mogliśmy ustalić, co klient faktycznie akceptuje. –

+0

Wiesz, masz rację co do 2616-2.1 - formularz '# element' wskazuje, że puste wartości nagłówków są w porządku. Zamierzam zaktualizować moją odpowiedź, aby to odzwierciedlić i uniknąć dezinformacji. Poza tym myślę, że powoduje to albo odpowiedź 406, albo też traktuje ją jak "Accept: */*". Ale prawdopodobnie nie jest to 400, ponieważ nie jest technicznie niepoprawną wiadomością. – rdlowrey

4

Według http://tools.ietf.org/html/rfc7231#section-5.3.2:

Żądanie bez Zebrane pole nagłówka oznacza, że ​​aplikacja kliencka będzie akceptować każdy rodzaj nośnika w odpowiedzi.

Powinieneś traktować nieistniejący nagłówek Accept jako */*.

+0

To prawda, ale powołujesz się na przestarzałą specyfikację. –

+0

jest obecną specyfikacją tego: https://tools.ietf.org/html/rfc2616#section-14.1? – cd1

+1

Nie. RFC 2616 został zastąpiony przez RFC 7230 itp. –

Powiązane problemy