35

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?

1

1 Answer 1

71

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.

Sign up to request clarification or add additional context in comments.

2 Comments

Of course it was It! Can't believe it that was so stupid mistake. Thank You Legionar!
Ugh an issue with copy paste code. I had the exact same line causing the exact same problem. Upvoted

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.