2009-12-22 67 views
0

这里是Wireshark的转储:cURL,WireShark。设置标题发布的数据,并得到XML

POST /drm/drm_production_v2.php HTTP/1.1 

content-length: 278 

content-type: text/xml 

User-Agent: UserAgent 1.0 

Connection: Keep-Alive 

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ= 

host: www.example.com 



<methodCall> 
    <methodName>aMethod</methodName> 
    <params> 
    <param> 
     <value> 
     <base64>dXNlcm5hbWU6cGFzc3dvcmQ=</base64> 
     </value> 
    </param> 
    <param> 
     <value> 
     <struct/> 
     </value> 
    </param> 
    </params> 
</methodCall> 

我保存到一个单独的文件的XML。下面是我在做什么:

<?php 

function httpsPost($Url, $xml_data, $headers) 
{ 
    // Initialisation 
    $ch=curl_init(); 
    // Set parameters 
    curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); 
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_URL, $Url); 
    // Return a variable instead of posting it directly 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_USERPWD,"username:password"); 

    // Activate the POST method 
    curl_setopt($ch, CURLOPT_POST, 1) ; 
    curl_setopt($ch,CURLOPT_USERAGENT,"UserAgent 1.0"); 
    // Request 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 999); 

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 

    // execute the connexion 
    $result = curl_exec($ch); 
    // Close it 
    curl_close($ch); 
    return $result; 
} 
$str='username:password'; 
$auth=base64_encode($str); 
$request_file = "./request.xml"; 
$fh = fopen($request_file, 'r'); 
$filesize=filesize($request_file); 
echo $filesize; 
$xml_data = fread($fh,$filesize); 

fclose($fh);  

$url = 'http://www.example.com'; 

$header = array(); 
$header[] = "POST /drm/drm_production_v2.php HTTP/1.1"; 
$header[] = "Content-type: text/xml"; 
$header[] = "content-length: ".$filesize. "\r\n"; 
$header[] = "User-Agent: UserAgent 1.0"; 
$header[] = "Connection: Keep-Alive"; 
$header[] = "Authorization: Basic ".$auth; 
$header[] = "host: www.example.com"; 


$Response = httpsPost($url, $xml_data, $header); 

echo $Response; 

?> 

它返回来自服务器的“错误的请求”。有什么建议么?

+0

您是否已将wireshark日志和xml中的URL更改为www.example.com,或者您是否真的试图访问它? – Pim 2009-12-22 07:52:53

+0

我改变了这个帖子。 – manny 2009-12-22 16:25:43

回答

2

我的第一个猜测是内容长度标题后面的额外“\ r \ n”使得服务器认为帖子内容从那里开始。为了以防万一,我还将“content-length”,“Content-type”和“host”更改为“Content-Length”,“Contnet-Type”和“Host”。

编辑:那,和罗纳德布曼的答案。

+0

对不起,罗兰,你的名字弄错了。 – GZipp 2009-12-29 13:07:52

2

我觉得你的说法,以

curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data); 

是不正确的。 postfields选项应该是URL编码的名称/值对。从该文档:

“ 这可以是像‘PARA1 = VAL1 & PARA2 = val2的& ...’或者作为与字段名作为如值的密钥和数据字段的阵列如果urlencoded的字符串被传递。值是一个阵列,所述Content-Type头将被设置为multipart/form-数据 “

看到http://php.net/manual/en/function.curl-setopt.php

0

还有的pcap2curl工具,允许一个HTTP请求的PCAP文件转换成卷曲。

但是,如果您想要从浏览器重播一些网页请求,那么您可以在没有Wireshark的情况下执行此操作,而是在浏览器中输入Web开发者模式。然后,您转到网络请求视图并右键单击感兴趣的请求,然后在大多数现代浏览器中,有一个选项复制为cURL之后,您可以将结果命令粘贴到终端并重新运行捕获的命令正如你使用curl工具所看到的那样。某些浏览器(例如Mozilla)也提供了在浏览器中编辑和重新发送的选项。