'use strict'; const getType = require('cache-content-type'); const isJSON = require('koa-is-json'); const REAL_STATUS = Symbol('Context#realStatus'); module.exports = { /** * Get or set the length of content. * * For Get: If the original content length is null or undefined, it will read out * the body's content length as the return value. * * @member {Number} Response#type * @param {Number} len The content-length to be set. */ set length(len) { // copy from koa // change header name to lower case this.set('content-length', len); }, get length() { // copy from koa const len = this.header['content-length']; const body = this.body; if (len == null) { if (!body) return; if (typeof body === 'string') return Buffer.byteLength(body); if (Buffer.isBuffer(body)) return body.length; if (isJSON(body)) return Buffer.byteLength(JSON.stringify(body)); return; } return parseInt(len, 10); }, /** * Get or set the content-type. * * For Set: If type is null or undefined, this property will be removed. * * For Get: If the value is null or undefined, an empty string will be returned; * if you have multiple values seperated by `;`, ONLY the first one will be returned. * * @member {String} Response#type * @param {String} type The content-type to be set. */ set type(type) { // copy from koa // Different: // - change header name to lower case type = getType(type); if (type) { this.set('content-type', type); } else { this.remove('content-type'); } }, get type() { // copy from koa const type = this.get('content-type'); if (!type) return ''; return type.split(';')[0]; }, /** * Get or set a real status code. * * e.g.: Using 302 status redirect to the global error page * instead of show current 500 status page. * And access log should save 500 not 302, * then the `realStatus` can help us find out the real status code. * @member {Number} Response#realStatus * @return {Number} The status code to be set. */ get realStatus() { if (this[REAL_STATUS]) { return this[REAL_STATUS]; } return this.status; }, /** * Set a real status code. * * e.g.: Using 302 status redirect to the global error page * instead of show current 500 status page. * And access log should save 500 not 302, * then the `realStatus` can help us find out the real status code. * @member {Number} Response#realStatus * @param {Number} status The status code to be set. */ set realStatus(status) { this[REAL_STATUS] = status; }, };