Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP cURL Content-Type is not set

I have a simple web service that I would like to connect with. In order to post some XML, which will be properly proceeded on the web service side, I need to prepare a proper request. I am using cURL for this like that:

try {     $ch = curl_init();      if (FALSE === $ch)         throw new Exception('failed to initialize');      curl_setopt($ch, CURLOPT_URL,"192.168.1.37");     curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                             'Content-Type: application/xml',                                             'Connection: Keep-Alive'                                             ));     curl_setopt($ch, CURLOPT_HEADER, 1);     curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);     curl_setopt($ch, CURLOPT_PROXY, '');     curl_setopt($ch, CURLOPT_POST, 1);     curl_setopt($ch, CURLOPT_FRESH_CONNECT, TRUE);     curl_setopt($ch, CURLOPT_HTTPHEADER,array("Expect:  "));     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);     curl_setopt($ch, CURLOPT_POSTFIELDS,$xml);       $request=  curl_getinfo($ch);     var_dump($request);       $content = curl_exec($ch);       if (FALSE === $content)         throw new Exception(curl_error($ch), curl_errno($ch));    } catch(Exception $e) {      trigger_error(sprintf(         'Curl failed with error #%d: %s',         $e->getCode(), $e->getMessage()),E_USER_ERROR);  } 

Everything should be ok. First I am displaying the request body from curl_getinfo($ch); and then i am showing the response from $content variable.

Only restriction for request to be sent to the server is Content-Type header - it MUST be application/xml otherwise server will respond with an error ( It is not my idea and I can't do anything about it)

Here is output request:

array(21) { ["url"]=> string(68) "192.168.1.37" ["content_type"]=> NULL ["http_code"]=> int(0) ["header_size"]=> int(0) ["request_size"]=> int(0) ["filetime"]=> int(0) ["ssl_verify_result"]=> int(0) ["redirect_count"]=> int(0) ["total_time"]=> float(0) ["namelookup_time"]=> float(0) ["connect_time"]=> float(0) ["pretransfer_time"]=> float(0) ["size_upload"]=> float(0) ["size_download"]=> float(0) ["speed_download"]=> float(0) ["speed_upload"]=> float(0) ["download_content_length"]=> float(-1) ["upload_content_length"]=> float(-1) ["starttransfer_time"]=> float(0) ["redirect_time"]=> float(0) ["certinfo"]=> array(0) { } }

and response is HTTP 400 Bad Request

What I can see from that is ["content_type"]=> NULL but I set this variable in my PHP code...

Can anyone tell me what I am missing?

like image 263
Mithrand1r Avatar asked Oct 28 '13 13:10

Mithrand1r


People also ask

How to set Content Type in Curl PHP?

To send the Content-Type header using Curl, you need to use the -H command-line option. For example, you can use the -H "Content-Type: application/json" command-line parameter for JSON data. Data is passed to Curl using the -d command-line option.

What is Curlopt_postfields?

CURLOPT_POSTFIELDS. The full data to post in a HTTP "POST" operation. To post a file, prepend a filename with @ and use the full path. The filetype can be explicitly specified by following the filename with the type in the format ';type=mimetype'.


1 Answers

You are setting HTTP_HEADER twice:

curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                             'Content-Type: application/xml',                                             'Connection: Keep-Alive'                                             ));  curl_setopt($ch, CURLOPT_HTTPHEADER,array("Expect:  ")); 

I guess that is the problem. The second time you set it, you delete the first setting.

like image 65
Legionar Avatar answered Oct 10 '22 16:10

Legionar