web-dev-qa-db-ja.com

HTTPヘッダーの不正な文字

HttpUrlConnectionを作成していて、複数のカスタムヘッダーを設定する必要があります。

次の行に沿って何かをしたいのですが、ヘッダーマップのコンテンツは単一の文字列から取得する必要があります。 HTTPヘッダー名と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());

今のところ解決策

HTTPヘッダー名にスペースが含まれていないようです(通常は代わりにダッシュを使用しますか?)。そのため、単一のスペースを使用して名前で値を区切ることができます。名前と値のセットに関しては、与えられた答えによれば、値にはほとんど何でも含めることができるので、私はうんざりしているようです。だから私はちょうど使用されない可能性が最も高いと確信している文字を選びました:§。実際に必要であることが判明した場合は、コードを調整する必要があります:p

Header1 Value1§Header2 Value2§Header3 Header3
17
Svish

RFC7230からの関連するBNFは次のとおりです。

field-name = token

token = 1*tchar

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

文字セットはUSASCIIで表示されます。

RFC 7230はあなたの質問よりも新しいものですが、関連する詳細では、以前はRFC 2616で述べられていたものを変更しません。

フィールド名には、RFCで許可されているものよりもはるかに制限の厳しい規則があり、これはさまざまな実装でさまざまな程度に実施されます。フィールド名は通常、[ASCII/NUMERAL]ワードのシーケンスのパターンに従い、各ワードの最初の文字(のみ)が大文字になります。単語は単一のハイフンで区切られます。

したがって、たとえば「HttpUrlConnection」はHTTPヘッダー名であると想定されていました(Javaトークン)ではなく)、「Http-Url-Connection」と呼びます。

1つのWordに複数の大文字を認めないように厳密に実装された実装までバグを追跡したことを覚えています(たまたま頭字語でした)。つまりこのより制限されたフォーマットに非常に厳密に従うことは価値があります。

  • 非ASCII文字セットは、フィールド値で使用される場合がありますが、フィールド名では機能しません。

  • フィールド名のエスケープは、標準ではサポートされていません。値のエスケープはHTTPまたはMIME標準の問題ではありませんが、名前と値のペアのセットをエンコードするために標準のURLエンコード方式を再利用することを選択できます。

16
mc0e