3
3
import com .google .common .cache .Cache ;
4
4
import com .google .common .cache .CacheBuilder ;
5
5
import com .intellij .openapi .project .Project ;
6
- import com .intellij .util .io .HttpRequests ;
6
+ import com .intellij .util .net .HttpConfigurable ;
7
+ import com .intellij .util .net .IdeaWideAuthenticator ;
8
+ import com .intellij .util .net .IdeaWideProxySelector ;
9
+ import com .shuzijun .lc .LcClient ;
10
+ import com .shuzijun .lc .errors .LcException ;
11
+ import com .shuzijun .lc .http .DefaultExecutoHttp ;
12
+ import com .shuzijun .lc .http .HttpClient ;
7
13
import com .shuzijun .leetcode .plugin .model .HttpRequest ;
8
- import org . apache . commons . lang3 . StringUtils ;
9
- import org . apache . http . HttpHeaders ;
14
+ import okhttp3 . Credentials ;
15
+ import okhttp3 . OkHttpClient ;
10
16
import org .jetbrains .annotations .NotNull ;
11
17
12
- import java .io .IOException ;
13
- import java .net .*;
18
+ import java .net .CookieHandler ;
19
+ import java .net .CookieManager ;
20
+ import java .net .HttpCookie ;
21
+ import java .net .PasswordAuthentication ;
22
+ import java .util .Arrays ;
14
23
import java .util .List ;
15
24
import java .util .Map ;
25
+ import java .util .Objects ;
16
26
import java .util .concurrent .TimeUnit ;
17
27
18
28
/**
@@ -22,6 +32,9 @@ public class HttpRequestUtils {
22
32
23
33
private static final Cache <String , HttpResponse > httpResponseCache = CacheBuilder .newBuilder ().expireAfterWrite (30 , TimeUnit .SECONDS ).build ();
24
34
35
+ private static MyExecutorHttp executorHttp = new MyExecutorHttp ();
36
+ private static LcClient enLcClient = LcClient .builder (HttpClient .SiteEnum .EN ).executorHttp (executorHttp ).build ();
37
+ private static LcClient cnLcClient = LcClient .builder (HttpClient .SiteEnum .CN ).executorHttp (executorHttp ).build ();
25
38
private static final CookieManager cookieManager = new CookieManager (null , (uri , cookie ) -> {
26
39
if (uri == null || cookie == null || uri .getHost ().equals ("hm.baidu.com" )) {
27
40
return false ;
@@ -33,18 +46,36 @@ public class HttpRequestUtils {
33
46
CookieHandler .setDefault (cookieManager );
34
47
}
35
48
49
+ private static HttpResponse buildResp (com .shuzijun .lc .http .HttpResponse response , HttpResponse httpResponse ) {
50
+ httpResponse .setUrl (response .getHttpRequest ().getUrl ());
51
+ httpResponse .setStatusCode (response .getStatusCode ());
52
+ httpResponse .setBody (response .getBody ());
53
+ return httpResponse ;
54
+ }
55
+
56
+ private static Map <String , String > getHeader (String url ) {
57
+ if (url .contains (HttpClient .SiteEnum .EN .defaultEndpoint )){
58
+ return enLcClient .getClient ().getHeader ();
59
+ } else {
60
+ return cnLcClient .getClient ().getHeader ();
61
+ }
62
+ }
63
+
36
64
@ NotNull
37
65
public static HttpResponse executeGet (HttpRequest httpRequest ) {
38
66
39
67
return CacheProcessor .processor (httpRequest , request -> {
68
+
40
69
HttpResponse httpResponse = new HttpResponse ();
41
70
try {
42
- HttpRequests .request (request .getUrl ()).
43
- throwStatusCodeException (false ).
44
- tuner (new HttpRequestTuner (request )).
45
- connect (new HttpResponseProcessor (request , httpResponse ));
71
+ com .shuzijun .lc .http .HttpRequest .HttpRequestBuilder builder = com .shuzijun .lc .http .HttpRequest .
72
+ builderGet (request .getUrl ()).body (request .getBody ()).addHeader (getHeader (request .getUrl ()));
73
+ if (request .getHeader () != null ) {
74
+ builder .addHeader (request .getHeader ());
75
+ }
76
+ return buildResp (executorHttp .executeGet (builder .build ()), httpResponse );
46
77
47
- } catch (IOException e ) {
78
+ } catch (LcException e ) {
48
79
LogUtils .LOG .error ("HttpRequestUtils request error:" , e );
49
80
httpResponse .setStatusCode (-1 );
50
81
}
@@ -59,11 +90,13 @@ public static HttpResponse executePost(HttpRequest httpRequest) {
59
90
return CacheProcessor .processor (httpRequest , request -> {
60
91
HttpResponse httpResponse = new HttpResponse ();
61
92
try {
62
- HttpRequests .post (request .getUrl (), request .getContentType ())
63
- .throwStatusCodeException (false )
64
- .tuner (new HttpRequestTuner (request ))
65
- .connect (new HttpResponseProcessor (request , httpResponse ));
66
- } catch (IOException e ) {
93
+ com .shuzijun .lc .http .HttpRequest .HttpRequestBuilder builder = com .shuzijun .lc .http .HttpRequest .
94
+ builderPost (request .getUrl (), request .getContentType ()).body (request .getBody ()).addHeader (getHeader (request .getUrl ()));
95
+ if (request .getHeader () != null ) {
96
+ builder .addHeader (request .getHeader ());
97
+ }
98
+ return buildResp (executorHttp .executePost (builder .build ()), httpResponse );
99
+ } catch (LcException e ) {
67
100
LogUtils .LOG .error ("HttpRequestUtils request error:" , e );
68
101
httpResponse .setStatusCode (-1 );
69
102
}
@@ -75,11 +108,13 @@ public static HttpResponse executePut(HttpRequest httpRequest) {
75
108
return CacheProcessor .processor (httpRequest , request -> {
76
109
HttpResponse httpResponse = new HttpResponse ();
77
110
try {
78
- HttpRequests .put (request .getUrl (), request .getContentType ())
79
- .throwStatusCodeException (false )
80
- .tuner (new HttpRequestTuner (request ))
81
- .connect (new HttpResponseProcessor (request , httpResponse ));
82
- } catch (IOException e ) {
111
+ com .shuzijun .lc .http .HttpRequest .HttpRequestBuilder builder = com .shuzijun .lc .http .HttpRequest .
112
+ builderPut (request .getUrl (), request .getContentType ()).body (request .getBody ()).addHeader (getHeader (request .getUrl ()));
113
+ if (request .getHeader () != null ) {
114
+ builder .addHeader (request .getHeader ());
115
+ }
116
+ return buildResp (executorHttp .executePut (builder .build ()), httpResponse );
117
+ } catch (LcException e ) {
83
118
LogUtils .LOG .error ("HttpRequestUtils request error:" , e );
84
119
httpResponse .setStatusCode (-1 );
85
120
}
@@ -88,17 +123,8 @@ public static HttpResponse executePut(HttpRequest httpRequest) {
88
123
}
89
124
90
125
public static String getToken () {
91
- if (cookieManager .getCookieStore ().getCookies () == null ) {
92
- return null ;
93
- }
94
- for (HttpCookie cookie : cookieManager .getCookieStore ().getCookies ()) {
95
- if (StringUtils .isNotBlank (cookie .getDomain ()) &&
96
- cookie .getDomain ().toLowerCase ().contains (URLUtils .getLeetcodeHost ()) && "csrftoken" .equals (cookie .getName ())) {
97
- return cookie .getValue ();
98
- }
99
-
100
- }
101
- return null ;
126
+ Map <String ,String > headerMap = getHeader (URLUtils .getLeetcodeHost ());
127
+ return headerMap .get ("x-csrftoken" );
102
128
}
103
129
104
130
public static boolean isLogin (Project project ) {
@@ -110,87 +136,15 @@ public static boolean isLogin(Project project) {
110
136
}
111
137
112
138
public static void setCookie (List <HttpCookie > cookieList ) {
113
-
114
- cookieManager .getCookieStore ().removeAll ();
115
- for (HttpCookie cookie : cookieList ) {
116
- cookie .setVersion (0 );
117
- cookieManager .getCookieStore ().add (null , cookie );
118
- }
139
+ enLcClient .getClient ().cookieStore ().clearCookie (URLUtils .getLeetcodeHost ());
140
+ enLcClient .getClient ().cookieStore ().addCookie (URLUtils .getLeetcodeHost (),cookieList );
119
141
}
120
142
121
143
public static void resetHttpclient () {
122
- cookieManager .getCookieStore ().removeAll ();
123
- }
124
-
125
-
126
- private static void defaultHeader (HttpRequest httpRequest ) {
127
- Map <String , String > header = httpRequest .getHeader ();
128
- header .putIfAbsent (HttpHeaders .USER_AGENT , "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36" );
129
- header .putIfAbsent (HttpHeaders .ACCEPT , "*/*" );
130
- //header.putIfAbsent(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate, br");
131
- header .putIfAbsent (HttpHeaders .ACCEPT_LANGUAGE , "zh-CN,zh;q=0.9" );
132
- header .putIfAbsent ("origin" , URLUtils .getLeetcodeUrl ());
133
- //header.putIfAbsent(":authority", URLUtils.getLeetcodeHost());
134
- //header.putIfAbsent(":scheme", "https");
135
- }
136
-
137
- private static class HttpRequestTuner implements HttpRequests .ConnectionTuner {
138
-
139
- private final HttpRequest httpRequest ;
140
-
141
- public HttpRequestTuner (HttpRequest httpRequest ) {
142
- this .httpRequest = httpRequest ;
143
- }
144
-
145
- @ Override
146
- public void tune (@ NotNull URLConnection urlConnection ) throws IOException {
147
-
148
- if (StringUtils .isNotBlank (getToken ()) && (urlConnection .getURL ().toString ().contains (URLUtils .leetcode ) || urlConnection .getURL ().toString ().contains (URLUtils .leetcodecn ))) {
149
- urlConnection .addRequestProperty ("x-csrftoken" , getToken ());
150
- }
151
- urlConnection .addRequestProperty ("referer" , urlConnection .getURL ().toString ());
152
- //urlConnection.addRequestProperty(":path", urlConnection.getURL().getPath());
153
-
154
- defaultHeader (httpRequest );
155
- httpRequest .getHeader ().forEach (urlConnection ::addRequestProperty );
156
- }
144
+ enLcClient .getClient ().cookieStore ().clearCookie (URLUtils .getLeetcodeHost ());
157
145
}
158
146
159
147
160
- private static class HttpResponseProcessor implements HttpRequests .RequestProcessor <HttpResponse > {
161
-
162
- private final HttpRequest httpRequest ;
163
- private final HttpResponse httpResponse ;
164
-
165
- public HttpResponseProcessor (HttpRequest httpRequest , HttpResponse httpResponse ) {
166
- this .httpRequest = httpRequest ;
167
- this .httpResponse = httpResponse ;
168
- }
169
-
170
- @ Override
171
- public HttpResponse process (@ NotNull HttpRequests .Request request ) throws IOException {
172
-
173
- if (StringUtils .isNoneBlank (httpRequest .getBody ())) {
174
- request .write (httpRequest .getBody ());
175
- }
176
-
177
- URLConnection urlConnection = request .getConnection ();
178
-
179
- if (!(urlConnection instanceof HttpURLConnection )) {
180
- httpResponse .setStatusCode (-1 );
181
- return httpResponse ;
182
- } else {
183
- httpResponse .setStatusCode (((HttpURLConnection ) urlConnection ).getResponseCode ());
184
- }
185
- httpResponse .setUrl (urlConnection .getURL ().toString ());
186
- try {
187
- httpResponse .setBody (request .readString ());
188
- } catch (IOException ignore ) {
189
- }
190
- return httpResponse ;
191
- }
192
- }
193
-
194
148
private static class CacheProcessor {
195
149
public static HttpResponse processor (HttpRequest httpRequest , HttpRequestUtils .Callable <HttpResponse > callable ) {
196
150
@@ -222,4 +176,38 @@ private interface Callable<V> {
222
176
V call (HttpRequest request );
223
177
}
224
178
179
+
180
+ private static class MyExecutorHttp extends DefaultExecutoHttp {
181
+ @ Override
182
+ public OkHttpClient getRequestClient () {
183
+ final HttpConfigurable httpConfigurable = HttpConfigurable .getInstance ();
184
+ if (!httpConfigurable .USE_HTTP_PROXY && !httpConfigurable .USE_PROXY_PAC ) {
185
+ return super .getRequestClient ();
186
+ }
187
+ final IdeaWideProxySelector ideaWideProxySelector = new IdeaWideProxySelector (httpConfigurable );
188
+ OkHttpClient .Builder builder = super .getRequestClient ().newBuilder ().proxySelector (ideaWideProxySelector );
189
+ if (httpConfigurable .PROXY_AUTHENTICATION ) {
190
+ final IdeaWideAuthenticator ideaWideAuthenticator = new IdeaWideAuthenticator (httpConfigurable );
191
+ final okhttp3 .Authenticator proxyAuthenticator = getProxyAuthenticator (ideaWideAuthenticator );
192
+ builder .proxyAuthenticator (proxyAuthenticator );
193
+ }
194
+ return builder .build ();
195
+ }
196
+
197
+ private okhttp3 .Authenticator getProxyAuthenticator (IdeaWideAuthenticator ideaWideAuthenticator ) {
198
+ okhttp3 .Authenticator proxyAuthenticator = null ;
199
+
200
+ if (Objects .nonNull (ideaWideAuthenticator )) {
201
+ proxyAuthenticator = (route , response ) -> {
202
+ final PasswordAuthentication authentication = ideaWideAuthenticator .getPasswordAuthentication ();
203
+ final String credential = Credentials .basic (authentication .getUserName (), Arrays .toString (authentication .getPassword ()));
204
+ return response .request ().newBuilder ()
205
+ .header ("Proxy-Authorization" , credential )
206
+ .build ();
207
+ };
208
+ }
209
+ return proxyAuthenticator ;
210
+ }
211
+ }
225
212
}
213
+
0 commit comments