Skip to content
This repository was archived by the owner on Jul 30, 2023. It is now read-only.

Commit 2da1931

Browse files
committed
fix(Cookie - resolve multiply headers)
1 parent 3f8c1f9 commit 2da1931

File tree

10 files changed

+165
-42
lines changed

10 files changed

+165
-42
lines changed

cookie.android.js

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cookie.android.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
export function resolveCookieString(headers: okhttp3.Headers): string[] {
2+
const searchReg = /^set-cookie$/i;
3+
const length: number = headers.size();
4+
5+
let result: string[] = [];
6+
7+
for (let i = 0; i < length; i++) {
8+
const key = headers.name(i);
9+
if (key.match(searchReg)) {
10+
const value = headers.value(i);
11+
result = [...result, value];
12+
}
13+
}
14+
15+
return result;
16+
}

cookie.common.js

Lines changed: 63 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cookie.ts renamed to cookie.common.ts

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import { Headers } from 'tns-core-modules/http';
2+
import { isAndroid } from 'tns-core-modules/platform';
23
import { HttpsResponse } from './https.common';
34
import * as AppSettings from 'tns-core-modules/application-settings';
45
const MobileStorageCookieStore = require('tough-cookie-mobile-storage-store');
56
import { CookieJar } from 'tough-cookie-no-native';
7+
import { resolveCookieString as resolveCookieStringIOS } from './cookie.ios';
8+
import { resolveCookieString as resolveCookieStringAndroid } from './cookie.android';
69

710
const STORE_KEY = 'NS_COOKIE_STORE';
811

@@ -12,20 +15,12 @@ class NSStorageWrapper {
1215
}
1316

1417
const store = new MobileStorageCookieStore(new NSStorageWrapper(), STORE_KEY);
15-
const cookieJar = new CookieJar(store);
18+
export const cookieJar = new CookieJar(store);
1619

