ちょっとABとは関係のないお話
[edit]
HTTPについて †

Hyper Text Transfer Protocolの略。Webブラウザとサーバがやりとりする際などに使われる通信プロトコル
バージョンHTTP/1.0と1.1が存在する。ここでは一応1.1ベース

[edit]
準備 †

まずはソケットを使った通信を読んでsendとrecvを使えるようになって頂きたい

[edit]
使い方 †

初めにsendでHTTPのリクエストを送信する。続いてrecvでサーバから返事を受け取る
以上

[edit]
リクエストの基本構造 †
<メソッド><HTTPバージョン>CRLF
<ヘッダ>CRLF
CRLF

メソッドはGETとかHEADとかPUTとか。プログラムでいう所の関数名
ヘッダっていうのはメソッドの付加情報。関数の引数みたいな物です
メソッドは常に一つ。ヘッダは任意の個数です。無い場合もあります
各行の終端にはCRLF(Ex"\r\n"のこと)を付け、終端には空行を付けます

[edit]
レスポンスの構造 †

レスポンスはリクエストをsendでHTTPサーバーに送ると必ず返されrecvで受け取ることが出来ます
<HTTPバージョン><ステータスコード>CRLF
<ヘッダ>CRLF
CRLF
<メッセージボディ>

HTTPバージョンとステータスコードは送ったHTTPメソッドの実行結果で、これだけはレスポンスの先頭に必ず存在します


HTTP/1.1 200 OK

ステータスコードは3桁の数字で表され、百の位が2なら成功、4ならクライアント側のエラー、5ならサーバ側のエラーになります
3の場合は処理を完了するために再度適切なリクエスト送信する必要がある場合を示します
1は複雑なんでパス

ヘッダはメッセージボディの情報を表す部分ですがもしかしたら無い場合もあるかも

メッセージボディはGETだったら対象となったリソース、POSTだったらCGIの実行結果とか
ここもヘッダ部分と同様に存在しない場合がある(例:HEADメソッド) ヘッダとの間に空行がはさまっているので注意。またメッセージボディの最後にCRLFは存在しない

[edit]
HTTPメソッド †

[edit]
GETメソッド †

HTTPサーバーからリソースを取得します

基本形
GET uri HTTP/1.1
Host: hostname

hostnameは接続するホストサーバー名です。ここのWikiだとURLのwww.2chab.netの部分です
uriの部分は取得したいURLのホスト名より先の部分を指定します

2ちゃんねるのトップページを取得する例
GET / HTTP/1.1
Host: www.2ch.net

本来は/index.htmlとか/の先の指定も必要なんですが、省略するとindex*(*は一字以上の文字列)を指定した事になります

略さないで書くと
GET /index.html HTTP/1.1
Host: www.2ch.net

成功すればレスポンスのメッセージボディ部分にGETの対象になったリソースが入っている
ステータスコードは成功すれば200 OK。リソースが見つからなければ404。アクセス拒否なら403。サーバー過負荷なら503
もちろんこれ以外のステータスコードである可能性もある

[edit]
Rangeヘッダ †

リソースに対するGETの範囲を指定するリクエストヘッダです

リソースの128バイトから256バイトまで取得
Range: 128-256

リソースの512バイト以降を取得
Range: 512-

このヘッダを含めてGETを送った場合、成功時のステータスコードは206になります
失敗した時は416(要求範囲が不正)が返されるかも

[edit]
If-Modified-Sinceヘッダ †

リソースが指定日時より後に更新されているか調べるヘッダです
更新されていない場合はGETしません

GMTで2007年5月5日午前0時以降に更新されているか調べる
If-Modified-Since: Sun, 5 May 2007 00:00:00 GMT

このヘッダを含めてGETを送った場合、リソースが更新されていなければレスポンスには304(未更新)が返されます
この場合メッセージボディはありません
更新されていれば普通に200番代のステータスコードとメッセージボディを返してきます

[edit]
HEADメソッド †

HTTPサーバーからリソースの情報を取得します

基本形
HEAD uri HTTP/1.1
Host: hostname
CRLF

hostname、uriはGETと同じです
成功すればリソースのヘッダだけ返ってきます(つまりHEAD=GET-メッセージボディ)

[edit]
POSTメソッド †

HTTPサーバーに情報を送信します
CGIのパラメータなんかを送信するために使う。実行結果がCGI依存なのでかなり厄介

基本形
POST uri HTTP/1.1
Host: hostname
Content-Type: type
Content-Length: 25222length
CRLF
メッセージボディ

hostname、uriはGETと同じ
typeはフォームデータだけ場合はapplication/x-www-form-urlencoded
何らかのリソースを含む場合はmultipart/form-data
殆ど前者だけで事足りると思うが、アップローダーのようなリソースを受け付けるCGIは後者を利用する
lengthは後に続くメッセージボディの長さ
メッセージボディはapplication/x-www-form-urlencodedの場合
変数名1=値1&変数名2=値2...

のように変数名と値を=で結んだ物を&を区切りとして羅列する。変数名も値もURLエンコードされていなければならない

multipart/form-dataは大変なので省略

成功すれば二百番台のステータスコードを返す
リソースが既に生成されている場合201を返す(見たこと無いけど)

[edit]
GETでPOSTする †

サーバーに情報を送信する時はPOSTを使うべきだが、極少量のデータであればGETでも送れる

基本形
GET uri?メッセージボディ HTTP/1.1
Host: hostname
CRLF

uriの後に?とPOSTのとき送ったメッセージボディをつける。やはりURLエンコード必須
Content-TypeとContent-Lengthはいらない