THttpClient failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-06 05:23:30

问题


This is my code in Python to connect to the server which works very well.

transport = THttpClient.THttpClient(secureUrl)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
client = EdenRemote.Client(protocol)
transport.open()

print "calling openSession..."
client.openSession(sessionID, 1)

When I try to write the above code in PHP like this

$socket = new THttpClient($liveURL, 80, '', 'https');
$socket->setTimeoutSecs(50);
$transport = new TBufferedTransport($socket, 1024, 1024);
$protocol = new TBinaryProtocol($transport);
$client = new \edenremotephp\pub\EdenRemote\EdenRemoteClient($protocol);
$transport->open();
$client->openSession($result->sessionID, 1);

Then I got the following error

Array ( [type] => 2 [message] => fopen(https://edenremote.paceap.com/EdenRemote/d11fbf20-ca24-45f0-b176-4a22e28907c5): failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request [file] => /home/abbas/www/local.edenremote.com/sdk/Thrift/Transport/THttpClient.php [line] => 207 )

Line 207 code is

public function flush() {
    // God, PHP really has some esoteric ways of doing simple things.
    $host = $this->host_.($this->port_ != 80 ? ':'.$this->port_ : '');

    $headers = array();
    $defaultHeaders = array('Host' => $host,
                            'Accept' => 'application/x-thrift',
                            'User-Agent' => 'PHP/THttpClient',
                            'Content-Type' => 'application/x-thrift',
                            'Content-Length' => TStringFuncFactory::create()->strlen($this->buf_));
    foreach (array_merge($defaultHeaders, $this->headers_) as $key => $value) {
        $headers[] = "$key: $value";
    }

    $options = array('method' => 'POST',
                     'header' => implode("\r\n", $headers),
                     'max_redirects' => 1,
                     'content' => $this->buf_);
    if ($this->timeout_ > 0) {
      $options['timeout'] = $this->timeout_;
    }
    $this->buf_ = '';

    $contextid = stream_context_create(array('http' => $options));
    $this->handle_ = @fopen($this->scheme_.'://'.$host.$this->uri_, 'r', false, $contextid);

    // Connect failed?
    if ($this->handle_ === FALSE) {
      $this->handle_ = null;
      $error = 'THttpClient: Could not connect to '.$host.$this->uri_;
      throw new TTransportException($error, TTransportException::NOT_OPEN);
    }
  }

Even I tried to change the https with the ssl. For transport even i tried

$transport = new TFramedTransport($socket, 1024, 1024);

回答1:


Here was the issue with the THttpClient call. The first parameter should be the host and the uri should be in the 3rd parameter.

so the exact way to call it is

$result = json_decode(exec('./Authenticator.py'));
$liveURL = $result->secureUrl;
$liveURI = preg_replace('#^https?://edenremote.paceap.com#', '', rtrim($result->secureUrl,'/'));
$socket = new THttpClient('edenremote.paceap.com', 80, $liveURI, 'https');
$socket->setTimeoutSecs(50);
$transport = new TBufferedTransport($socket, 1024, 1024);
$protocol = new TBinaryProtocol($transport);
$client = new \edenremotephp\pub\EdenRemote\EdenRemoteClient($protocol);
$transport->open();
$client->openSession($result->sessionID, 1);
$isExist = $client->findUserByEmailAddress($result->sessionID, $account->primaryEmail);
var_dump($isExist);
$client->closeSession($result->sessionID);
echo 'Done';


来源:https://stackoverflow.com/questions/44775782/thttpclient-failed-to-open-stream-http-request-failed-http-1-1-400-bad-request

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!