mirror of https://github.com/MISP/MISP
Merge pull request #6822 from JakubOnderka/server-sync-compression
new: [sync] Enable compression for server syncpull/6828/head
commit
9e0e58aa32
|
@ -1627,28 +1627,31 @@ class ServersController extends AppController
|
|||
|
||||
public function postTest()
|
||||
{
|
||||
if ($this->request->is('post')) {
|
||||
// Fix for PHP-FPM / Nginx / etc
|
||||
// Fix via https://www.popmartian.com/tipsntricks/2015/07/14/howto-use-php-getallheaders-under-fastcgi-php-fpm-nginx-etc/
|
||||
if (!function_exists('getallheaders')) {
|
||||
$headers = [];
|
||||
foreach ($_SERVER as $name => $value) {
|
||||
if (substr($name, 0, 5) == 'HTTP_') {
|
||||
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$headers = getallheaders();
|
||||
}
|
||||
$result = array();
|
||||
$result['body'] = $this->request->data;
|
||||
$result['headers']['Content-type'] = isset($headers['Content-type']) ? $headers['Content-type'] : 0;
|
||||
$result['headers']['Accept'] = isset($headers['Accept']) ? $headers['Accept'] : 0;
|
||||
$result['headers']['Authorization'] = isset($headers['Authorization']) ? 'OK' : 0;
|
||||
return new CakeResponse(array('body'=> json_encode($result), 'type' => 'json'));
|
||||
} else {
|
||||
if (!$this->request->is('post')) {
|
||||
throw new MethodNotAllowedException('Invalid request, expecting a POST request.');
|
||||
}
|
||||
// Fix for PHP-FPM / Nginx / etc
|
||||
// Fix via https://www.popmartian.com/tipsntricks/2015/07/14/howto-use-php-getallheaders-under-fastcgi-php-fpm-nginx-etc/
|
||||
if (!function_exists('getallheaders')) {
|
||||
$headers = [];
|
||||
foreach ($_SERVER as $name => $value) {
|
||||
if (substr($name, 0, 5) === 'HTTP_') {
|
||||
$headers[strtolower(str_replace('_', '-', substr($name, 5)))] = $value;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$headers = getallheaders();
|
||||
$headers = array_change_key_case($headers, CASE_LOWER);
|
||||
}
|
||||
$result = [
|
||||
'body' => $this->request->data,
|
||||
'headers' => [
|
||||
'Content-type' => isset($headers['content-type']) ? $headers['content-type'] : 0,
|
||||
'Accept' => isset($headers['accept']) ? $headers['accept'] : 0,
|
||||
'Authorization' => isset($headers['authorization']) ? 'OK' : 0,
|
||||
],
|
||||
];
|
||||
return new CakeResponse(array('body'=> json_encode($result), 'type' => 'json'));
|
||||
}
|
||||
|
||||
public function getRemoteUser($id)
|
||||
|
@ -1728,7 +1731,8 @@ class ServersController extends AppController
|
|||
'version' => implode('.', $version),
|
||||
'mismatch' => $mismatch,
|
||||
'newer' => $newer,
|
||||
'post' => isset($post) ? $post : 'too old',
|
||||
'post' => isset($post) ? $post['status'] : 'too old',
|
||||
'response_encoding' => isset($post['content-encoding']) ? $post['content-encoding'] : null,
|
||||
'client_certificate' => $result['client_certificate'],
|
||||
)
|
||||
),
|
||||
|
|
|
@ -91,6 +91,27 @@ class HttpSocketExtended extends HttpSocket
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $request
|
||||
* @return HttpSocketResponseExtended
|
||||
*/
|
||||
public function request($request = array())
|
||||
{
|
||||
// Reset last error
|
||||
$this->lastError = [];
|
||||
|
||||
/** @var HttpSocketResponseExtended $response */
|
||||
$response = parent::request($request);
|
||||
if ($response === false) {
|
||||
throw new InvalidArgumentException("Invalid argument provided.");
|
||||
}
|
||||
// Convert connection timeout to SocketException
|
||||
if (!empty($this->lastError)) {
|
||||
throw new SocketException($this->lastError['msg']);
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns accepted content encodings (compression algorithms)
|
||||
* @return string[]
|
||||
|
|
|
@ -12,7 +12,7 @@ class SyncTool
|
|||
*/
|
||||
public function setupHttpSocket($server = null, $timeout = false, $model = 'Server')
|
||||
{
|
||||
$params = array();
|
||||
$params = ['compress' => true];
|
||||
if (!empty($server)) {
|
||||
if (!empty($server[$model]['cert_file'])) {
|
||||
$params['ssl_cafile'] = APP . "files" . DS . "certs" . DS . $server[$model]['id'] . '.pem';
|
||||
|
|
|
@ -1761,15 +1761,17 @@ class Feed extends AppModel
|
|||
|
||||
$request = $this->__createFeedRequest($feed['Feed']['headers']);
|
||||
|
||||
if ($followRedirect) {
|
||||
$response = $this->getFollowRedirect($HttpSocket, $uri, $request);
|
||||
} else {
|
||||
$response = $HttpSocket->get($uri, array(), $request);
|
||||
try {
|
||||
if ($followRedirect) {
|
||||
$response = $this->getFollowRedirect($HttpSocket, $uri, $request);
|
||||
} else {
|
||||
$response = $HttpSocket->get($uri, array(), $request);
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
throw new Exception("Fetching the '$uri' failed with exception: {$e->getMessage()}", 0, $e);
|
||||
}
|
||||
|
||||
if ($response === false) {
|
||||
throw new Exception("Could not reach '$uri'.");
|
||||
} else if ($response->code != 200) { // intentionally !=
|
||||
if ($response->code != 200) { // intentionally !=
|
||||
throw new Exception("Fetching the '$uri' failed with HTTP error {$response->code}: {$response->reasonPhrase}");
|
||||
}
|
||||
|
||||
|
|
|
@ -4722,7 +4722,7 @@ class Server extends AppModel
|
|||
|
||||
/**
|
||||
* @param array $server
|
||||
* @return int
|
||||
* @return array
|
||||
* @throws JsonException
|
||||
*/
|
||||
public function runPOSTtest(array $server)
|
||||
|
@ -4737,12 +4737,13 @@ class Server extends AppModel
|
|||
|
||||
try {
|
||||
$response = $HttpSocket->post($uri, json_encode(array('testString' => $testFile)), $request);
|
||||
$contentEncoding = $response->getHeader('Content-Encoding');
|
||||
$rawBody = $response->body;
|
||||
$response = $this->jsonDecode($rawBody);
|
||||
} catch (Exception $e) {
|
||||
$title = 'Error: POST connection test failed. Reason: ' . $e->getMessage();
|
||||
$this->loadLog()->createLogEntry('SYSTEM', 'error', 'Server', $server['Server']['id'], $title);
|
||||
return 8;
|
||||
return ['status' => 8];
|
||||
}
|
||||
if (!isset($response['body']['testString']) || $response['body']['testString'] !== $testFile) {
|
||||
if (!empty($repsonse['body']['testString'])) {
|
||||
|
@ -4755,18 +4756,18 @@ class Server extends AppModel
|
|||
|
||||
$title = 'Error: POST connection test failed due to the message body not containing the expected data. Response: ' . PHP_EOL . PHP_EOL . $responseString;
|
||||
$this->loadLog()->createLogEntry('SYSTEM', 'error', 'Server', $server['Server']['id'], $title);
|
||||
return 9;
|
||||
return ['status' => 9, 'content-encoding' => $contentEncoding];
|
||||
}
|
||||
$headers = array('Accept', 'Content-type');
|
||||
foreach ($headers as $header) {
|
||||
if (!isset($response['headers'][$header]) || $response['headers'][$header] != 'application/json') {
|
||||
if (!isset($response['headers'][$header]) || $response['headers'][$header] !== 'application/json') {
|
||||
$responseHeader = isset($response['headers'][$header]) ? $response['headers'][$header] : 'Header was not set.';
|
||||
$title = 'Error: POST connection test failed due to a header not matching the expected value. Expected: "application/json", received "' . $responseHeader . '"';
|
||||
$title = 'Error: POST connection test failed due to a header ' . $header . ' not matching the expected value. Expected: "application/json", received "' . $responseHeader . '"';
|
||||
$this->loadLog()->createLogEntry('SYSTEM', 'error', 'Server', $server['Server']['id'], $title);
|
||||
return 10;
|
||||
return ['status' => 10, 'content-encoding' => $contentEncoding];
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
return ['status' => 1, 'content-encoding' => $contentEncoding];
|
||||
}
|
||||
|
||||
public function checkVersionCompatibility($id, $user = array(), $HttpSocket = false)
|
||||
|
|
Loading…
Reference in New Issue