1

I'm trying to setup the following code to accept curl requests from php with nodejs via https protocol. I know the code works with http in nodejs side but as soon as I switch the protocol to https, "RECEIVED" is not logged in nodejs. This is:

app.post('/posts', function(req, res){

   console.log("RECEIVED");

});

Suming up:

  • "received" is logged with nodejs in http mode
  • "received" is NOT logged with nodejs in https mode
  • $curl_url (in HTTP) 'http://127.0.0.1:'.$socket_port.'/posts';
  • $curl_url (in HTTPS) 'https://127.0.0.1:'.$socket_port.'/posts';

Does anybody have any idea on this? Here is my curl function:

    $ch = curl_init();

    $ch_options = array("Expect:");

    if($encode_json){
        array_push($ch_options,"Content-type: application/json");
        $data = json_encode($data);
    }else{  
        $data = http_build_query($data);
    }

    //$data isn't received in either format mode

    curl_setopt($ch, CURLOPT_HTTPHEADER, $ch_options);

    curl_setopt($ch, CURLOPT_URL, $url);

    curl_setopt($ch, CURLOPT_HEADER, 0);

    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);

    curl_setopt($ch, CURLOPT_POST, true);

    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

    curl_exec($ch);

    $feedback = curl_getinfo($ch);

    curl_close($ch);

EDIT: the code that decides it all (called after app.post, which works with http. With https only this functionality [app.post('/post'...] fails AFAIK)

if(protocol == "https"){
    preparedApp = require(protocol).createServer(sslOptions,app);
}else if(protocol == "http")
    preparedApp = require(protocol).Server(app);

preparedApp.listen(socket_port, function(){
  //literally nothing here
});

$feedbackdump:

print_r: 
Array
(
    [url] => https://127.0.0.1:socket_port/posts
    [content_type] => 
    [http_code] => 0
    [header_size] => 0
    [request_size] => 0
    [filetime] => -1
    [ssl_verify_result] => 1
    [redirect_count] => 0
    [total_time] => 0.005724
    [namelookup_time] => 1.1E-5
    [connect_time] => 5.5E-5     //IT IS connecting / knows presence, but doens't route /posts...
    [pretransfer_time] => 0
    [size_upload] => 0
    [size_download] => 0
    [speed_download] => 0
    [speed_upload] => 0
    [download_content_length] => -1
    [upload_content_length] => -1
    [starttransfer_time] => 0
    [redirect_time] => 0
    [redirect_url] => 
    [primary_ip] => 127.0.0.1
    [certinfo] => Array
        (
        )

    [primary_port] => socket_port
    [local_ip] => 127.0.0.1
    [local_port] => 54576
)
Fane
  • 1,978
  • 8
  • 30
  • 58

1 Answers1

0

After doing some research I noticed curl_exec($ch) was returning false. After programming a throw such as

try{ $test = curl_exec($ch)

    if ($test)
        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);

   }

I got the error Curl failed with error #51: SSL: certificate subject name 'mydomain.com' does not match target host name '127.0.0.1'

TL;DR: So I just added

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

to the ch options and it is now working

Fane
  • 1,978
  • 8
  • 30
  • 58