zoukankan      html  css  js  c++  java
  • PHP Simulation HTTP Request(undone)

    目录

    0. 引言
    1. file_get_contents版本
    2. Socket版本
    3. Curl版本
    4. Curl版本(2)
    5. 模拟文件上传

    0. 引言

    本文总结了通过PHP代码方式模拟各种HTTP请求

    1. file_get_contents版本

    <?php
    /**
     * 发送post请求
     * @param string $url 请求地址
     * @param array $post_data post键值对数据
     * @return string
     */
    function send_post($url, $post_data) 
    { 
        //使用给出的关联(或下标)数组生成一个经过 URL-encode 的请求字符串
        $postdata = http_build_query($post_data);
        $options = array(
            'http' => array(
                'method' => 'POST',
                'header' => 'Content-type:application/x-www-form-urlencoded',
                'content' => $postdata,
                'timeout' => 15 * 60 // 超时时间(单位:s)
            )
        );
        //创建并返回一个资源流上下文,该资源流中包含了 options 中提前设定的所有参数的值
        $context = stream_context_create($options);
        $result = file_get_contents($url, false, $context);
    
        return $result;
    }
    
    $post_data = array(
        'username' => 'zhenghan',
        'password' => '111'
    );
    $result = send_post('http://localhost/test/index.php', $post_data);
    echo $result;
    
    ?>

    Relevant Link:

    http://php.net/manual/zh/function.http-build-query.php
    http://php.net/manual/zh/function.stream-context-create.php

    2. Socket版本

    <?php
    /**
     * Socket版本 
     */
    function request_by_socket($remote_server, $remote_path, $post_string, $port = 80, $timeout = 30) 
    {
        $socket = fsockopen($remote_server, $port, $errno, $errstr, $timeout);
        if (!$socket) 
        {
            die("$errstr($errno)");
        }
        fwrite($socket, "POST $remote_path HTTP/1.0");
        fwrite($socket, "User-Agent: Socket Example");
        fwrite($socket, "HOST: $remote_server");
        fwrite($socket, "Content-type: application/x-www-form-urlencoded");
        fwrite($socket, "Content-length: " . (strlen($post_string) + 8) . "");
        fwrite($socket, "Accept:*/*");
        fwrite($socket, "");
        fwrite($socket, "mypost=$post_string");
        fwrite($socket, "");
        $header = "";
        while ($str = trim(fgets($socket, 4096))) 
        {
            $header .= $str;
        }
    
        $data = "";
        while (!feof($socket)) 
        {
            $data .= fgets($socket, 4096);
        }
    
        return $data;
    }
    
    $post_string = "app=socket&amp;version=beta"; 
    $result = request_by_socket('localhost', '/test.php', $post_string);
    
    echo $result;
    
    ?>

    Relevant Link:

    http://php.net/manual/zh/function.fsockopen.php

    3. Curl版本

    <?php
    /**
     * Curl版本
     */
    function request_by_curl($remote_server, $post_string) 
    {
        //初始化一个新的会话,返回一个cURL句柄,供curl_setopt(), curl_exec()和curl_close() 函数使用。
        $ch = curl_init();
        //curl_setopt — 设置一个cURL传输选项
        curl_setopt($ch, CURLOPT_URL, $remote_server);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_USERAGENT, "http://littlehann.cnblogs.com CURL Example beta");
        //curl_exec — 执行一个cURL会话,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。
        $data = curl_exec($ch);
        //关闭一个cURL会话并且释放所有资源。cURL句柄ch 也会被释放。
        curl_close($ch);
    
        return $data;
    }
    
    $post_string = "app=request&version=beta";
    $result = request_by_curl('http://localhost/test.php', $post_string);
    echo $result;
    
    ?>

    Relevant Link:

    http://php.net/manual/zh/function.curl-init.php
    http://php.net/manual/zh/function.curl-setopt.php
    http://php.net/manual/zh/function.curl-exec.php
    http://blog.51yip.com/php/1039.html

    4. Curl版本(2)

    <?php
    /**
     * 发送HTTP请求
     *
     * @param string $url 请求地址
     * @param string $method 请求方式 GET/POST
     * @param string $refererUrl 请求来源地址
     * @param array $data 发送数据
     * @param string $contentType 
     * @param string $timeout
     * @param string $proxy 
     */
    function send_request($url, $data, $refererUrl = '', $method = 'GET', $contentType = 'application/json', $timeout = 30, $proxy = false) 
    {
        $ch = null;
        if('POST' === strtoupper($method)) 
        {
            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_HEADER,0 );
            curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
            curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
            if ($refererUrl) 
            {
                curl_setopt($ch, CURLOPT_REFERER, $refererUrl);
            }
            if($contentType) 
            {
                curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:'.$contentType));
            }
            if(is_string($data))
            {
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            } 
            else 
            {
                curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
            }
        } 
        else if('GET' === strtoupper($method)) 
        {
            if(is_string($data)) 
            {
                $real_url = $url. (strpos($url, '?') === false ? '?' : ''). $data;
            } 
            else 
            {
                $real_url = $url. (strpos($url, '?') === false ? '?' : ''). http_build_query($data);
            }
    
            $ch = curl_init($real_url);
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:'.$contentType));
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
            if ($refererUrl) 
            {
                curl_setopt($ch, CURLOPT_REFERER, $refererUrl);
            }
        } 
        else 
        {
            //返回一个数组,其中每个元素都是目前用户自定义函数的参数列表的相应元素的副本
            $args = func_get_args();
            return false;
        }
    
        if($proxy) 
        {
            curl_setopt($ch, CURLOPT_PROXY, $proxy);
        }
        $ret = curl_exec($ch);
        //获取最后一次传输的相关信息。
        $info = curl_getinfo($ch);
        $contents = array(
                'httpInfo' => array(
                        'send' => $data,
                        'url' => $url,
                        'ret' => $ret,
                        'http' => $info
                )
        );
    
        curl_close($ch);
        return $contents;
    }
    
    $data = array(1 => "hello world!");
    $r_url = "http://localhost/test.php";
    $result = send_request($r_url, json_encode($data), NULL, 'POST');
    echo $result;
    
    ?>

    Relevant Link:

    http://php.net/manual/zh/function.curl-getinfo.php
    http://blog.snsgou.com/post-161.html
    http://www.cnblogs.com/simpman/p/3549816.html

    5. 模拟文件上传

    sender.php

    <?php
    function getFileList($directory) 
    {        
        $files = array();        
        if(is_dir($directory)) 
        {        
            if($dh = opendir($directory)) 
            {        
                while(($file = readdir($dh)) !== false) 
                {        
                    if($file != '.' && $file != '..' && $file !== "rule.php" && $file !== "filter.php" && $file !== "vul_rules.json" && $file !== "bad" && $file !== "good") 
                    {        
                        $files[] = $file;        
                    }        
                }    
                closedir($dh);        
            }        
        }        
        return $files;        
    }   
    
    /**
     * 发送post请求
     * @param $post_data 待上传文件
     * @param $post_url 文件上传地址 
     * @return string
     */
    function file_post($post_data, $post_url) 
    { 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $post_url);
        curl_setopt($curl, CURLOPT_POST, 1 );
        curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl,CURLOPT_USERAGENT,"Mozilla/4.0");
        $result = curl_exec($curl);
        $error = curl_error($curl);
        return $error ? $error : $result;
    }
    
    
    ///遍历bad目录,逐个文件上传
        $files = getFileList("./bad");  
        foreach ($files as $key => $value) 
        {
            //上传文件
            $url = "http://localhost/test/index.php?action=uploadfixfile"; 
            $data = array( 
                "file" => "@" . dirname(__FILE__) . "\bad\$value"
            );
            $result .= file_post($data, $url);       
        }
    
        echo $result;
    
    ?>

    receiver.php

    <?php
    if ($_GET['action'] == "uploadfixfile") 
    {
        if($_FILES)
        {
            $filename = $_FILES['file']['name'];
            $tmpname = $_FILES['file']['tmp_name'];
            $newname = dirname(__FILE__) . '\fix\' . $filename; 
            //die(var_dump($newname));
    
            if(move_uploaded_file($tmpname, $newname))
            {
                echo "$filename 上传成功" . "</br>";
            }
            else
            {
                echo "$filename 上传失败" . "</br>";
            }
        }
    }
     
    ?>  

    Relevant Link:

    http://flashphp.org/blog/2010/03/php%E4%BD%BF%E7%94%A8curl%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6%E7%9A%84%E5%87%BD%E6%95%B0/
    http://book.51cto.com/art/201404/437024.htm
    http://my.oschina.net/adamboy/blog/54436

    Copyright (c) 2014 LittleHann All rights reserved

  • 相关阅读:
    特征方程
    鸽巢原理
    Python列表与字典
    布尔型
    python字符串
    Python小笔记
    IntelliJ 中Maven pom.xml依赖不生效解决
    IDEA创建servlet,篇末有找不到servlet报404的原因
    jQuery的ajax之验证用户名是否被注册
    jquery之Validata表单验证
  • 原文地址:https://www.cnblogs.com/LittleHann/p/4191034.html
Copyright © 2011-2022 走看看