+ /**
+ * @param string $key The name of the header to get (case insensitive).
+ * @return string|null The header value (if set); null otherwise.
+ */
+ public function getHeader( $key ) {
+ $key = strtoupper( $key );
+
+ if ( isset( $this->headers[$key] ) ) {
+ return $this->headers[$key];
+ }
+ return null;
+ }
+
+ /**
+ * Get the HTTP response code, null if not set
+ *
+ * @return int|null
+ */
+ public function getStatusCode() {
+ return $this->code;
+ }
+
+ /**
+ * @param string $name The name of the cookie.
+ * @param string $value The value to be stored in the cookie.
+ * @param int|null $expire Ignored in this faux subclass.
+ * @param array $options Ignored in this faux subclass.
+ */
+ public function setCookie( $name, $value, $expire = 0, $options = [] ) {
+ global $wgCookiePath, $wgCookiePrefix, $wgCookieDomain;
+ global $wgCookieSecure, $wgCookieExpiration, $wgCookieHttpOnly;
+
+ $options = array_filter( $options, function ( $a ) {
+ return $a !== null;
+ } ) + [
+ 'prefix' => $wgCookiePrefix,
+ 'domain' => $wgCookieDomain,
+ 'path' => $wgCookiePath,
+ 'secure' => $wgCookieSecure,
+ 'httpOnly' => $wgCookieHttpOnly,
+ 'raw' => false,
+ ];
+
+ if ( $expire === null ) {
+ $expire = 0; // Session cookie
+ } elseif ( $expire == 0 && $wgCookieExpiration != 0 ) {
+ $expire = time() + $wgCookieExpiration;
+ }
+
+ $this->cookies[$options['prefix'] . $name] = [
+ 'value' => (string)$value,
+ 'expire' => (int)$expire,
+ 'path' => (string)$options['path'],
+ 'domain' => (string)$options['domain'],
+ 'secure' => (bool)$options['secure'],
+ 'httpOnly' => (bool)$options['httpOnly'],
+ 'raw' => (bool)$options['raw'],
+ ];
+ }
+
+ /**
+ * @param string $name
+ * @return string|null
+ */
+ public function getCookie( $name ) {
+ if ( isset( $this->cookies[$name] ) ) {
+ return $this->cookies[$name]['value'];
+ }
+ return null;
+ }
+
+ /**
+ * @param string $name
+ * @return array|null
+ */
+ public function getCookieData( $name ) {
+ if ( isset( $this->cookies[$name] ) ) {