@spinajs/http 1.2.165 → 1.2.166
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/config/http.js +4 -2
- package/lib/config/http.js.map +1 -1
- package/lib/interfaces.d.ts +10 -0
- package/lib/interfaces.js.map +1 -1
- package/lib/response-methods/cookieResponse.d.ts +3 -1
- package/lib/response-methods/cookieResponse.js +11 -4
- package/lib/response-methods/cookieResponse.js.map +1 -1
- package/package.json +2 -2
package/lib/config/http.js
CHANGED
|
@@ -12,16 +12,18 @@ function dir(path) {
|
|
|
12
12
|
return (0, path_1.resolve)((0, path_1.normalize)((0, path_1.join)(__dirname, path)));
|
|
13
13
|
}
|
|
14
14
|
const corsPath = (0, path_1.resolve)((0, path_1.normalize)((0, path_1.join)(process.cwd(), 'cors.json')));
|
|
15
|
-
const
|
|
15
|
+
const cOptions = require(corsPath);
|
|
16
16
|
const corsOptions = {
|
|
17
17
|
origin(origin, callback) {
|
|
18
|
-
if (!
|
|
18
|
+
if (!cOptions || cOptions.origins.length === 0 || cOptions.origins.indexOf(origin) !== -1) {
|
|
19
19
|
callback(null, true);
|
|
20
20
|
}
|
|
21
21
|
else {
|
|
22
22
|
callback(new Error('cors not allowed'));
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
|
+
exposedHeaders: cOptions.exposedHeaders,
|
|
26
|
+
allowedHeaders: cOptions.allowedHeaders,
|
|
25
27
|
credentials: true,
|
|
26
28
|
};
|
|
27
29
|
module.exports = {
|
package/lib/config/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/config/http.ts"],"names":[],"mappings":";;AAAA,kCAAkC;AAClC,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AACnC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACjC,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAE7B,+BAAgD;AAChD,8CAAkD;AAElD,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO,IAAA,cAAO,EAAC,IAAA,gBAAS,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,QAAQ,GAAG,IAAA,cAAO,EAAC,IAAA,gBAAS,EAAC,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;AACtE,MAAM,
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/config/http.ts"],"names":[],"mappings":";;AAAA,kCAAkC;AAClC,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AACnC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACjC,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAE7B,+BAAgD;AAChD,8CAAkD;AAElD,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO,IAAA,cAAO,EAAC,IAAA,gBAAS,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,QAAQ,GAAG,IAAA,cAAO,EAAC,IAAA,gBAAS,EAAC,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;AACtE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEnC,MAAM,WAAW,GAAG;IAClB,MAAM,CAAC,MAAW,EAAE,QAAa;QAC/B,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;YACzF,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;SACtB;aAAM;YACL,QAAQ,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;SACzC;IACH,CAAC;IACD,cAAc,EAAE,QAAQ,CAAC,cAAc;IACvC,cAAc,EAAE,QAAQ,CAAC,cAAc;IACvC,WAAW,EAAE,IAAI;CAClB,CAAC;AAEF,MAAM,CAAC,OAAO,GAAG;IACf,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,OAAO,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC9B,KAAK,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC1B,WAAW,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;SACvC;KACF;IACD,MAAM,EAAE;QACN,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE;YACP,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,IAAI;SACf;KACF;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,IAAI;QACV,WAAW,EAAE;YACX,MAAM,EAAE;YACR,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,KAAK;aACb,CAAC;YACF,OAAO,CAAC,UAAU,CAAC;gBACjB,QAAQ,EAAE,IAAI;aACf,CAAC;YACF,YAAY,EAAE;YACd,WAAW,EAAE;YACb,IAAI,CAAC,WAAW,CAAC;SAClB;QAED;;WAEG;QACH,KAAK,EAAE;YACL,OAAO,EAAE,IAAI,GAAG,IAAI;YAEpB,qFAAqF;YACrF,QAAQ,EAAE,GAAG,CAAC,oBAAoB,CAAC;SACpC;QAED;;WAEG;QACH,MAAM,EAAE;YACN;gBACE;;mBAEG;gBACH,KAAK,EAAE,SAAS;gBAEhB;;mBAEG;gBACH,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC;aACxB;SACF;QAED;;WAEG;QACH,aAAa,EAAE,8BAAiB,CAAC,IAAI,GAAG,8BAAiB,CAAC,IAAI;QAE9D;;;WAGG;QACH,aAAa,EAAE;;;;;;;;;;;;;4BAaS;KACzB;CACF,CAAC"}
|
package/lib/interfaces.d.ts
CHANGED
|
@@ -300,6 +300,16 @@ export interface IRouteParameter {
|
|
|
300
300
|
export interface IRouteCall {
|
|
301
301
|
Payload: any;
|
|
302
302
|
}
|
|
303
|
+
export interface ICookieOptions {
|
|
304
|
+
maxAge?: number | undefined;
|
|
305
|
+
signed?: boolean | undefined;
|
|
306
|
+
expires?: Date | undefined;
|
|
307
|
+
httpOnly?: boolean | undefined;
|
|
308
|
+
path?: string | undefined;
|
|
309
|
+
domain?: string | undefined;
|
|
310
|
+
secure?: boolean | undefined;
|
|
311
|
+
sameSite?: boolean | 'lax' | 'strict' | 'none' | undefined;
|
|
312
|
+
}
|
|
303
313
|
export interface IRoute {
|
|
304
314
|
/**
|
|
305
315
|
* url path eg. /foo/bar/:id
|
package/lib/interfaces.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";;;AACA,oCAAuD;AAGvD;;GAEG;AACH,IAAY,iBAoBX;AApBD,WAAY,iBAAiB;IAC3B;;OAEG;IACH,yDAAQ,CAAA;IAER;;OAEG;IACH,yDAAQ,CAAA;IAER;;OAEG;IACH,uDAAO,CAAA;IAEP;;OAEG;IACH,uDAAe,CAAA;AACjB,CAAC,EApBW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAoB5B;AAsCD,MAAsB,gBAAiB,SAAQ,gBAAW;CAKzD;AALD,4CAKC;AAED;;GAEG;AACH,IAAY,gBAwEX;AAxED,WAAY,gBAAgB;IAC1B;;OAEG;IACH,qDAAQ,CAAA;IAER;;OAEG;IACH,+DAAa,CAAA;IAEb;;OAEG;IACH,iEAAc,CAAA;IAEd;;OAEG;IACH,qEAAgB,CAAA;IAEhB;;;;OAIG;IACH,+EAAqB,CAAA;IAErB;;OAEG;IACH,yEAAkB,CAAA;IAElB;;OAEG;IACH,uEAAiB,CAAA;IAEjB;;OAEG;IACH,yEAAkB,CAAA;IAElB;;OAEG;IACH,mEAAe,CAAA;IAEf;;OAEG;IACH,mEAAe,CAAA;IAEf;;OAEG;IACH,6EAAoB,CAAA;IAEpB;;OAEG;IACH,iEAAc,CAAA;IAEd;;OAEG;IACH,6EAAoB,CAAA;IAEpB;;OAEG;IACH,+EAAqB,CAAA;AACvB,CAAC,EAxEW,gBAAgB,GAAhB,wBAAgB,KAAhB,wBAAgB,QAwE3B;AAED;;GAEG;AACH,IAAY,SAqCX;AArCD,WAAY,SAAS;IACnB;;OAEG;IACH,0BAAa,CAAA;IAEb;;OAEG;IACH,wBAAW,CAAA;IAEX;;OAEG;IACH,wBAAW,CAAA;IAEX;;OAEG;IACH,8BAAiB,CAAA;IAEjB;;OAEG;IACH,4BAAe,CAAA;IAEf;;OAEG;IACH,0BAAa,CAAA;IAEb;;OAEG;IACH,0BAAa,CAAA;IAEb,gCAAmB,CAAA;AACrB,CAAC,EArCW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAqCpB;AAED,IAAY,WAKX;AALD,WAAY,WAAW;IACrB,yCAAE,CAAA;IACF,yCAAE,CAAA;IACF,yCAAE,CAAA;IACF,yCAAE,CAAA;AACJ,CAAC,EALW,WAAW,GAAX,mBAAW,KAAX,mBAAW,QAKtB;AAED;;GAEG;AACH,IAAY,aAoEX;AApED,WAAY,aAAa;IACvB;;OAEG;IACH,kCAAiB,CAAA;IAEjB;;OAEG;IACH,wCAAuB,CAAA;IAEvB;;OAEG;IACH,sCAAqB,CAAA;IAErB;;OAEG;IACH,0CAAyB,CAAA;IAEzB;;OAEG;IACH,sCAAqB,CAAA;IAErB;;OAEG;IACH,sCAAqB,CAAA;IAErB;;OAEG;IACH,oCAAmB,CAAA;IAEnB;;OAEG;IACH,8CAA6B,CAAA;IAE7B;;OAEG;IACH,4CAA2B,CAAA;IAE3B;;OAEG;IACH,wCAAuB,CAAA;IAEvB;;OAEG;IACH,0CAAyB,CAAA;IAEzB;;OAEG;IACH,0CAAyB,CAAA;IAEzB;;OAEG;IACH,qCAAoB,CAAA;IAEpB,mBAAmB;IACnB,sCAAqB,CAAA;AACvB,CAAC,EApEW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAoExB;
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";;;AACA,oCAAuD;AAGvD;;GAEG;AACH,IAAY,iBAoBX;AApBD,WAAY,iBAAiB;IAC3B;;OAEG;IACH,yDAAQ,CAAA;IAER;;OAEG;IACH,yDAAQ,CAAA;IAER;;OAEG;IACH,uDAAO,CAAA;IAEP;;OAEG;IACH,uDAAe,CAAA;AACjB,CAAC,EApBW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAoB5B;AAsCD,MAAsB,gBAAiB,SAAQ,gBAAW;CAKzD;AALD,4CAKC;AAED;;GAEG;AACH,IAAY,gBAwEX;AAxED,WAAY,gBAAgB;IAC1B;;OAEG;IACH,qDAAQ,CAAA;IAER;;OAEG;IACH,+DAAa,CAAA;IAEb;;OAEG;IACH,iEAAc,CAAA;IAEd;;OAEG;IACH,qEAAgB,CAAA;IAEhB;;;;OAIG;IACH,+EAAqB,CAAA;IAErB;;OAEG;IACH,yEAAkB,CAAA;IAElB;;OAEG;IACH,uEAAiB,CAAA;IAEjB;;OAEG;IACH,yEAAkB,CAAA;IAElB;;OAEG;IACH,mEAAe,CAAA;IAEf;;OAEG;IACH,mEAAe,CAAA;IAEf;;OAEG;IACH,6EAAoB,CAAA;IAEpB;;OAEG;IACH,iEAAc,CAAA;IAEd;;OAEG;IACH,6EAAoB,CAAA;IAEpB;;OAEG;IACH,+EAAqB,CAAA;AACvB,CAAC,EAxEW,gBAAgB,GAAhB,wBAAgB,KAAhB,wBAAgB,QAwE3B;AAED;;GAEG;AACH,IAAY,SAqCX;AArCD,WAAY,SAAS;IACnB;;OAEG;IACH,0BAAa,CAAA;IAEb;;OAEG;IACH,wBAAW,CAAA;IAEX;;OAEG;IACH,wBAAW,CAAA;IAEX;;OAEG;IACH,8BAAiB,CAAA;IAEjB;;OAEG;IACH,4BAAe,CAAA;IAEf;;OAEG;IACH,0BAAa,CAAA;IAEb;;OAEG;IACH,0BAAa,CAAA;IAEb,gCAAmB,CAAA;AACrB,CAAC,EArCW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAqCpB;AAED,IAAY,WAKX;AALD,WAAY,WAAW;IACrB,yCAAE,CAAA;IACF,yCAAE,CAAA;IACF,yCAAE,CAAA;IACF,yCAAE,CAAA;AACJ,CAAC,EALW,WAAW,GAAX,mBAAW,KAAX,mBAAW,QAKtB;AAED;;GAEG;AACH,IAAY,aAoEX;AApED,WAAY,aAAa;IACvB;;OAEG;IACH,kCAAiB,CAAA;IAEjB;;OAEG;IACH,wCAAuB,CAAA;IAEvB;;OAEG;IACH,sCAAqB,CAAA;IAErB;;OAEG;IACH,0CAAyB,CAAA;IAEzB;;OAEG;IACH,sCAAqB,CAAA;IAErB;;OAEG;IACH,sCAAqB,CAAA;IAErB;;OAEG;IACH,oCAAmB,CAAA;IAEnB;;OAEG;IACH,8CAA6B,CAAA;IAE7B;;OAEG;IACH,4CAA2B,CAAA;IAE3B;;OAEG;IACH,wCAAuB,CAAA;IAEvB;;OAEG;IACH,0CAAyB,CAAA;IAEzB;;OAEG;IACH,0CAAyB,CAAA;IAEzB;;OAEG;IACH,qCAAoB,CAAA;IAEpB,mBAAmB;IACnB,sCAAqB,CAAA;AACvB,CAAC,EApEW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAoExB;AAqLD;;;GAGG;AACH,MAAsB,cAAc;CAenC;AAfD,wCAeC;AAWD;;;;GAIG;AACH,MAAsB,UAAU;CAgB/B;AAhBD,gCAgBC;AA2BD;;;;;;;GAOG;AACH,MAAsB,eAAe;CASpC;AATD,0CASC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as express from 'express';
|
|
2
2
|
import { Response } from '../responses';
|
|
3
|
+
import { ICookieOptions } from '../interfaces';
|
|
3
4
|
/**
|
|
4
5
|
* Simpel wrapper for coockie response for api consistency.
|
|
5
6
|
* It also signs cookie with coockie-secure
|
|
@@ -9,6 +10,7 @@ export declare class CookieResponse extends Response {
|
|
|
9
10
|
protected value: string;
|
|
10
11
|
protected cookieLifetime: number;
|
|
11
12
|
protected data?: any;
|
|
12
|
-
|
|
13
|
+
protected options?: ICookieOptions;
|
|
14
|
+
constructor(name: string, value: string, cookieLifetime: number, data?: any, options?: ICookieOptions);
|
|
13
15
|
execute(_req: express.Request, res: express.Response): Promise<(req: express.Request<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>, res: express.Response<any, Record<string, any>>) => void>;
|
|
14
16
|
}
|
|
@@ -34,23 +34,30 @@ const interfaces_1 = require("../interfaces");
|
|
|
34
34
|
* It also signs cookie with coockie-secure
|
|
35
35
|
*/
|
|
36
36
|
class CookieResponse extends responses_1.Response {
|
|
37
|
-
constructor(name, value, cookieLifetime, data) {
|
|
37
|
+
constructor(name, value, cookieLifetime, data, options) {
|
|
38
38
|
super(value);
|
|
39
39
|
this.name = name;
|
|
40
40
|
this.value = value;
|
|
41
41
|
this.cookieLifetime = cookieLifetime;
|
|
42
42
|
this.data = data;
|
|
43
|
+
this.options = options;
|
|
43
44
|
}
|
|
44
45
|
async execute(_req, res) {
|
|
45
46
|
const cfg = di_1.DI.get(configuration_1.Configuration);
|
|
46
|
-
const
|
|
47
|
+
const opt = cfg.get('http.cookie.options', {});
|
|
48
|
+
if (this.options) {
|
|
49
|
+
Object.assign(opt, this.options);
|
|
50
|
+
}
|
|
51
|
+
if (this.cookieLifetime) {
|
|
52
|
+
Object.assign(opt, { maxAge: this.cookieLifetime });
|
|
53
|
+
}
|
|
47
54
|
if (!this.responseData) {
|
|
48
|
-
res.clearCookie(this.name,
|
|
55
|
+
res.clearCookie(this.name, opt);
|
|
49
56
|
}
|
|
50
57
|
else {
|
|
51
58
|
const secureKey = cfg.get('http.cookie.secret');
|
|
52
59
|
const signed = cs.sign(this.responseData, secureKey);
|
|
53
|
-
res.cookie(this.name, signed,
|
|
60
|
+
res.cookie(this.name, signed, opt);
|
|
54
61
|
}
|
|
55
62
|
return await (0, responses_1.httpResponse)(this.data, interfaces_1.HTTP_STATUS_CODE.OK, 'responses/ok');
|
|
56
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cookieResponse.js","sourceRoot":"","sources":["../../src/response-methods/cookieResponse.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AACA,4CAAsD;AACtD,0DAAuD;AACvD,oCAAiC;AACjC,qDAAuC;AACvC,
|
|
1
|
+
{"version":3,"file":"cookieResponse.js","sourceRoot":"","sources":["../../src/response-methods/cookieResponse.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AACA,4CAAsD;AACtD,0DAAuD;AACvD,oCAAiC;AACjC,qDAAuC;AACvC,8CAAiE;AAGjE;;;GAGG;AACH,MAAa,cAAe,SAAQ,oBAAQ;IAC1C,YAAsB,IAAY,EAAY,KAAa,EAAY,cAAsB,EAAY,IAAU,EAAY,OAAwB;QACrJ,KAAK,CAAC,KAAK,CAAC,CAAC;QADO,SAAI,GAAJ,IAAI,CAAQ;QAAY,UAAK,GAAL,KAAK,CAAQ;QAAY,mBAAc,GAAd,cAAc,CAAQ;QAAY,SAAI,GAAJ,IAAI,CAAM;QAAY,YAAO,GAAP,OAAO,CAAiB;IAEvJ,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,IAAqB,EAAE,GAAqB;QAC/D,MAAM,GAAG,GAAkB,OAAE,CAAC,GAAG,CAAC,6BAAa,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAgB,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAE9D,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;SAClC;QAED,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;SACrD;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,GAAoB,CAAC,CAAC;SAClD;aAAM;YACL,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAS,oBAAoB,CAAC,CAAC;YACxD,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;YAErD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAU,CAAC,CAAC;SAC3C;QAED,OAAO,MAAM,IAAA,wBAAY,EAAC,IAAI,CAAC,IAAI,EAAE,6BAAgB,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IAC5E,CAAC;CACF;AA5BD,wCA4BC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spinajs/http",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.166",
|
|
4
4
|
"description": "framework HTTP module base on express.js",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"private": false,
|
|
@@ -61,5 +61,5 @@
|
|
|
61
61
|
"tempfile": "3.0.0",
|
|
62
62
|
"uuid": "^8.3.2"
|
|
63
63
|
},
|
|
64
|
-
"gitHead": "
|
|
64
|
+
"gitHead": "377b80f2710c60f964aa0fa728e9d24501378b8b"
|
|
65
65
|
}
|