/var/log/masayoshi/masayoshi.life.log

とりあえず、書きたいこと書くだけ。

ソケット通信での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として[キーと値]の組を構成する
    • そして、&を用いてさっきの組をつなぐ
  • 認証
    • 送信するヘッダは["Authorization: Basic ".base64_encode("masayoshi:india")."\r\n";]
  • 改行
    • ヘッダの最後は\r\nで終わらせる
      • Content-length:〜〜;のあとは[\r\n]を2つ付ける、こうしない動かない
  • サーバ接続
    • $sockd = fsockopen($urld["host"],80,$eno,$estr) ;
      • 前回は接続先とポートだけを指定したが今回は、$enoと$estrを付加した。
        それぞれ
        • $eno = エラーナンバー [404とか503]
        • $estr = エラー内容
      • となる。
    • そして、fputs()としてヘッダを送信後レスポンスを受け取り封鎖(切断)