16
16

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-03-14

注: ほとんど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でアクセスしてみる

Screenshot_from_2014-03-14 13:58:52.png

ログ
========== 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って初めて知りました。

参考

16
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
16