8000 Refactor auto login. · yiwei-sun/leetcode-cli@03c9f04 · GitHub
[go: up one dir, main page]

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 03c9f04

Browse files
committed
Refactor auto login.
* prepare for some cases that session is expired, but still 200 ok returned. Signed-off-by: Eric Wang <skygragon@gmail.com>
1 parent 79d931e commit 03c9f04

File tree

2 files changed

+67
-38
lines changed

2 files changed

+67
-38
lines changed

lib/leetcode_client.js

Lines changed: 58 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -20,52 +20,82 @@ function makeOpts(url, expectedStatus) {
2020
opts.url = url;
2121
opts.headers = {};
2222
opts.expectedStatus = expectedStatus || 200;
23+
opts.retry = 0;
2324

2425
var core = require('./core');
2526
if (core.isLogin()) signOpts(opts, core.getUser());
2627
return opts;
2728
}
2829

29-
function checkError(e, resp, expectedStatus, msg) {
30-
if (e) return e;
30+
var EXPIRED_ERROR = {
31+
msg: 'session expired, please login again',
32+
statusCode: -1
33+
};
3134

32-
var code = resp.statusCode;
33-
if (resp && code !== expectedStatus) {
35+
function checkError(e, resp, expectedStatus, msg) {
36+
if (!e && resp && resp.statusCode !== expectedStatus) {
37+
var code = resp.statusCode;
3438
if (code === 403 || code === 401) {
35-
msg = msg || 'session expired, please login again';
39+
e = EXPIRED_ERROR;
40+
log.debug('session expired:' + code);
41+
} else {
42+
e = {msg: msg || 'http error', statusCode: code};
3643
}
37-
e = {msg: msg || 'http error', statusCode: code};
3844
}
3945
return e;
4046
}
4147

48+
function relogin(opts, cb) {
49+
log.debug('session expired, try to re-login...');
50+
++opts.retry;
51+
52+
var core = require('./core');
53+
var user = core.getUser();
54+
if (!user) {
55+
log.debug('login failed: no user found, please login again');
56+
return cb();
57+
}
58+
59+
core.login(user, function(e, user) {
60+
if (e) {
61+
log.debug('login failed:' + e);
62+
} else {
63+
log.debug('login successfully, cont\'d...');
64+
signOpts(opts, user);
65+
}
66+
// for now we don't care result, just blindly retry
67+
return cb();
68+
});
69+
}
70+
4271
// leetcode.com is limiting one session alive in the same time,
4372
// which means once you login on web, your cli session will get
4473
// expired immediately. In that case we will try to re-login in
4574
// the backend to give a seamless user experience.
4675
function requestWithReLogin(opts, cb) {
76+
if (opts.retry > 1) return cb(EXPIRED_ERROR);
77+
4778
var req = request(opts, function(e, resp, body) {
4879
e = checkError(e, resp, opts.expectedStatus);
4980

50-
// not session expired: transparently pass down
51-
if (!config.AUTO_LOGIN || !e) return cb(e, resp, body, req);
52-
if (e.statusCode !== 403 && e.statusCode !== 401) return cb(e, resp, body, req);
53-
54-
log.debug('session expired, auto re-login...');
55-
56-
var core = require('./core');
57-
var user = core.getUser();
58-
core.login(user, function(e2, user) {
59-
if (e2) return cb(e, resp, body, req);
60-
61-
log.debug('login successfully, cont\'d...');
62-
signOpts(opts, user);
63-
64-
req = request(opts, function(e, resp, body) {
65-
e = checkError(e, resp, opts.expectedStatus);
66-
return cb(e, resp, body, req);
81+
if (e === EXPIRED_ERROR && config.AUTO_LOGIN) {
82+
relogin(opts, function() {
83+
requestWithReLogin(opts, cb);
6784
});
68-
});
85+
return;
86+
}
87+
88+
try {
89+
return cb(e, resp, body, req);
90+
} catch (e2) {
91+
if (e2 === EXPIRED_ERROR && config.AUTO_LOGIN) {
92+
relogin(opts, function() {
93+
requestWithReLogin(opts, cb);
94+
});
95+
return;
96+
}
97+
return cb(e2);
98+
}
6999
});
70100
}
71101

@@ -81,8 +111,10 @@ leetcodeClient.getProblems = function(cb) {
81111

82112
// leetcode permits anonymous access to the problem list
83113
// while we require login first to make a better experience.
84-
if (json.user_name.length === 0)
85-
return cb('session expired, please login again');
114+
if (json.user_name.length === 0) {
115+
log.debug('no user info in list response, maybe session expired...');
116+
throw EXPIRED_ERROR;
117+
}
86118

87119
var problems = json.stat_status_pairs
88120
.filter(function(p) {

test/test_leetcode_client.js

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ describe('leetcode_client', function() {
1616
locked: false,
1717
file: '/dev/null'
1818
};
19+
var EXPIRED_ERROR = {
20+
msg: 'session expired, please login again',
21+
statusCode: -1
22+
};
1923

2024
before(function() {
2125
config.init();
@@ -57,11 +61,7 @@ describe('leetcode_client', function() {
5761
nock(config.URL_PROBLEMS).get('/').reply(403);
5862

5963
client.getProblems(function(e, problems) {
60-
var expected = {
61-
msg: 'session expired, please login again',
62-
statusCode: 403
63-
};
64-
assert.deepEqual(e, expected);
64+
assert.deepEqual(e, EXPIRED_ERROR);
6565
done();
6666
});
6767
});
@@ -83,17 +83,13 @@ describe('leetcode_client', function() {
8383
it('should fail if http error in relogin', function(done) {
8484
config.AUTO_LOGIN = true;
8585
nock(config.URL_PROBLEMS).get('/').reply(403);
86+
nock(config.URL_PROBLEMS).get('/').reply(403);
8687
core.login = function(user, cb) {
8788
return cb('unknown error!');
8889
};
8990

90-
// the original error will be returned instead
91-
var expected = {
92-
msg: 'session expired, please login again',
93-
statusCode: 403
94-
};
9591
client.getProblems(function(e, problems) {
96-
assert.deepEqual(e, expected);
92+
assert.deepEqual(e, EXPIRED_ERROR);
9793
done();
9894
});
9995
});
@@ -111,10 +107,11 @@ describe('leetcode_client', function() {
111107
});
112108

113109
it('should fail if not login', function(done) {
110+
config.AUTO_LOGIN = false;
114111
nock(config.URL_PROBLEMS).get('/').replyWithFile(200, './test/mock/problems.nologin.json.20161015');
115112

116113
client.getProblems(function(e, problems) {
117-
assert.equal(e, 'session expired, please login again');
114+
assert.deepEqual(e, EXPIRED_ERROR);
118115
done();
119116
});
120117
});

0 commit comments

Comments
 (0)
0