локон, WireShark. Настройка заголовков для публикации данных и получения XML - PullRequest
0 голосов
/ 22 декабря 2009

Вот дамп из WireShark:

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;

?>

Возвращает «неверный запрос» с сервера. Есть предложения?

Ответы [ 3 ]

2 голосов
/ 22 декабря 2009

Я думаю, что ваш аргумент

curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data);

не правильно. Опция postfields должна быть в виде URL-кодированных пар имя / значение. Из документов:

» Это может быть либо передано в виде строки в кодировке urlen, например 'para1 = val1 & para2 = val2 & ...', либо в виде массива с именем поля в качестве ключа и данными поля в качестве значения. Если значение является массивом, заголовок Content-Type будет установлен в multipart / form-data «

см. http://php.net/manual/en/function.curl-setopt.php

2 голосов
/ 22 декабря 2009

Мое первое предположение состоит в том, что дополнительный «\ r \ n» после заголовка длины содержимого заставляет сервер думать, что содержимое публикации начинается там. На всякий случай я бы также изменил «content-length», «Content-type» и «host» на «Content-Length», «Contnet-Type» и «Host».

Редактировать: Это, и ответ Рональда Бумана.

0 голосов
/ 22 января 2018

Существует инструмент pcap2curl , который позволяет конвертировать файл pcap HTTP-запросов в cURL.

Но если вы хотите воспроизвести некоторые веб-запросы из браузера, вы можете сделать это без Wireshark и вместо этого войти в режим веб-разработчика в браузере. Затем вы переходите к представлению сетевых запросов и щелкаете правой кнопкой мыши по интересующему запросу, затем в большинстве современных браузеров есть опция Копировать как cURL , после чего вы можете вставить полученную команду в терминал и Повторите захваченную команду, как считаете нужным, с помощью инструмента curl. Некоторые браузеры (например, Mozilla) также предлагают возможность редактирования и повторной отправки из браузера.

...