部分get
2007-08-10-1 / カテゴリ: [HTTP] / [permlink]

Range リクエストヘッダを使う
RFC 2068: Hypertext Transfer Protocol - HTTP/1.1

ダウンロード支援アプリの類でのレジューム機能は、この辺使ってるのかな。

続きを読む

telnet で HTTP POST
2007-08-09-2 / カテゴリ: [HTTP] / [permlink]

Content-Length を指定する。
% telnet localhost http
POST / HTTP/1.1
Host: localhost
Content-length: 10

1234567890
指定がない場合は「リクエストボディ長:0」とみなされて、<CR><LF><CR><LF>の後、即レスポンスが帰ってくるのでボディを指定できない。

LWPでリクエストヘッダ付 Web アクセス(proxy込)
2007-07-26-1 / カテゴリ: [HTTP][perl] / [permlink]

use LWP::UserAgent;
use HTTP::Request;

my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new( GET => 'http://www.example.org/' );

$ua->agent("perl-wget");
$ua->proxy('http', 'http://proxy.example.org:8080');
$req->header( 'X-Header1' => 'hoge',
	      'X-Header2' => 'foobar',
	    );

my $res = $ua->request($req);

$res->as_string;         // レスポンス(ヘッダ+ボディ)は
$res->headers_as_string; // レスポンスヘッダ
$res->content;           // レスポンスボディ

IEのHTTPヘッダを表示する
2006-02-01-1 / カテゴリ: [win][HTTP][アプリ] / [permlink]

blunck.info
IEのエクスプローラバーに、HTTPの通信内容(ヘッダ)を表示するようにする。Firefox の Live HTTP Headers と同等、かな。
Live HTTP Headers と同じく、HTTPS の通信内容も見れるのが良いな。
窓の杜

今更メモ。

POSTメソッドで送信する
2005-12-14-3 / カテゴリ: [HTTP][JavaScript] / [permlink]

<form name="foobar" method="post" action="hoge.cgi">
  <input type="hidden" name="key1" value="val1">
  <input type="hidden" name="key2" value="val2">
</form>
に対して
<script language="JavaScript">
  document.foobar.submit();
</script>
でGO

proxy.pac で自動proxy設定
2005-09-01-1 / カテゴリ: [HTTP][JavaScript] / [permlink]

今更ドキュメントシリーズ。
ちょうど1年前くらいに社内用で作成してたけど、メモってなかったので。

Proxy Auto-Config File Format

必ず定義しなければならないのは FindProxyForURL(url, host) 関数。通常のプログラムの main に相当するようなもの。
引数の url にはアクセスしようとする URL が、host にはそのアドレスが入る。
で、戻り値として "DIRECT" で直接接続、"PROXY proxy.example.org:8080" で proxy.example.org:8080 を使うようなる。
個人的に良く(という程使ってないけど)使う関数は isInNet と shExpMatch。まぁ例見るのがわかりやすいかな。shExpMatch は正規表現ではなくファイルグロブによるマッチング(っぽい)

以下、「ホスト名でのアクセス, example.org, example.net, 192.168.*.*, localhost は直接接続、example.com, 10.*.*.* は proxy に 172.24.1.1:8080 使い、それ以外は proxy.example.org:8080 で Web アクセス」

function FindProxyForURL(url, host)
{
  if (isPlainHostName(host) ||
      shExpMatch(url, "http://*example.org*") ||
      shExpMatch(url, "http://*example.net*") ||
      isInNet(host, "192.168.0.0", "255.255.0.0") ||
      isInNet(host, "127.0.0.1", "255.0.0.0")) {
    return "DIRECT";
  }
  else if (shExpMatch(url, "http://*example.com*/") ||
           isInNet(host, "10.0.0.0", "255.0.0.0")) {
    return "PROXY 172.24.1.1:8080";
  }
  else {
    return "PROXY proxy.example.org:8080";
  }
}

んで、proxy.pac という名前で、proxy 不要でアクセスできる Web サーバにおいておき、ブラウザの「自動構成スクリプトを使用する」やら「自動でプロキシを設定する」やらで設定すれば OK

で、netscape のドキュメントには、application/x-ns-proxy-autoconfig という MIME type を追加せよとあるんだけど、なくても一応動くんだよな… うーむ

Digest認証の実装
2005-08-09-2 / カテゴリ: [HTTP] / [permlink]

[2005-07-18-2]の続き。情報元は同じくHTTP 認証: 基本アクセス認証及びダイジェストアクセス認証(RFC2617 日本語訳)
サーバ側の digest 認証の設定は[2005-07-08-3], [2005-05-29-2]

