2018-10-17 21:52:26 +02:00
|
|
|
<?php
|
|
|
|
declare(strict_types = 1);
|
2018-11-06 03:57:36 +01:00
|
|
|
namespace Psalm\Internal\LanguageServer;
|
2018-10-17 21:52:26 +02:00
|
|
|
|
|
|
|
use AdvancedJsonRpc\Message as MessageBody;
|
2019-06-26 22:52:29 +02:00
|
|
|
use function array_pop;
|
2019-07-05 22:24:00 +02:00
|
|
|
use function explode;
|
2019-06-26 22:52:29 +02:00
|
|
|
use function strlen;
|
2018-10-17 21:52:26 +02:00
|
|
|
|
2018-12-02 00:37:49 +01:00
|
|
|
/**
|
|
|
|
* @internal
|
|
|
|
*/
|
2018-10-17 21:52:26 +02:00
|
|
|
class Message
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* @var ?\AdvancedJsonRpc\Message
|
|
|
|
*/
|
|
|
|
public $body;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @var string[]
|
|
|
|
*/
|
|
|
|
public $headers;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Parses a message
|
|
|
|
*
|
|
|
|
* @param string $msg
|
2019-07-05 22:24:00 +02:00
|
|
|
*
|
2018-10-17 21:52:26 +02:00
|
|
|
* @return Message
|
|
|
|
* @psalm-suppress UnusedMethod
|
|
|
|
*/
|
|
|
|
public static function parse(string $msg): Message
|
|
|
|
{
|
|
|
|
$obj = new self;
|
|
|
|
$parts = explode("\r\n", $msg);
|
|
|
|
$obj->body = MessageBody::parse(array_pop($parts));
|
|
|
|
foreach ($parts as $line) {
|
|
|
|
if ($line) {
|
|
|
|
$pair = explode(': ', $line);
|
|
|
|
$obj->headers[$pair[0]] = $pair[1];
|
|
|
|
}
|
|
|
|
}
|
2019-07-05 22:24:00 +02:00
|
|
|
|
2018-10-17 21:52:26 +02:00
|
|
|
return $obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param \AdvancedJsonRpc\Message $body
|
|
|
|
* @param string[] $headers
|
|
|
|
*/
|
|
|
|
public function __construct(MessageBody $body = null, array $headers = [])
|
|
|
|
{
|
|
|
|
$this->body = $body;
|
|
|
|
if (!isset($headers['Content-Type'])) {
|
|
|
|
$headers['Content-Type'] = 'application/vscode-jsonrpc; charset=utf8';
|
|
|
|
}
|
|
|
|
$this->headers = $headers;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function __toString(): string
|
|
|
|
{
|
|
|
|
$body = (string)$this->body;
|
|
|
|
$contentLength = strlen($body);
|
|
|
|
$this->headers['Content-Length'] = (string) $contentLength;
|
|
|
|
$headers = '';
|
|
|
|
foreach ($this->headers as $name => $value) {
|
|
|
|
$headers .= "$name: $value\r\n";
|
|
|
|
}
|
2019-07-05 22:24:00 +02:00
|
|
|
|
2018-10-17 21:52:26 +02:00
|
|
|
return $headers . "\r\n" . $body;
|
|
|
|
}
|
|
|
|
}
|