protected function end() { if ($this->profile) { Zotero_DB::profileEnd($this->objectLibraryID, true); } switch ($this->responseCode) { case 200: // Output a Content-Type header for the given format // // Note that this overrides any Content-Type set elsewhere. To force a content // type elsewhere, clear $this->queryParams['format'] when calling header() // manually. // // TODO: Check headers_list so that clearing the format parameter manually isn't // necessary? Performance? if (isset($this->queryParams['format'])) { Zotero_API::outputContentType($this->queryParams['format']); } break; case 301: case 302: case 303: // Handled in $this->redirect() break; case 401: header('WWW-Authenticate: Basic realm="Zotero API"'); header('HTTP/1.1 401 Unauthorized'); break; // PHP completes these automatically // PHP completes these automatically case 201: case 204: case 300: case 304: case 400: case 403: case 404: case 405: case 409: case 412: case 413: case 422: case 500: case 501: case 503: header("HTTP/1.1 " . $this->responseCode); break; case 428: header("HTTP/1.1 428 Precondition Required"); break; case 429: header("HTTP/1.1 429 Too Many Requests"); break; default: throw new Exception("Unsupported response code " . $this->responseCode); } if (isset($this->libraryVersion)) { if ($this->apiVersion >= 2) { header("Last-Modified-Version: " . $this->libraryVersion); } // Send notification if library has changed if ($this->isWriteMethod()) { if ($this->libraryVersion > Zotero_Libraries::getOriginalVersion($this->objectLibraryID)) { Zotero_Notifier::trigger('modify', 'library', $this->objectLibraryID); } } } if ($this->responseXML instanceof SimpleXMLElement) { if (!$this->responseCode) { $updated = (string) $this->responseXML->updated; if ($updated) { $updated = strtotime($updated); $ifModifiedSince = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false; $ifModifiedSince = strtotime($ifModifiedSince); if ($ifModifiedSince >= $updated) { header('HTTP/1.1 304 Not Modified'); exit; } $lastModified = substr(date('r', $updated), 0, -5) . "GMT"; header("Last-Modified: {$lastModified}"); } } $xmlstr = $this->responseXML->asXML(); // TEMP: Strip control characters $xmlstr = Zotero_Utilities::cleanString($xmlstr, true); $doc = new DOMDocument('1.0'); $doc->loadXML($xmlstr); $doc->formatOutput = true; echo $doc->saveXML(); } $this->logRequestTime(); self::addHeaders(); echo ob_get_clean(); exit; }