|
|
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);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
});
|
|
|
});
|