HTTP 応答コード302とLocationヘッダの動作を検証する

数年前にHTTPを学習していたときのことを思い出したのでメモしておこうと思う。


HTTPの応答コード302とLocationヘッダは、主にWebリクエストを
リダイレクトするために用いられる。このリダイレクトの動作を
検証してみる。


応答コード302とLocationヘッダの動作を検証するために
以下のようなC#によるHTTPサーバーを実装した
これは、如何なるリクエストにも「HTTP/1.1 302 Found」を返し、
Googleのトップページにリダイレクトする超簡易HTTPサーバーである。

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;

class Program
{
    static void Main()
    {
        TcpListener listener = 
            new TcpListener(IPAddress.Loopback, 60000);
        
        listener.Start();
        
        using (TcpClient tcpClient = listener.AcceptTcpClient())
        {
            //ブラウザからのリクエストを読み込む
            StreamReader reader = 
                new StreamReader(tcpClient.GetStream());
            String s;
            while ( (s = reader.ReadLine()) != null )
            {
                //改行のみの行であれば、リクエストは終端であるので
                //ループから脱出し、読み込みを終える
                if (s.Length == 0)
                {
                    break;
                }
            }

            //HTTPのLocationヘッダに 
            //「http://www.google.co.jp/」を指定して
            //レスポンスを返す
            StreamWriter writer = 
                new StreamWriter(tcpClient.GetStream());
            
            writer.WriteLine("HTTP/1.1 302 Found");
            writer.WriteLine("Location: http://www.google.co.jp/");
            writer.WriteLine();

            //StreamWriterは、バッファリングしているので
            //Flushしないとデータがネットワークに転送されない
            writer.Flush();
        }
    }
}

このプログラムを実行して、 http://127.0.0.1:60000/ にブラウザからアクセスすると
http://www.google.co.jp にリダイレクトされることを確認する。



1.まず、プログラムを実行する。Localhost(127.0.0.1)で60000番ポートでリスニング状態になる


2.この状態でブラウザを起動し、URLに「http://127.0.0.1:60000」を入力する。


3.ブラウザでEnterボタンを押して、URLにアクセスする。ブラウザからのリクエストの内容がコンソールに表示される




4.ブラウザは、302の応答とLocationヘッダを解釈し、Googleのトップページにリダイレクトする。