パケットキャプチャすると、サーバ側(Apache 1.3.33/debian)のレスポンスは
HTTP/1.1 401 Authorization Required
Date: Tue, 09 Aug 2005 06:20:01 GMT
Server: Apache/1.3.33 (Debian GNU/Linux) PHP/4.3.10-15 mod_jk/1.2.5 mod_fastcgi/2.4.2 mod_ssl/2.8.22 OpenSSL/0.9.7d
WWW-Authenticate: Digest realm="relm", nonce="98ca43d0f7a1e2641ea305f44db89cca1123568401"
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1
こんな感じ。
RFC2617に載っている、'algorithm' や 'qop' といった指示子がないな。ま、使用す[べきである]だから、いいのか(qop-options)。必要なのは realm と nonce かな。
algorithm がない場合は、"MD5" 扱いとのこと。

 challenge = "Digest" digest-challenge

 digest-challenge = 1#( realm | [ domain ] | nonce |
                     [ opaque ] |[ stale ] | [ algorithm ] |
                     [ qop-options ] | [auth-param] )

んで、クライアント(mozilla 1.7.6)のリクエスト
GET /~zaki/auth/digest/ HTTP/1.1
Host: www.example.org
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.7.6) Gecko/20050319
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Authorization: Digest username="zaki", realm="relm", nonce="98ca43d0f7a1e2641ea305f44db89cca1123568401", uri="/~zaki/auth/digest/", response="52b08746ab144ba29cf2fd6fe31174ca"
認証のための HTTP リクエストは Authorization ヘッダ。
 credentials = "Digest" digest-response
 digest-response = 1#( username | realm | nonce | digest-uri
                 | response | [ algorithm ] | [cnonce] |
                 [opaque] | [message-qop] |
                     [nonce-count] | [auth-param] )

んで、
username 使用するユーザ名 (username="zaki")
realm 使用するrealm(レスポンスヘッダにある) (realm="relm" <- スペルミスった)
nonce レスポンスにある nonce そのまま (nonce="98..."
digest-uri リクエストするファイル (uri="/~zaki/auth/digest/")
response ダイジェスト (response="52...")

でもって、response は、
"qop" が "auth" か "auth-int" である場合:
 request-digest = <"> < KD ( H(A1), unq(nonce-value)
                                     ":" nc-value
                                     ":" unq(cnonce-value)
                                     ":" unq(qop-value)
                                     ":" H(A2)
                             ) <">

"qop" 指示子が与えられない場合 (RFC 2069 との互換性のための構文)
    request-digest =
               <"> < KD ( H(A1), unq(nonce-value) ":" H(A2) ) > <">

A1 と A2 についての定義は以下を見よ。
とゆーことなので、 "KD(H(A1), unq(nonce-value) ":" H(A2)" ということ。

KD(xx, xx) は
 H(data) = MD5(data)
また
 KD(secret, data) = H(concat(secret, ":", data))
なので、"xx:xx" の md5sum 値

H(xxx) は、"xxx" の md5sum 値

A1 は
 A1 = unq(username-value) ":" unq(realm-value) ":" passwd
で、ユーザ名:zaki, パス:zaki、realm:relm であれば、
$ printf 'zaki:relm:zaki' | md5sum
f85142f6a9b00f64cd3afb151ba80505
こうなる。

A2 は
"qop" 指示子の値が "auth" か指定されない場合、A2 は:
A2 = Method ":" digest-uri-value

"qop" の値が "auth-int" ならば、A2 は:
A2 = Method ":" digest-uri-value ":" H(entity-body)
で、/~zaki/auth/digest/ への GET リクエストであれば、
$ printf 'GET:/~zaki/auth/digest/' | md5sum
b513229595a7eff3223d5412614d2ba4
となる。

で、元の "KD(H(A1), unq(nonce-value) ":" H(A2)" に戻ると、サーバのレスポンスの nonce が "98ca43d0f7a1e2641ea305f44db89cca1123568401" なので
$ printf 'f85142f6a9b00f64cd3afb151ba80505:98ca43d0f7a1e2641ea305f44db89cca1123568401:b513229595a7eff3223d5412614d2ba4' | md5sum
52b08746ab144ba29cf2fd6fe31174ca
になる。



んーと、Digest認証は、パスワードが平文でネットワークを流れないから安全・サーバ上にパスワードを平文で保存しないので安全って聞くけど、前者は良いとして、後者は、パスワードファイル(例えば .htpasswd)の中身が
zaki:relm:f85142f6a9b00f64cd3afb151ba80505
こーなってんだよね…。'zaki'って生パスワードではないけど、強調するほど安全じゃないよな。このファイル(のハッシュ値)と nonce 値さえ取られてしまえば、あとは md5sum 計算するだけだし。

