function api_output_utils_start_headers($rsp, $more = array())
{
    $defaults = array('is_error' => 0);
    $more = array_merge($defaults, $more);
    $codes = http_codes();
    $status_code = 200;
    if (isset($more['is_error']) && $more['is_error']) {
        $code = $rsp['error']['code'];
        $status_code = isset($codes[$code]) ? $code : 500;
    } else {
        if (isset($more['created'])) {
            $status_code = 201;
        } else {
        }
    }
    $status = "{$status_code} {$codes[$status_code]}";
    $enc_status = htmlspecialchars($status);
    utf8_headers();
    header("HTTP/1.1 {$enc_status}");
    header("Status: {$enc_status}");
    if (isset($more['is_error'])) {
        header("X-api-error-code: " . htmlspecialchars($rsp['error']['code']));
        header("X-api-error-message: " . htmlspecialchars($rsp['error']['message']));
    }
}
function _api_output_rest_send_json_headers()
{
    $content_type = 'application/json';
    if (request_isset('_jsondebug')) {
        $content_type = 'text/plain';
    }
    utf8_headers($content_type);
}
function api_output_send($rsp, $more = array())
{
    $json = json_encode($rsp);
    utf8_headers();
    # TO DO: these don't always appear to be being set correctly
    if (isset($more['is_error'])) {
        header("HTTP 500 Server Error");
        header("Status: 500 Server Error");
    }
    if (isset($more['cors_allow'])) {
        header("Access-Control-Allow-Origin: " . htmlspecialchars($more['cors_allow']));
    }
    if (!isset($more['inline'])) {
        header("Content-Type: text/json");
    }
    header("Content-Length: " . strlen($json));
    echo $json;
    exit;
}