ソケット通信でのBasic認証
昨日から踏ん張っているソケット通信、今日は引っかかりを取ったばかりなBasic認証についてまとめます。
コード
<?php header("Content-type:text/html;charset=EUC-JP") ; //エラー出力設定 require("../../error_out.php") ; //URL $add = "http://vocaloid.net/~miku_hatsune/tests/socket_con/post_gate_watch.php" ; //送信データ生成 => 連想配列 $datas2 = array( "a" => "bx", "c" => "dx" ) ; $urld = parse_url($add) ; //送信データの結合 [=]でつなげる foreach($datas2 as $key => $value){ $posts[] = $key."=".urlencode($value) ; echo "{$key} => {$value}<br>" ; } //結合 [&]でつなげる $post = implode("&",$posts) ; echo $post ; //ヘッダ構築 $headers = "POST ".$urld['path']." HTTP/1.1\r\n" ; $headers .= "User-Agent:PHP/".phpversion()."\r\n" ; $headers .= "Host: ".$_SERVER["HTTP_HOST"]."\r\n" ; //BASIC認証 $headers .= "Authorization: Basic ".base64_encode("masayoshi:india")."\r\n"; //ヘッダ構築続き $headers .= "Content-Type: application/x-www-form-urlencoded\r\n" ; $headers .= "Content-Length: ".strlen($post)."\r\n\r\n" ; $headers .= $post ; $headers .= "\r\n" ; //echo str_replace("\r\n","<br>",$headers) ; //サーバにつなぐ $sockd = fsockopen($urld["host"],80,$eno,$estr) ; //データ送信 fputs($sockd,$headers) ; //レスポンスを受け取る while (!feof($sockd)) { echo fgets($sockd, 128); } //ソケット通信の封鎖 fclose($sockd) ; //エラー出力 echo "{$eno} => {$estr}" ; ?>
メモ
- 送るデータはつなげる
- 最初に a=bとして[キーと値]の組を構成する
- そして、&を用いてさっきの組をつなぐ
- 認証
- 改行
- ヘッダの最後は\r\nで終わらせる
- Content-length:〜〜;のあとは[\r\n]を2つ付ける、こうしない動かない
- ヘッダの最後は\r\nで終わらせる
- サーバ接続
- $sockd = fsockopen($urld["host"],80,$eno,$estr) ;
- 前回は接続先とポートだけを指定したが今回は、$enoと$estrを付加した。
それぞれ- $eno = エラーナンバー [404とか503]
- $estr = エラー内容
- となる。
- 前回は接続先とポートだけを指定したが今回は、$enoと$estrを付加した。
- そして、fputs()としてヘッダを送信後レスポンスを受け取り封鎖(切断)
- $sockd = fsockopen($urld["host"],80,$eno,$estr) ;