2016-12-12 7 views
1

Accept-Languageヘッダーを解析します。私が見つけたすべての答えは、文字列の解析には関係しますが、不正な形式の入力の場合は扱いません。不正な形式のAccept-Language HTTPヘッダーを検出します。

たとえば、ユーザーがこのヘッダーAccept-Language: en,es;q=0.5;*;q=0.5を送信していて、2番目の;のためにフォーマットが不適切な場合はどうなりますか?簡単な解析と適切な例外発生を提供できるパッケージはありますか?あなたがAccept-Languageヘッダの適切なフォーマットを理解することから始めなければならない

+0

これは確かにどの言語を使用しているのか、また「解析する」言語の意味はどうかによって異なります。 'en'や' es'のようなトークンを取得したいだけですか? 'q = 0.5'で何をしたいですか?あなたはそれを無視するか、エラーを投げたいですか? –

+0

ひどくフォーマットされたヘッダーの場合、私はユーザーに認識させたいが、ひどくフォーマットされたヘッダーを検出するには、自分自身でハードコーディングしないことを好む。 – LetsPlayYahtzee

+0

"良い"ヘッダーはどのように見えるのだろうか? 誰かが適切にフォーマットされたヘッダーのルールを定義する必要があります。そのルールを使用してヘッダーを解析することができます。ある時点でヘッダーがルールに対応していない場合は、フォーマットが正しくありません。 'q = 0.5'は重みを表し、言語ニーモニックの後に常に現れるはずです。 –

答えて

0

まず:https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4

あなたはAccept-Languageヘッダフィールドの定義を見ることができますが、次のとおりです。

Accept-Language = "Accept-Language" ":" 
        1#(language-range [ ";" "q" "=" qvalue ]) 
     language-range = ((1*8ALPHA *("-" 1*8ALPHA)) | "*") 

適切にフォーマットされたヘッダの例です。 :Accept-Language: da, en-gb;q=0.8, en;q=0.7。各コンマ,は言語タプルを区切ります。各言語タプルはlanguage-rangequality weightです(オプション)。

Accept-Languageヘッダーがどのように定義されているか分かったので、唯一の問題はそれを解析する方法です。

あなたは言語に応じてさまざまな方法でこれを実装することができますが、私は擬似コードを書きます:エラーに対処する言語に応じて異なる

function parseAcceptLanguageHeader(headerValue): 
    parsedLanguages = [] 
    languageStrings = headerValue.split(",") 
    foreach languageStrings as S do 
     parsedLanguages.add(parse(S)) 
    return parsedLanguages 


// Here we define parse(S) 
function parse(S): // expecting format of S to be like: 'language-range [";q=<number>"]' 
    vals = S.trim().split(";") // remove leading and trailing spaces and split by ; 
    if vals.length == 1: // means 'q=qvalue' part is missing 
     return vals[0].trim(), 1.0 // default q is 1.0; you can additionally verify that vals[0] is one of the languages that you support 
    else if vals.length == 2: 
     return vals[0].trim(), parseQuality(vals[1]) 
    else raise an error ("Expected two tokens but, got: " + S) 


// Implement parse quality 
function parseQuality(S): 
    // We expect to see 'q=<number>' 
    vals = q.split("=") 
    if (vals.length != 2): 
    raise an error ("Expected exactly two tokens for quality, but got: " + S) 
    else if (vals[0] != 'q'): 
    raise an error ("Expected quality (q) but got: " + S) 
    else 
    return parseInt(vals[1].trim()) // This can also throw an error, but I am not going to write implementation for that function 

注意を。

+0

申し訳ありませんが、答えは私の質問にまったく対応していません。最初に私はあなたが私の質問が同じようにそして第二に指示していないので私が正しいフォーマットを知らないと仮定した理由を見ません、私が尋ねるのは、ヘッダーの解析と世話をすることができるパッケージ私はそれが私自身に検出を実装することを避けたいと思います。あなたが言ったように、ヘッダーのフォーマットがプロトコルで正しく指定されているので、ある種のプロトコルバリデーターがそのジョブを行うことができるかもしれません。 – LetsPlayYahtzee

+0

わかりました。私はあなたが混乱を避けるためにもっと明示的にすべきだと思います。あなたは特定の言語の図書館を探していますか、それともあなたにとって重要ではないですか? –

+0

はい、私は時間を取るためのthnx、pythonパッケージを探しています – LetsPlayYahtzee

関連する問題