多分

Basic認証/Digest認証の対応状況
2005-07-18-3 / カテゴリ: [HTTP][携帯] / [permlink]

Vodafone
ボーダフォンライブ!ウェブサービスで利用できるHTTPプロトコルについての技術資料 HTTP編 1.4.0 2005-04-01 より、、、って、無断引用禁止って書いてあるんでかいつまんで…
パケット端末以上は、Basic認証/Digest認証 OK (一部の3G端末を除く…らしい)

i-mode
作ろうiモードコンテンツ/Basic認証
F501i,N501i,D501i ... 同じBASIC認証の領域内でもページを移動するたびにID、パスワードの確認を行う。
その他のiモード端末 ... 同じBASIC認証の領域内であれば一度ID,パスワードの確認をすればiモードを終了するまでは確認なしで移動可能。
いまどきの端末なら対応ということかね。

au はサイトに情報が見つからない…

にしても、各社とも CHTML,HTML,XHTML,HDML の情報は割とちゃんと載ってる(と思う)けど、喋れる HTTP については、あんまり情報ないな…

Basic 認証の実装
2005-07-18-2 / カテゴリ: [HTTP] / [permlink]

メールの認証系を調べたついでに…^^;
HTTP 認証: 基本アクセス認証及びダイジェストアクセス認証(RFC2617 日本語訳)

ユーザ名が zaki, パスワードが passwd だとすると、"zaki:passwd" を base64 エンコードしたものが認証用の…えーと、ダイジェストとは言えないな。認証用の鍵とでもしておくか。
で、サーバに送信するリクエストとして
Authorization: Basic emFraTpwYXNzd2Q=
を送信する。

emFraTpwYXNzd2Q= は
hmiyazaki@MOZZARELLA:~$ printf 'zaki:passwd' | openssl enc -e -base64
emFraTpwYXNzd2Q=
あたりで。
(nkf, 入れてなかった…)

ちなみに、Basic 認証を要求するサーバ・ディレクトリに認証なしでアクセスした際のサーバのレスポンスは
HTTP/1.x 401 Authorization Required
:
:
WWW-Authenticate: Basic realm="InputPassword"
って感じ。
realm は、(Apacheなら).htaccess に設定してある AuthName ディレクティブの文字列。

Digest 認証は、なにやらややこしそうなので、じっくりやるか…
Referrer (Inside): [2005-08-09-2]

各ブラウザのクォートの URL エンコード状況
2004-12-07-1 / カテゴリ: [win][HTTP] / [permlink]

name=`a b` をpostした場合

IE 6.0
name=a+b
バッククォートが通常使用されるクォートと同等の働きになり、"a b" が post される

Mozilla 1.7.3 (Gecko/20040910)
name=%60a
バッククォートも post され、"a" の後のスペースはデリミタ扱いになり " b`" は捨てられる

Firefox 0.10.1 PR (Gecko/20040913)
name=%60a
バッククォートも post され、"a" の後のスペースはデリミタ扱いになり " b`" は捨てられる

Netscape 7.2 (Gecko/20040804)
name=%60a
バッククォートも post され、"a" の後のスペースはデリミタ扱いになり " b`" は捨てられる

Netscape 6.2.3 (Gecko/20020508)
name=%60a
バッククォートも post され、"a" の後のスペースはデリミタ扱いになり " b`" は捨てられる

Netscape Communicator 4.78
name=%60a+b%60
"`a b`" として post される

Opera 7.53
name=%60a
バッククォートも post され、"a" の後のスペースはデリミタ扱いになり " b`" は捨てられる

cookieの書式
2004-11-12-2 / カテゴリ: [network][HTTP] / [permlink]

Set-Cookie: NAME=値; expires=値; domain=値; path=値; secure
Perl の例
print "Set-Cookie: NAME=zzz; expires=Fri, 12-Nov-2004 19:45:41 JST;\n";

Firefox の例
.atmarkit.co.jp TRUE / FALSE 1131788193 LastVisit 1100252189

telnet で http
2004-11-01-2 / カテゴリ: [unix][linux][network][HTTP] / [permlink]

$ telnet serv 80
GET /path/file.html HTTP/1.0

CGI ブラウザからコマンドライン引数を渡して実行
2004-11-01-1 / カテゴリ: [unix][HTTP] / [permlink]

/program.cgi?arg1+arg2+arg3 ...
program.cgi は @ARGV で arg1, arg2, arg3 が取得できる
カテゴリ: HTTP

最終更新時間: 2013-05-02 16:12