1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-16 11:44:42 +02:00

Update WireHttp to support server protocol and add new sendStatusHeader() method

This commit is contained in:
Ryan Cramer
2020-09-10 09:20:45 -04:00
parent 868224bcfe
commit 5fce455fbd

View File

@@ -742,7 +742,8 @@ class WireHttp extends Wire {
$this->setHeader('content-length', strlen($content)); $this->setHeader('content-length', strlen($content));
$request = "$method $path$query HTTP/1.0\r\nHost: $host\r\n"; $proto = $this->wire()->config->serverProtocol;
$request = "$method $path$query $proto\r\nHost: $host\r\n";
foreach($this->headers as $key => $value) { foreach($this->headers as $key => $value) {
$request .= "$key: $value\r\n"; $request .= "$key: $value\r\n";
@@ -1489,7 +1490,7 @@ class WireHttp extends Wire {
* - `reset` (bool): Reset/clear headers that were set to WireHttp after sending? (default=false) * - `reset` (bool): Reset/clear headers that were set to WireHttp after sending? (default=false)
* - `headers` (array): Array [ name => value ] of headers to send, or omit to use headers set to WireHttp instance (default=[]) * - `headers` (array): Array [ name => value ] of headers to send, or omit to use headers set to WireHttp instance (default=[])
* - `httpCode` (int): HTTP status code to send or omit for none (default=0, aka dont send) * - `httpCode` (int): HTTP status code to send or omit for none (default=0, aka dont send)
* - `httpVersion` (string): HTTP version string (default='1.1') * - `httpVersion` (string): HTTP version string like "1.1" (default=version string pulled from current server protcol)
* - `replacements` (array): Associative array of [ find => replace ] strings to replace values in headers, i.e. `[ '{filesize}' => 12345 ]` (default=[]) * - `replacements` (array): Associative array of [ find => replace ] strings to replace values in headers, i.e. `[ '{filesize}' => 12345 ]` (default=[])
* @return array Returns the headers that were sent (with duplicates removed, replacements processed, and lowercase header names) * @return array Returns the headers that were sent (with duplicates removed, replacements processed, and lowercase header names)
* @throws WireException If given an unrecognized `$option['status']` code * @throws WireException If given an unrecognized `$option['status']` code
@@ -1497,23 +1498,30 @@ class WireHttp extends Wire {
* *
*/ */
public function sendHeaders(array $options = array()) { public function sendHeaders(array $options = array()) {
$defaults = array( $defaults = array(
'reset' => false, 'reset' => false,
'headers' => array(), 'headers' => array(),
'httpCode' => 0, 'httpCode' => 0,
'httpVersion' => '1.1', 'httpVersion' => '',
'replacements' => array(), 'replacements' => array(),
); );
$options = array_merge($defaults, $options); $options = array_merge($defaults, $options);
$headers = empty($options['headers']) ? $this->headers : $options['headers']; $headers = empty($options['headers']) ? $this->headers : $options['headers'];
$httpCode = (int) $options['httpCode']; $httpCode = (int) $options['httpCode'];
if(!$httpCode && isset($headers['httpcode'])) { if(!$httpCode && isset($headers['httpcode'])) {
if(ctype_digit($headers['httpcode'])) $httpCode = (int) $headers['httpcode']; if(ctype_digit($headers['httpcode'])) $httpCode = (int) $headers['httpcode'];
} }
if($httpCode > 0) { if($httpCode > 0) {
if(!isset($this->httpCodes[$httpCode])) throw new WireException("Unrecognized http status code: $httpCode"); if(!isset($this->httpCodes[$httpCode])) throw new WireException("Unrecognized http status code: $httpCode");
$this->sendHeader("HTTP/$options[httpVersion] $httpCode " . $this->httpCodes[$httpCode]); $proto = empty($options['httpVersion']) ? $this->wire()->config->serverProtocol : $options['httpVersion'];
if(!strpos($proto, '/')) $proto = "HTTP/$proto";
$this->sendHeader("$proto $httpCode " . $this->httpCodes[$httpCode]);
} }
$a = array(); $a = array();
foreach($headers as $key => $value) { foreach($headers as $key => $value) {
$key = strtolower($key); $key = strtolower($key);
@@ -1523,10 +1531,13 @@ class WireHttp extends Wire {
} }
$a[$key] = $value; $a[$key] = $value;
} }
foreach($a as $key => $value) { foreach($a as $key => $value) {
$this->sendHeader($key, $value); $this->sendHeader($key, $value);
} }
if($options['reset'] && $headers === $this->headers) $this->headers = array(); if($options['reset'] && $headers === $this->headers) $this->headers = array();
return $a; return $a;
} }
@@ -1548,6 +1559,25 @@ class WireHttp extends Wire {
} }
} }
/**
* Send an HTTP status header
*
* @param int|string $status Status code (i.e. '200') or code and text (i.e. '200 OK')
* @since 3.0.166
*
*/
public function sendStatusHeader($status) {
if(ctype_digit("$status")) {
$statusText = isset($this->httpCodes[(int) $status]) ? $this->httpCodes[(int) $status] : '';
$status = "$status $statusText";
}
if(stripos($status, 'HTTP/') !== 0) {
$proto = $this->wire()->config->serverProtocol;
$status = "$proto $status";
}
$this->sendHeader($status);
}
/** /**
* Validate a URL for WireHttp use * Validate a URL for WireHttp use
* *