본문 바로가기

C#/근웹 연대기

c#으로 근본 없는 웹서버 개발기 12 : Redirect

⚠WARNING
ASP.NET에 대한 포스팅이 아닙니다
나가실 문은 오른쪽 하단입니다

 

 

웹서버에서 어떤 특정한 조건에서, 다른 URL로 유도하는 것이 redirect라고 한다.

여담으로, 나는 처음 이것을 공부할 때, 어떤 이유로 Redirect를 하면 리퀘스트 값이 없어지는지 혼란스러웠다.

리퀘스트 값을 계속 유지하면 그것을 재활용하여 코드를 더 간결하게 작성할 수 있을 것 같았기 때문이다.

그렇다

그때는 동작원리를 잘 몰랐기 때문이다. (정말 간단한 것을...)

...

그때를 회상하며 응답 헤더가 되는 부분을 다음과 같이 작성하였다.

static void reDirect(Socket client, string url)
{
    var sb = new StringBuilder(100);

    sb.AddL("HTTP/1.1 302 Found");
    sb.AddL("date: " + Util.uTime);
    sb.AddL("Server: test server");
    sb.AddL("location: " + url);
    sb.AddL("Content-Length: 0");
    sb.AddL("Connection: close");
    sb.AddL();
    client.Send(Encoding.UTF8.GetBytes(sb.ToString()));
}

설명: 새 URL로 클라이언트를 유도한다. URL은 절댓값과 상대 값 둘 다 사용 가능하다.

 

 

그리고 URL에 따라 분기하는 코드를 작성하였다.

switch (req.url)
{
    case "/":
        req.url = "/index.html"; break;
    case "/test/send":
        req.Sess["name"] = req.param.Get("name");
        reDirect(client, "/test/reply"); return;
    case "/test/reply":
        resText(client, req.Sess.GetD("name","Null") + "님 반갑습니다."); return;
}

response(req);

설명: /test/send로 form데이터를 받으면 세션에 값을 저장한 후,  /test/reply로 rediret 하도록 하였다.

 

 

resText 부분

static void resText(Socket client, string msg="" , string state="200 ok")
{
    var sb = new StringBuilder(100);
    var bodyData = Encoding.UTF8.GetBytes(msg);

    sb.AddL("HTTP/1.1 " + state);
    sb.AddL("date: " + Util.uTime);
    sb.AddL("Server: test server");
    sb.AddL("Content-type:text/plain; charset=UTF-8");
    sb.AddL("Content-Length: " + bodyData.Length);
    sb.AddL("Connection: close");
    sb.AddL();

    client.Send(Encoding.UTF8.GetBytes(sb.ToString()));
    client.Send(bodyData);
}

 

 

form데이터를 전송하는 html (과거 이력과 거의 동일)

    <form action="/test/send" method="get" style="width:fit-content;">
        <fieldset>
            <legend>GET</legend>
            <input name="name" type="text" value="이치고" placeholder="이름을 입력하세요" />
            <input name="age" type="text" value="1" placeholder="나이를 입력하세요" />
            <button type="submit">전송</button>
        </fieldset>
    </form>
 

 

 

마지막으로 전송 버튼을 눌렀을 때의 결과.

음.. 오랜만에 작성하는 터라, 좀 더 분량을 채우고 싶으나,

이번 파트는 생각보다 쓸 내용이 없는 것 같다.

つづく