• Jeremy Saintot
    14-Jan-2011 05:24

    Here is my fsockopen - based HTTP request function (GET and POST) :

    :: Could use this as a “proxy” method to check hotmail from webserver! ::

    function http_request(
        $verb = 'GET',             /* HTTP Request Method (GET and POST supported) */
        $ip,                       /* Target IP/Hostname */
        $port = 80,                /* Target TCP port */
        $uri = '/',                /* Target URI */
        $getdata = array(),        /* HTTP GET Data ie. array('var1' => 'val1', 'var2' => 'val2') */
        $postdata = array(),       /* HTTP POST Data ie. array('var1' => 'val1', 'var2' => 'val2') */
        $cookie = array(),         /* HTTP Cookie Data ie. array('var1' => 'val1', 'var2' => 'val2') */
        $custom_headers = array(), /* Custom HTTP headers ie. array('Referer: http://localhost/ */
        $timeout = 1000,           /* Socket timeout in milliseconds */
        $req_hdr = false,          /* Include HTTP request headers */
        $res_hdr = false           /* Include HTTP response headers */
        )\n{
        $ret = '';
        $verb = strtoupper($verb);
        $cookie_str = '';
        $getdata_str = count($getdata) ? '?' : '';
        $postdata_str = '';
    
        foreach ($getdata as $k => $v)
            $getdata_str .= urlencode($k) .'='. urlencode($v);
    
        foreach ($postdata as $k => $v)
            $postdata_str .= urlencode($k) .'='. urlencode($v) .'&';
    
        foreach ($cookie as $k => $v)
            $cookie_str .= urlencode($k) .'='. urlencode($v) .'; ';
    
        $crlf = "\r\n";
        $req = $verb .' '. $uri . $getdata_str .' HTTP/1.1' . $crlf;
        $req .= 'Host: '. $ip . $crlf;
        $req .= 'User-Agent: Mozilla/5.0 Firefox/3.6.12' . $crlf;
        $req .= 'Accept: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8' . $crlf;
        $req .= 'Accept-Language: en-us,en;q=0.5' . $crlf;
        $req .= 'Accept-Encoding: deflate' . $crlf;
        $req .= 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7' . $crlf;
       
        foreach ($custom_headers as $k => $v)
            $req .= $k .': '. $v . $crlf;
           
        if (!empty($cookie_str))
            $req .= 'Cookie: '. substr($cookie_str, 0, -2) . $crlf;
           
        if ($verb == 'POST' && !empty($postdata_str))
        {
            $postdata_str = substr($postdata_str, 0, -1);
            $req .= 'Content-Type: application/x-www-form-urlencoded' . $crlf;
            $req .= 'Content-Length: '. strlen($postdata_str) . $crlf . $crlf;
            $req .= $postdata_str;
        }
        else $req .= $crlf;
       
        if ($req_hdr)
            $ret .= $req;
       
        if (($fp = @fsockopen($ip, $port, $errno, $errstr)) == false)
            return "Error $errno: $errstr\\\\n";
       
        stream_set_timeout($fp, 0, $timeout * 1000);
       
        fputs($fp, $req);
        while ($line = fgets($fp)) $ret .= $line;
        fclose($fp);
       
        if (!$res_hdr)
            $ret = substr($ret, strpos($ret, "\r\n\r\n")   4);
       
        return $ret;
    }
    ?>
    
     Example usages :echo http_request('GET', 'www.php.net');
    echo http_request('GET', 'www.php.net', 80, '/manual/en/function.phpinfo.php');
    echo http_request('GET', 'www.php.net', 80, '/manual/en/function.phpinfo.php', array('get1' => 'v_get1'), array(), array('cookie1' => 'v_cookie1'), array('X-My-Header' => 'My Value'));
    
    ?> 
    
    output would look something like this:
    GET /manual/en/function.phpinfo.php
    Host: www.php.net
    User-Agent: Mozilla/6.0 Firefox/5b
    Accept: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-us,en;q=0.5
    Via: 1.0 143.2.111.38
    
    
    Prev:
    PHP: Download Files Without Ob_* Functions
    Next:
    PHP:: TraceRoute