17-
function resolveCookieString(
18-
headers: Headers = {},
19-
{ existing }: { existing?: boolean } = {}
20-
): string {
21-
const searchReg = existing ? /^cookie$/i : /^set-cookie$/i;
22-
const key = Object.keys(headers).find(key => Boolean(key.match(searchReg)));
23-
const cookie = headers[key];
24-
return Array.isArray(cookie) ? cookie.reduce((s1, s2) => `${s1},${s2}`, '') : cookie;
25-
}
26-
27-
export function handleCookie(url: string, headers: Headers) {
28-
const cookies = resolveCookieString(headers);
20+
export function handleCookie(url: string, headers: okhttp3.Headers | NSDictionary<any, any>): void {
21+
const cookies = isAndroid
22+
? resolveCookieStringAndroid(<okhttp3.Headers>headers)
23+
: resolveCookieStringIOS(<NSDictionary<any, any>>headers);
2924

3025
console.log('received cookie');
3126
try {
@@ -34,15 +29,22 @@ export function handleCookie(url: string, headers: Headers) {
3429
console.log(error.message);
3530
}
3631

37-
cookies &&
38-
cookies
39-
.split(',')
40-
.map(cookie => cookie.trim())
41-
.forEach(cookie => cookieJar.setCookieSync(cookie, url, { ignoreError: true }));
32+
return (
33+
cookies &&
34+
cookies.length &&
35+
cookies.forEach(cookie => cookieJar.setCookieSync(cookie, url, { ignoreError: true }))
36+
);
37+
}
38+
39+
function resolvePassedCookieString(headers: Headers = {}): string {
40+
const searchReg = /^cookie$/i;
41+
const key = Object.keys(headers).find(key => Boolean(key.match(searchReg)));
42+
const cookie = headers[key];
43+
return Array.isArray(cookie) ? cookie.reduce((s1, s2) => `${s1}; ${s2}`, '') : cookie;
4244
}
4345

4446
export function mergeRequestHeaders(url: string, headers = {}): { [key: string]: string } {
45-
const cookies = resolveCookieString(headers, { existing: true });
47+
const cookies = resolvePassedCookieString(headers);
4648
const existingCookies = cookieJar.getCookieStringSync(url);
4749

4850
console.log('existing cookie');
@@ -52,11 +54,11 @@ export function mergeRequestHeaders(url: string, headers = {}): { [key: string]:
5254
console.log(error.message);
5355
}
5456

55-
const mergedCookie = [cookies, existingCookies]
57+
const mergedCookies = [cookies, existingCookies]
5658
.filter(str => str)
57-
.reduce((s1, s2) => s1 + s2, '');
59+
.reduce((s1, s2) => `${s1}; ${s2}`, '');
5860

59-
return mergedCookie ? { ...headers, Cookie: mergedCookie } : headers;
61+
return mergedCookies ? { ...headers, Cookie: mergedCookies } : headers;
6062
}
6163

6264
export function clearCookies(): void {

cookie.ios.js

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cookie.ios.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export function resolveCookieString(headers: NSDictionary<any, any>): string[] {
2+
const searchReg = /^set-cookie$/i;
3+
let result: string[] = [];
4+
5+
headers.enumerateKeysAndObjectsUsingBlock((key, value) => {
6+
if (key.match(searchReg)) {
7+
result = [...result, value];
8+
}
9+
});
10+
11+
return result;
12+
}

https.android.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

https.android.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -205,18 +205,18 @@ export function request({
205205

206206
const statusCode = response.code();
207207

208-
let headers = {};
209-
let heads: okhttp3.Headers = response.headers();
210-
let i: number,
211-
len: number = heads.size();
212-
for (i = 0; i < len; i++) {
208+
const headers = {};
209+
const heads: okhttp3.Headers = response.headers();
210+
const len: number = heads.size();
211+
212+
handleCookie(url, heads);
213+
214+
for (let i = 0; i < len; i++) {
213215
let key = heads.name(i);
214216
let value = heads.value(i);
215217
headers[key] = value;
216218
}
217219

218-
handleCookie(url, headers);
219-
220220
resolve({ content, statusCode, headers });
221221
},
222222
onFailure: function(task, error) {

https.ios.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

https.ios.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export function setupRedirects(follow: boolean) {
6464
function AFSuccess(
6565
task: NSURLSessionDataTask,
6666
data: NSDictionary<string, any> & NSData & NSArray<any>
67-
): Promise<{ task: NSURLSessionDataTask; content: any }> {
67+
): { task: NSURLSessionDataTask; content: any } {
6868
let content;
6969
if (data && data.class) {
7070
const { name } = data.class();
@@ -93,13 +93,13 @@ function AFSuccess(
9393
content = data;
9494
}
9595

96-
return Promise.resolve({ task, content });
96+
return { task, content };
9797
}
9898

9999
function AFFailure(
100100
task: NSURLSessionDataTask,
101101
{ description, localizedDescription, userInfo }: NSError
102-
): Promise<{ task: NSURLSessionDataTask; content: any; reason: any }> {
102+
): { task: NSURLSessionDataTask; content: any; reason: any } {
103103
const data: NSData = userInfo.valueForKey(AFNetworkingOperationFailingURLResponseDataErrorKey);
104104

105105
let body = NSString.alloc()
@@ -120,7 +120,7 @@ function AFFailure(
120120
content.description =
121121
'nativescript-https > Invalid SSL certificate! ' + content.description;
122122
}
123-
return Promise.resolve({ task, content, reason: localizedDescription });
123+
return { task, content, reason: localizedDescription };
124124
}
125125

126126
export function request({
@@ -166,7 +166,7 @@ export function request({
166166
return manager[methods[method]](
167167
url,
168168
dict,
169-
(task: NSURLSessionDataTask, data: any) => resolve(AFSuccess(task, data)),
169+
(task: NSURLSessionDataTask, data) => resolve(AFSuccess(task, data)),
170170
(task, error) => reject(AFFailure(task, error))
171171
);
172172
} catch (error) {
@@ -192,15 +192,14 @@ export function request({
192192
if (!isNullOrUndefined(response)) {
193193
const { statusCode, allHeaderFields } = response;
194194
sendi.statusCode = statusCode;
195+
handleCookie(url, allHeaderFields);
195196
allHeaderFields.enumerateKeysAndObjectsUsingBlock((k, v) => (sendi.headers[k] = v));
196197
}
197198

198199
if (reason) {
199200
sendi.reason = reason;
200201
}
201202

202-
handleCookie(url, sendi.headers);
203-
204203
return sendi;
205204
}
206205
);

0 commit comments

Comments
 (0)