define([ "dojo/_base/declare", "dojo/_base/lang", "implab/safe" ,"./ContentType", "./BaseResponse", "./Cookie" ], function(declare, lang,safe, ContentType, BaseResponse, Cookie) { return declare(BaseResponse, { statusCode : 0, _headers : null, content : null, _contentType : null, _cookies : null, getContentType : function() { return this._contentType; }, setContentType : function(value) { if (value) { this._contentType = value instanceof ContentType ? value : ContentType.parse(value.toString()); this._headers["Content-Type"] = this._contentType.toString(); } else { this._contentType = null; delete this._headers["Content-Type"]; } this._headers["Content-Type"] = value ? value.toString() : value; }, /** * Записывает cookies * @cookie {String|Cookie} печенька или имя печеньки или печенька сохраненная в строку. * @value? {*} если {cookie} строка с именем, то в этом параметре передается значение. * @options? {Object} если {cookie} строка с именем, то в этом параметре передаются дополнительные свойства печенек. */ setCookie : function(cookie /*, value, options*/) { if (arguments.length == 1) { if (safe.isString(cookie)) cookie = Cookie.parse(cookie); safe.argumentOfType(cookie, Cookie, "cookie"); this._cookies[cookie.name] = cookie; } else { safe.argumentNotEmptyString(cookie,"cookie"); let value = arguments[1]; let options = arguments[2]; let cc = new Cookie(cookie,value,options); this._cookies[cc.name] = cc; } }, _setCookies : function(cookies) { if (!(cookies instanceof Array)) cookies = [cookies]; let me = this; cookies.forEach(function(cookie){ me.setCookie(cookie); }); }, forgetCookie : function(name) { this.setCookie(new Cookie(name,"__erased__", { maxAge : 0 })); }, setHeader : function(name, value) { if (!name) throw "A name is requried"; name = this._normalizeHeaderName(name); if (name == "Content-Type") this.setContentType(value); if (name == "Set-Cookie") this._setCookies(value); else this._headers[name] = value; }, getHeader : function(name) { if (!name) throw "A name is requried"; name = this._normalizeHeaderName(name); return this._headers[name]; }, _normalizeHeaderName : function(name) { return name.toLowerCase().replace(/\b\w/g, function(s) { return s.toUpperCase(); }); }, constructor : function(content, options) { this._headers = {}; this._cookies = {}; this.content = content; this.statusCode = content ? 200 : 203; if (options) { if ("statusCode" in options) this.statusCode = options.statusCode; if ("headers" in options) { for ( let header in options.headers) this.setHeader(header, options.headers[header]); } if ("contentType" in options) this.setContentType(options.contentType); } }, send : function(serverResponse) { if (!serverResponse) throw "ServerResponse is required"; this.writeHead(serverResponse); this.writeEntity(serverResponse); serverResponse.end(); }, writeHead : function(serverResponse) { let headers = lang.clone(this._headers); let cookies = []; for (let key in this._cookies) cookies.push(this._cookies[key].toString()); headers["Set-Cookie"] = cookies; serverResponse.writeHead(this.statusCode, headers); }, writeEntity : function(serverResponse) { if (this.content instanceof Function) { this.content(serverResponse); } else if (this.content) { serverResponse.write(this.content, this._contentType ? this._contentType.parameters.charset : undefined); } } }); });