2013-09-26 5 views
15

Tworzę HttpUrlConnection i trzeba ustawić wiele niestandardowych nagłówków.Niedozwolone znaki w nagłówkach HTTP

Chciałbym zrobić coś podobnego, ale zawartość mapy nagłówka musi pochodzić z jednego ciągu. Czy są jakieś znaki, które są nielegalne lub bardzo rzadko używane w nazwach nagłówków HTTP i nagłówkach HTTP?

HashMap<String, String> headers = new HashMap<String, String>(); 

// TODO: How can I fill the headers map reliably from a single string? 

HttpURLConnection c = (HttpURLConnection) url.openConnection(); 
for(Map.Entry<String, String> e : headers.entrySet()) 
    c.setRequestProperty(e.getKey(), e.getValue()); 

Rozwiązanie Dotychczas

nie wydaje się jakiegokolwiek nagłówka HTTP nazwy zawierać spacji (zwykle używać kreskę zamiast?), Więc mogę oddzielić nazwę z wartością za pomocą pojedyncza przestrzeń. Jeśli chodzi o zestawy wartości nazw, wydaje mi się, że jestem wkręcony, ponieważ wartość może zawierać prawie wszystko zgodnie z podaną odpowiedzią. Wybrałam więc postać, której jestem prawie pewna, najprawdopodobniej nigdy nie zostanie użyta: §. Jeśli okaże się, jest to rzeczywiście potrzebne, po prostu trzeba dostosować mój kod: p

Header1 Value1§Header2 Value2§Header3 Header3 
+0

Zobacz tutaj: http://stackoverflow.com/questions/4400678/http-header-ould-use-what-character-encoding –

Odpowiedz

8

[Przyjęty odpowiedź od @ Stephen-C jest zasadniczo błędne, więc wydaje się, warto poprawić rekord, mimo . pytanie jest dość stary]

Odpowiedni BNF z RFC7230 jest:

field-name = token 

token = 1*tchar 

tchar = "!"/"#"/"$"/"%"/"&"/"'"/"*"/"+"/"-"/
     "."/"^"/"_"/"`"/"|"/"~"/DIGIT/ALPHA 

zestaw znaków jest widoczny USASCII.

RFC 7230 jest nowsza niż pytanie, ale w odpowiednich konkretów, to nie zmienia to, co zostało oficjalnie powiedziane przez RFC 2616.

Istnieje bardzo silna konwencja nazw terenowych, który jest znacznie bardziej restrykcyjne niż to, co zezwala na to RFC, a to jest wymuszane w różnym stopniu w różnych implementacjach. Nazwy pól zwykle podążają za wzorcem sekwencji słów [ASCII/NUMERAL] z pierwszą literą (tylko) każdego słowa pisanego wielkimi literami. Słowa są oddzielone pojedynczym łącznikiem.

Tak więc, na przykład "HttpUrlConnection" miał być nazwą nagłówka HTTP (a nie tokenem Java), nazwałbyś go "Http-Url-Connection".

Przypomina mi się, że raz śledzenie błędu w niektórych implementacjach było wystarczająco surowe, aby nie dopuścić do wielokrotnych wielkich liter w jednym słowie (co akurat było akronimem). To znaczy. opłaca się bardzo ściśle przestrzegać tego bardziej ograniczonego formatu.

@ Stephen-C jest niewłaściwe, że:

  • ISO-8859-1 odgrywa żadnej roli w polu nazw, choć może on być stosowany w wartości pól.

  • Kwestia ucieczki w nazwach pól nie jest w najmniejszym stopniu mętna. Nie jest obsługiwany przez standard.

  • https://bugzilla.mozilla.org/show_bug.cgi?id=601933 dotyczy konkretnego pola wartość implementacja, a nie nazwa pola.