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

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

# ソース
[Gist](https://gist.github.com/manuluu/9542944)に書きました。
投げられたHTTPリクエストをコンソールに表示します。
あと、レスポンスボディに書き込んで投げ返します。

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

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

# 使ってみる
## 起動
Node.jsをインストールして、シェルで`node (スクリプトのパス)`と打つだけ。

```shell-session:起動
$ node test_server.js
Server running at http://127.0.0.1:2501/
```

## Chromeでアクセスしてみる
![Screenshot_from_2014-03-14 13:58:52.png](https://qiita-image-store.s3.amazonaws.com/0/18902/598e21d6-65ea-6c9c-0e72-27710b190bbd.png)

```shell-session:ログ
========== 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

```js:あらゆることをスルーしてGET投げるだけのスクリプト.js
require('http').get('http://127.0.0.1:2501');
```

```shell-session:GET結果
========== Received Request ========== count: 1
GET / HTTP/1.1
connection: close
host: 127.0.0.1:2501
```

## POST

```js:あらゆることをスルーしてPOST投げるだけのスクリプト.js
require('http').request({hostname:'127.0.0.1', port: 2501, method:'POST'}).end('number=4&name=kurisu');
```

```shell-session: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

```rb:GET投げるだけのワンライナー
ruby -rnet/http -ruri -e "Net::HTTP.get_print URI.parse('http://127.0.0.1:2501')"
```

```shell-session: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

```rb:POST投げるだけのワンライナー
ruby -rnet/http -ruri -e "Net::HTTP.post_form(URI.parse('http://127.0.0.1:2501'), {os:'redmagic', version:4})"
```

```shell-session: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

```text:GET投げるだけ
curl 127.0.0.1:2501
```

```shell-session:GET結果
========== Received Request ========== count: 1
GET / HTTP/1.1
accept: */*
host: 127.0.0.1:2501
user-agent: curl/7.32.0
```

## POST

```text:POST投げるだけ
curl -F "title=The Perfect Insider" -F "pubDate=1996" 127.0.0.1:2501
```

```shell-session: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って初めて知りました。

#参考
- [Node.js v0.11.10 マニュアル & ドキュメンテーション](http://nodejs.jp/nodejs.org_ja/api/http.html)
- [HTTP入門](http://www.tohoho-web.com/ex/http.htm)
- [library net/http](http://docs.ruby-lang.org/ja/1.8.7/library/net=2fhttp.html)
- [curlコマンドから HTTP POST する方法](http://qiita.com/letsspeak/items/8c7266742371699ab45e)