11package com .koushikdutta .async .http ;
22
3+ import android .text .TextUtils ;
4+
5+ import com .koushikdutta .async .AsyncSSLException ;
36import com .koushikdutta .async .AsyncSSLSocketWrapper ;
47import com .koushikdutta .async .AsyncSocket ;
8+ import com .koushikdutta .async .LineEmitter ;
9+ import com .koushikdutta .async .Util ;
10+ import com .koushikdutta .async .callback .CompletedCallback ;
511import com .koushikdutta .async .callback .ConnectCallback ;
12+ import com .koushikdutta .async .http .libcore .RawHeaders ;
613
714import javax .net .ssl .HostnameVerifier ;
815import javax .net .ssl .SSLContext ;
916import javax .net .ssl .TrustManager ;
17+
18+ import java .io .IOException ;
1019import java .net .URI ;
1120
1221public class AsyncSSLSocketMiddleware extends AsyncSocketMiddleware {
@@ -33,12 +42,70 @@ public void setHostnameVerifier(HostnameVerifier hostnameVerifier) {
3342 }
3443
3544 @ Override
36- protected ConnectCallback wrapCallback (final ConnectCallback callback , final URI uri , final int port ) {
45+ protected ConnectCallback wrapCallback (final ConnectCallback callback , final URI uri , final int port , final boolean proxied ) {
3746 return new ConnectCallback () {
3847 @ Override
39- public void onConnectCompleted (Exception ex , AsyncSocket socket ) {
48+ public void onConnectCompleted (Exception ex , final AsyncSocket socket ) {
4049 if (ex == null ) {
41- callback .onConnectCompleted (ex , new AsyncSSLSocketWrapper (socket , uri .getHost (), port , sslContext , trustManagers , hostnameVerifier , true ));
50+ if (!proxied ) {
51+ callback .onConnectCompleted (null , new AsyncSSLSocketWrapper (socket , uri .getHost (), port , sslContext , trustManagers , hostnameVerifier , true ));
52+ }
53+ else {
54+ System .out .println ("requsting SSL PROXY: " + uri .getHost ());
55+ RawHeaders connect = new RawHeaders ();
56+ connect .setStatusLine (String .format ("CONNECT %s:%s HTTP/1.1" , uri .getHost (), port ));
57+ Util .writeAll (socket , connect .toHeaderString ().getBytes (), new CompletedCallback () {
58+ @ Override
59+ public void onCompleted (Exception ex ) {
60+ if (ex != null ) {
61+ callback .onConnectCompleted (ex , socket );
62+ return ;
63+ }
64+
65+ LineEmitter liner = new LineEmitter ();
66+ liner .setLineCallback (new LineEmitter .StringCallback () {
67+ String statusLine ;
68+ @ Override
69+ public void onStringAvailable (String s ) {
70+ if (statusLine == null ) {
71+ statusLine = s ;
72+ if (statusLine .length () > 128 || !statusLine .contains ("200" )) {
73+ socket .setDataCallback (null );
74+ socket .setEndCallback (null );
75+ callback .onConnectCompleted (new IOException ("non 200 status line" ), socket );
76+ }
77+ }
78+ else {
79+ socket .setDataCallback (null );
80+ socket .setEndCallback (null );
81+ if (TextUtils .isEmpty (s .trim ())) {
82+ callback .onConnectCompleted (null , new AsyncSSLSocketWrapper (socket , uri .getHost (), port , sslContext , trustManagers , hostnameVerifier , true ));
83+ }
84+ else {
85+ callback .onConnectCompleted (new IOException ("unknown second status line" ), socket );
86+ }
87+ }
88+ }
89+ });
90+
91+ socket .setDataCallback (liner );
92+
93+ socket .setEndCallback (new CompletedCallback () {
94+ @ Override
95+ public void onCompleted (Exception ex ) {
96+ if (!socket .isOpen ())
97+ ex = new IOException ("socket closed before proxy connect response" );
98+ callback .onConnectCompleted (ex , socket );
99+ }
100+ });
101+
102+ // AsyncSocket wrapper = socket;
103+ // if (ex == null)
104+ // wrapper = new AsyncSSLSocketWrapper(socket, uri.getHost(), port, sslContext, trustManagers, hostnameVerifier, true);
105+ // callback.onConnectCompleted(ex, wrapper);
106+ }
107+ });
108+ }
42109 }
43110 else {
44111 callback .onConnectCompleted (ex , socket );
0 commit comments