Perl と生ソケットで書く最も無骨なプロキシサーバ

Posted by
ぴろり
Posted at
2010/03/21 14:19
Trackbacks
関連記事 (1)
Post Comment
コメントできます
Category
開発メモ カテゴリ

 Perl と生ソケットを用いて、HTTP プロキシサーバを書いてみました。接続のハンドリングを行うのみで、chunked なコンテンツなどには一切対応していません。そんな無骨なプロキシサーバのソースコードメモ。ソケットを 2 本使って、listen/connect しているだけです。ここから改造すればいいのかなぁ。

この記事を Delicious に追加する   このエントリーをはてなブックマークに追加  

#!/usr/bin/perl
$|++;
use strict;
use Socket;

use constant SERVER_PORT => 8080;

# 待ち受け用ソケット生成
socket SOCKET, PF_INET, SOCK_STREAM, getprotobyname ('tcp')
    or die;
binmode SOCKET;
# ポートにbind
bind SOCKET, sockaddr_in (SERVER_PORT, INADDR_ANY)
   or die;
# ソケットをlisten
listen SOCKET, SOMAXCONN
    or die;

while (1) {
    # 待ち受け
    accept CLIENT, SOCKET
        or die;
    binmode CLIENT;

    ### Data: Client -> Proxy Server
    print "-------- REQUEST --------
";
    my ($buf, $request);
    do {
        recv CLIENT, $buf, 1024, 0
            or last;
        print $buf;
        $request .= $buf;
    } while (1024 == length $buf);
    print "
";

    # Parsing/Modifing
    $request =~ s!^(GET|POST) http://([^/]+)(/S*) (HTTP/d+.d+)!$1 $3 $4!;
    my ($host, $port) = $2 =~ m!(.+)(?::(d+))?!;
    $port ||= 80;

    # サーバ問い合わせ用ソケット生成
    socket SOCKET2, PF_INET, SOCK_STREAM, getprotobyname ('tcp')
        or die;
    binmode SOCKET2;
    # サーバに接続
    connect SOCKET2, sockaddr_in ($port, inet_aton ($host))
        or die;

    ### Data: Proxy Server -> Target Server
    send SOCKET2, $request, 0
        or die;

    ### Data: Target Server -> Proxy Server
    print "-------- RESPONCE --------
";
    my ($responce);
    do {
        recv SOCKET2, $buf, 1024, 0
            or last;
        print length $buf, "
";
        $responce .= $buf;
    } while (1024 == length $buf);
    print "
";

    # 後始末
    close SOCKET2;

    ### Data: Proxy Server -> Client
    send CLIENT, $responce, 0
        or die;

    # 後始末
    close CLIENT;
}

# 後始末
close SOCKET;
この記事を Delicious に追加する   このエントリーをはてなブックマークに追加  


この記事を読んだ人はこんな記事も読んでいます記事リコメンデーションについて

カバー画像:[Perl] LWP::UserAgent で SSL 証明書のエラーへの対応

関連記事/トラックバック (全 1 件中、最新 5 件まで表示しています)

Open MagicVox.net のスクリーンショット
タイトル
Twitter で特定ユーザの発言を透明あぼーんするプロキシサーバ:TwittAborn
Trackbacked at
2010/03/26 23:11
from
Open MagicVox.net
概要
 Follow したらブロックされて俺涙目、というのではなくて、Follow しているユーザのうち、特定のユーザの発言を見えなくする、というものです。自...

この記事にトラックバックを送るには?

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。