mirror of
https://ghproxy.net/https://github.com/elementor/wp2static.git
synced 2025-09-01 02:21:16 +08:00
83 lines
1.9 KiB
PHP
83 lines
1.9 KiB
PHP
<?php
|
|
namespace Dropbox;
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
final class DropboxMetadataHeaderCatcher
|
|
{
|
|
/**
|
|
* @var mixed
|
|
*/
|
|
var $metadata = null;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
var $error = null;
|
|
|
|
/**
|
|
* @var bool
|
|
*/
|
|
var $skippedFirstLine = false;
|
|
|
|
/**
|
|
* @param resource $ch
|
|
*/
|
|
function __construct($ch)
|
|
{
|
|
curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this, 'headerFunction'));
|
|
}
|
|
|
|
/**
|
|
* @param resource $ch
|
|
* @param string $header
|
|
* @return int
|
|
* @throws Exception_BadResponse
|
|
*/
|
|
function headerFunction($ch, $header)
|
|
{
|
|
// The first line is the HTTP status line (Ex: "HTTP/1.1 200 OK").
|
|
if (!$this->skippedFirstLine) {
|
|
$this->skippedFirstLine = true;
|
|
return strlen($header);
|
|
}
|
|
|
|
// If we've encountered an error on a previous callback, then there's nothing left to do.
|
|
if ($this->error !== null) {
|
|
return strlen($header);
|
|
}
|
|
|
|
// case-insensitive starts-with check.
|
|
if (\substr_compare($header, "x-dropbox-metadata:", 0, 19, true) !== 0) {
|
|
return strlen($header);
|
|
}
|
|
|
|
if ($this->metadata !== null) {
|
|
$this->error = "Duplicate X-Dropbox-Metadata header";
|
|
return strlen($header);
|
|
}
|
|
|
|
$headerValue = substr($header, 19);
|
|
$parsed = json_decode($headerValue, true, 10);
|
|
|
|
if ($parsed === null) {
|
|
$this->error = "Bad JSON in X-Dropbox-Metadata header";
|
|
return strlen($header);
|
|
}
|
|
|
|
$this->metadata = $parsed;
|
|
return strlen($header);
|
|
}
|
|
|
|
function getMetadata()
|
|
{
|
|
if ($this->error !== null) {
|
|
throw new Exception_BadResponse($this->error);
|
|
}
|
|
if ($this->metadata === null) {
|
|
throw new Exception_BadResponse("Missing X-Dropbox-Metadata header");
|
|
}
|
|
return $this->metadata;
|
|
}
|
|
}
|