2016-05-17 23 views
0

Javaでソケットプログラミングの学習を始めたばかりで、私はすでに異常な動作が発生しました。ここにコードスニペットがありますJavaソケットプログラミング - 301 HTTP 1.1のエラー

writer.println("GET " + path + " " + protocol); 
//writer.println(); 
writer.println("Host: " + hostname); 
writer.println(); 
writer.flush(); 

これは、HTTP 1.1と1.0の両方で「301 Moved Permanently」コードを取得します。私は

writer.println("GET " + path + " " + protocol); 
writer.println(); 
writer.println("Host: " + hostname); 
writer.println(); 
writer.flush(); 
要求とホスト名の間に空行のコメントを解除した場合はHTTP 1.1とHTTP 1.0の "HTTP/1.1 200 OK" のために私に"HTTP/1.1 400不正な要求" を与えるだろう。

なぜこのような現象がありますか?これは、HTTP 1.0で要求があり、応答がHTTP 1.1であるために起こりますか?

ありがとうございました。

答えて

0

これにより、HTTP 1.1と1.0の両方で「301 Moved Permanently」コードが得られます。

HTTP status code 301新しいURLへのリダイレクトです:

要求されたリソースは新しい恒久的なURIが割り当てられており、このリソースへの将来の参照が返されたURIのいずれかを使用すべきです。リンク編集機能を持つクライアントは、可能であれば、サーバーが返す新しい参照の1つ以上にRequest-URIへの参照を自動的に再リンクする必要があります。この応答は、別途指示がない限りキャッシュ可能です。

新しい永続URIは、応答の[場所]フィールドで指定する必要があります(SHOULD)。リクエストメソッドがHEADでない限り、レスポンスのエンティティは新しいURIへのハイパーリンクを持つ短いハイパーテキストを含めるべきである(SHOULD)。

GETまたはHEAD以外の要求に応答して301ステータスコードが受信された場合、ユーザーエージェントは、ユーザーが確認できる場合を除いて、要求を自動的にリダイレクトしてはなりません発行された。

注:301ステータスコードを受信した後にPOSTリクエストを自動的にリダイレクトすると、既存のHTTP/1.0ユーザエージェントの一部が間違ってGETリクエストに変更されます。

サーバーから、GETリクエストを送信したURLが有効ではなくなったというメッセージが表示されます。サーバーの応答からLocationヘッダーの値を抽出し、指定されたURLに同じ要求を繰り返す必要があります。

HTTP 1.1では「HTTP/1.1 400 Bad Request」、HTTP 1.0では「HTTP/1.1 200 OK」と表示されます。

なぜこのような現象がありますか?これは、HTTP 1.0で要求があり、応答がHTTP 1.1であるために起こりますか?

Hostヘッダは、HTTP 1.0で任意あるが、HTTP 1が必要です。1:

クライアントは、すべてのHTTP/1.1要求メッセージにホストヘッダーフィールドを含める必要があります。要求されたURIに、要求されているサービスのインターネットホスト名が含まれていない場合は、Hostヘッダーフィールドに空の値を指定する必要があります。 HTTP/1.1プロキシは、それが転送する要求メッセージに、プロキシによって要求されているサービスを識別する適切なHostヘッダーフィールドが含まれていることを保証しなければならない(MUST)。 すべてのインターネットベースのHTTP/1.1サーバーは、HostヘッダーフィールドがないHTTP/1.1要求メッセージに対して400(Bad Request)ステータスコードで応答しなければならない。

だから、あなたは余分な空白行を挿入していないとき、あなたは別に、これらの要求を送信し終わる:両方とも有効です

GET /path HTTP/1.0 
Host: hostname 

GET /path HTTP/1.1 
Host: hostname 

を。

しかし、あなたは余分な空白行を挿入したとき、あなたは実際には、一度に二つの別々のリクエストを送信している:

GET /path HTTP/1.x; 

Host: hostname 

リクエストヘッダとリクエストボディが空白で区切られGET要求には要求本体がないため、最初の空白行は要求を終了します。

この場合、最初の要求はHTTP 1.0に対してのみ有効で、HostヘッダーがないためHTTP 1.1では無効です。 2つ目のリクエストはどちらのバージョンでも単純ではありません。

+0

ありがとうございます、今、私にはもっと意味があります。私はちょうどサーバーからの応答を確認し、新しい場所を抽出するためにいくつかの行を追加しました。それは完璧に正常に動作します。あなたの助けを本当に感謝します、私は十分な評判を持っていないので、私はまだこれを投票することはできません:( – hvuong91

関連する問題