使用curl的HTTP重定向不会重新发送相同的http消息

时间:2014-05-13 11:12:26

标签: c++ c curl libcurl http-redirect

我正在开发一个使用libcurl的应用程序。

我在我的c代码中添加了以下curl选项:

curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);

以便遵循http重定向。

当我的应用程序发送http消息(第一个http消息)时,它从服务器接收到http 302重定向,libcurl检测成功重定向信息,然后发送另一个http消息(第二条http消息)到新网址,但新的http消息与第一条http消息相比并不相同。

如何让libcurl发送相同的HTTP消息?


第一条http消息:我的应用程序与第一台服务器之间的通信,直到应用程序获得http重定向消息

申请----> server1的

POST / HTTP/1.1
Host: 192.168.1.15
Accept: */*
User-Agent: cwmp
Content-Type: text/xml
Content-Length: 341
Expect: 100-continue

server1 ---->应用

HTTP/1.1 100 Continue

申请----> server1的

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  <soap_env:Envelope
xmlns:soap_env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soap_enc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soap_env:Header>
      <cwmp:ID soap_env:mustUnderstand="1" />
    </soap_env:Header>
    <soap_env:Body>
      <any:command>any_command_value</any:command>
    </soap_env:Body>
  </soap_env:Envelope>

server1 ----&gt;应用程序(重定向消息)

HTTP/1.1 302 Found
Date: Tue, 13 May 2014 11:00:48 GMT
Server: Apache/2.4.7 (Win32) PHP/5.5.8
X-Powered-By: PHP/5.5.8
Location: http://192.168.1.133:8080/openserv/serv
Content-Length: 0
Content-Type: text/html

第二条http消息:我的应用程序在收到http重定向后发送给第二台服务器的http消息

申请---&gt; server2

GET /openserv/serv HTTP/1.1
Host: 192.168.1.133:8080
Accept: */*
User-Agent: cwmp
Content-Type: text/xml

1 个答案:

答案 0 :(得分:2)

根据标准,需要在HTTP重定向上发送相同的消息。但是,几乎没有工具可以实现标准。 libcurl在重定向时将请求方法从POST更改为GET,是的,它反对标准,但它是如何工作的。 可能的解决方案:

  1. 使用CURLOPT_POSTREDIR选项;在重定向后,它会强制libcurl至少也使用POST方法,我不知道POST请求正文的内容。
  2. 识别302和301响应代码,并通过另一个libcurl的调用发送请求。