Node.js勉強中...HTTPリクエストをオウム返しするサーバを作ってみた


注: ほとんどHello World状態です。

ソース

Gistに書きました。
投げられたHTTPリクエストをコンソールに表示します。
あと、レスポンスボディに書き込んで投げ返します。

Node.jsはHTTPリクエストをパースしてhttp.ClientRequestというオブジェクトにしてくれます。
それをわざわざテキスト形式のHTTPリクエスト(のような何か)に戻してます。

ヘッダの頭文字を大文字にしたりはしてません。
あと、HTTPメソッドごとに処理を分けるとか全くやってないです。

使ってみる

起動

Node.jsをインストールして、シェルでnode (スクリプトのパス)と打つだけ。

起動
$ node test_server.js
Server running at http://127.0.0.1:2501/

Chromeでアクセスしてみる

ログ
========== Received Request ========== count: 1
GET / HTTP/1.1
accept-encoding: gzip,deflate,sdch
accept-language: ja,en-US;q=0.8,en;q=0.6
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
connection: keep-alive
host: 127.0.0.1:2501
user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36

========== Received Request ========== count: 2
GET /favicon.ico HTTP/1.1
accept-encoding: gzip,deflate,sdch
accept-language: ja,en-US;q=0.8,en;q=0.6
accept: */*
connection: keep-alive
host: 127.0.0.1:2501
user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36

お気に入りのアイコンを取得するために2回アクセスしてました。

Node.jsでGET/POST

GET

あらゆることをスルーしてGET投げるだけのスクリプト.js
require('http').get('http://127.0.0.1:2501');
GET結果
========== Received Request ========== count: 1
GET / HTTP/1.1
connection: close
host: 127.0.0.1:2501

POST

あらゆることをスルーしてPOST投げるだけのスクリプト.js
require('http').request({hostname:'127.0.0.1', port: 2501, method:'POST'}).end('number=4&name=kurisu');
POST結果
========== Received Request ========== count: 1
POST / HTTP/1.1
connection: close
host: 127.0.0.1:2501
transfer-encoding: chunked

number=4&name=kurisu
********** Parsed Body ********** count: 1
{ number: '4', name: 'kurisu' }

node -eでワンライナーにしたかったけど何か動かなかった。

RubyでGET/POST

GET

GET投げるだけのワンライナー
ruby -rnet/http -ruri -e "Net::HTTP.get_print URI.parse('http://127.0.0.1:2501')"
GET結果
========== Received Request ========== count: 1
GET / HTTP/1.1
accept-encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3
accept: */*
host: 127.0.0.1:2501
user-agent: Ruby

POST

POST投げるだけのワンライナー
ruby -rnet/http -ruri -e "Net::HTTP.post_form(URI.parse('http://127.0.0.1:2501'), {os:'redmagic', version:4})"
POST結果
========== Received Request ========== count: 1
POST / HTTP/1.1
accept-encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3
accept: */*
content-length: 21
content-type: application/x-www-form-urlencoded
host: 127.0.0.1:2501
user-agent: Ruby

os=redmagic&version=4
********** Parsed Body ********** count: 1
{ os: 'redmagic', version: '4' }

ユーザエージェントが可愛い。

curlでGET/POST

GET

GET投げるだけ
curl 127.0.0.1:2501
GET結果
========== Received Request ========== count: 1
GET / HTTP/1.1
accept: */*
host: 127.0.0.1:2501
user-agent: curl/7.32.0

POST

POST投げるだけ
curl -F "title=The Perfect Insider" -F "pubDate=1996" 127.0.0.1:2501
POST結果
========== Received Request ========== count: 1
POST / HTTP/1.1
accept: */*
content-length: 259
content-type: multipart/form-data; boundary=------------------------b1e757a1e175746e
expect: 100-continue
host: 127.0.0.1:2501
user-agent: curl/7.32.0

--------------------------b1e757a1e175746e
Content-Disposition: form-data; name="title"

The Perfect Insider
--------------------------b1e757a1e175746e
Content-Disposition: form-data; name="pubDate"

1996
--------------------------b1e757a1e175746e--

********** Parsed Body ********** count: 1
{ '--------------------------b1e757a1e175746e\r\nContent-Disposition: form-data; name': '"title"\r\n\r\nThe Perfect Insider\r\n--------------------------b1e757a1e175746e\r\nContent-Disposition: form-data; name="pubDate"\r\n\r\n1996\r\n--------------------------b1e757a1e175746e--\r\n' }

boundaryって初めて知りました。

参考