[PHP-users 14726]Re: includeとリクエストヘッダ

Youichi Iwakiri yiwakiri @ st.rim.or.jp
2003年 4月 18日 (金) 15:18:55 JST


いわきりです

TAKATA Toshinori wrote in <20030418001923.9F29.TAKATA @ bk.iij4u.or.jp> :
>読み込ませようとしたサイトの管理者に聞くと、プロトコルをHTTP/1.1でHOST指
>定をして下さいと言われたので、fsockopenを使って直接
>fputs("GET http://wwww.XXXXX.co.jp/index.html HTTP/1.1\r\n");
>fputs("HOST www.YYYY.co.jp\r\n\r\n");
>のようにすると問題なく読み込むことが出来ました。
>
>これをinclude関数を使って行うにはどうすればよいのか分かりません。
>include関数が送るリクエストヘッダを変更するようなことは出来るのでしょう
>か?

http://www.php.net/manual/ja/function.fopen.php

fopen()の説明を読めばわかると思いますが、http_stream_wrapperは、
HTTP/1.0しか対応していません。

お使いのPHPのVersionが4.3.xであれば、マニュアルの
XCVIII Stream functionsに従い、独自のstream_wrapperを書くのが、
得策かと思います。

一度作ってライブラリ化すれば、以降の操作が通常のファイル操作と
同感覚で行えます。

多少手抜き(close, seek, flush)もありますが、下記スクリプトを用意すれば
require(), include(), fopen()等から、独自のstreamが使えるように
なります。

<?php
class http_1_1_wrapper {
  var $pos = 0;
  var $content = '';
  var $sock = false;

  function stream_open($path, $mode = NULL, $option = NULL, $opened_path = NULL)
  {
    if ($this->sock) {
      echo "$path already open.\n";
      return false;
    }
    $url = parse_url($path);
    $url['port'] = (isset($url['port'])) ? $url['port'] : 80;
    $this->sock = fsockopen($url['host'], $url['port']);
    if (!$this->sock) {
      echo "Server not available\n";
      return false;
    }
    $req = "GET {$url['path']} HTTP/1.1\r\n" .
           "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)\r\n" .
           "Host: {$_SERVER['HOST']}\r\n" .
           "Connection: Close\r\n\r\n";
    fputs($this->sock, $req);
    while(!feof($this->sock)) {
      $this->content .= fread($this->sock, 2048);
    }
    list($this->header, $this->body) = split("\r\n\r\n", $this->content, 2);
    if (strlen($this->body)) {
      return true;
    } else {
    $this->sock = false;
      return false;
    }
  }
  function stream_read($count)
  {
    if ($this->sock) {
      $retval_str = substr($this->body, $this->pos, $count);
      $this->pos += strlen($retval_str);
      return $retval_str;
    } else {
      return false;
    }
  }

  function stream_write()
  {
    return false;
  }

  function stream_tell()
  {
    if ($this->sock) {
      return $this->pos;
    } else {
      return false;
    }
  }

  function stream_eof()
  {
    return $this->pos >= strlen($this->body);
  }

  function stream_seek()
  {
    return false;
  }

  function stream_flush()
  {
    return false;
  }
}

stream_register_wrapper("http1.1", "http_1_1_wrapper");
include("http1.1://127.0.0.1/index.html");
?>

-- 
Youichi Iwakiri



PHP-users メーリングリストの案内