1818import org .apache .commons .io .IOUtils ;
1919import org .apache .commons .lang .NotImplementedException ;
2020import org .apache .http .HttpHost ;
21- import org .apache .http .HttpResponse ;
2221import org .apache .http .HttpStatus ;
2322import org .apache .http .auth .AuthScope ;
2423import org .apache .http .auth .UsernamePasswordCredentials ;
3635import org .piwigo .remotesync .api .exception .ClientServerException ;
3736import org .piwigo .remotesync .api .exception .ServerException ;
3837import org .piwigo .remotesync .api .request .AbstractRequest ;
38+ import org .piwigo .remotesync .api .request .ComposedRequest ;
39+ import org .piwigo .remotesync .api .request .IChunkable ;
3940import org .piwigo .remotesync .api .response .BasicResponse ;
41+ import org .piwigo .remotesync .api .response .ComposedResponse ;
4042import org .piwigo .remotesync .api .response .ServerResponse ;
4143import org .piwigo .remotesync .api .xml .PersisterFactory ;
4244import org .slf4j .Logger ;
4850 * System.out.println(response.getStatusLine().getStatusCode());
4951 * System.out.println(response.getStatusLine().getReasonPhrase());
5052 * System.out.println(response.getStatusLine().toString());
51- *
52- * TODO handle proxy
5353 */
5454public class WSClient extends AbstractClient {
5555
@@ -63,34 +63,69 @@ public WSClient(IClientConfiguration clientConfiguration) {
6363 this .clientConfiguration = clientConfiguration ;
6464 }
6565
66- @ SuppressWarnings ("unchecked" )
66+ @ Override
67+ public <T extends BasicResponse > T sendRequest (AbstractRequest <T > request ) throws ClientServerException {
68+ handleChunkable (request );
69+ return super .sendRequest (request );
70+ }
71+
72+ @ Override
73+ public <T extends BasicResponse > ComposedResponse <T > sendRequest (ComposedRequest <T > composedRequest ) throws ClientServerException {
74+ handleChunkable (composedRequest );
75+ return super .sendRequest (composedRequest );
76+ }
77+
78+ protected <T extends BasicResponse > void handleChunkable (AbstractRequest <T > request ) {
79+ if (request instanceof IChunkable )
80+ ((IChunkable ) request ).setChunkSize (clientConfiguration .getChunkSize ());
81+ }
82+
6783 @ Override
6884 protected <T extends BasicResponse > T doSendRequest (AbstractRequest <T > request ) throws ClientServerException {
6985 checkRequestAuthorization (request );
7086
71- if (httpClient == null ) {
72- HttpClientBuilder httpClientBuilder = HttpClientBuilder .create ();
87+ String content = getXmlResponse (request );
7388
74- if (clientConfiguration .getUsesProxy ()) {
75- String proxyUrl = clientConfiguration .getProxyUrl ();
76- int proxyPort = clientConfiguration .getProxyPort ();
77-
78- String proxyUsername = clientConfiguration .getProxyUsername ();
79- String proxyPassword = clientConfiguration .getProxyPassword ();
89+ // basic parsing
90+ ServerResponse errorResponse = parseResponse (content , ServerResponse .class , false );
91+
92+ if ("ok" .equals (errorResponse .status )) {
93+ // complete parsing
94+ T response = parseResponse (content , request .getReturnType (), true );
95+ response .setXmlContent (content );
96+ return response ;
97+ } else if ("fail" .equals (errorResponse .status )) {
98+ logger .debug (content );
99+ throw new ServerException (errorResponse .error .toString ());
100+ } else {
101+ throw new NotImplementedException ();
102+ }
103+ }
80104
81- if ( proxyUsername != null && proxyUsername . length () > 0 && proxyPassword != null && proxyPassword . length () > 0 ) {
82- CredentialsProvider credentialsProvider = new BasicCredentialsProvider () ;
83- credentialsProvider . setCredentials ( new AuthScope ( proxyUrl , proxyPort ), new UsernamePasswordCredentials ( proxyUsername , proxyPassword ));
84- httpClientBuilder . setDefaultCredentialsProvider ( credentialsProvider );
85- }
105+ protected < T extends BasicResponse > String getXmlResponse ( AbstractRequest < T > request ) throws ClientException , ServerException {
106+ CloseableHttpResponse httpResponse = null ;
107+
108+ try {
109+ httpResponse = getHttpResponse ( request );
86110
87- HttpHost proxy = new HttpHost (proxyUrl , proxyPort );
88- requestConfig = RequestConfig .custom ().setProxy (proxy ).build ();
111+ if (httpResponse .getStatusLine ().getStatusCode () != HttpStatus .SC_OK )
112+ throw new ServerException (httpResponse .getStatusLine ().getReasonPhrase () + " (code " + httpResponse .getStatusLine ().getStatusCode () + ")" );
113+
114+ return IOUtils .toString (httpResponse .getEntity ().getContent (), "UTF-8" );
115+ } catch (Exception e ) {
116+ throw new ClientException ("Unable to read response content" , e );
117+ } finally {
118+ try {
119+ if (httpResponse != null )
120+ httpResponse .close ();
121+ } catch (IOException e ) {
122+ logger .error ("cannot close post" , e );
89123 }
90- httpClient = httpClientBuilder .build ();
91124 }
125+ }
92126
93- CloseableHttpResponse httpResponse = null ;
127+ @ SuppressWarnings ("unchecked" )
128+ protected <T extends BasicResponse > CloseableHttpResponse getHttpResponse (AbstractRequest <T > request ) throws ClientException {
94129 try {
95130 HttpPost method = new HttpPost (clientConfiguration .getUrl () + "/ws.php" );
96131 method .setConfig (requestConfig );
@@ -115,46 +150,39 @@ else if (value instanceof List) {
115150 }
116151 method .setEntity (multipartEntityBuilder .build ());
117152
118- httpResponse = httpClient .execute (method );
153+ return getHttpClient () .execute (method );
119154 } catch (Exception e ) {
120155 throw new ClientException ("Unable to send request" , e );
121156 }
157+ }
122158
123- if (httpResponse .getStatusLine ().getStatusCode () != HttpStatus .SC_OK )
124- throw new ServerException (httpResponse .getStatusLine ().getReasonPhrase () + " (code " + httpResponse .getStatusLine ().getStatusCode () + ")" );
125-
126- String content ;
127- try {
128- content = IOUtils .toString (httpResponse .getEntity ().getContent (), "UTF-8" );
129- } catch (Exception e ) {
130- throw new ClientException ("Unable to read response content" , e );
131- }
132-
133- try {
134- if (httpResponse != null )
135- httpResponse .close ();
136- } catch (IOException e ) {
137- logger .error ("cannot close post" , e );
138- }
139-
140- // basic parsing
141- ServerResponse errorResponse = parseResponse (httpResponse , content , ServerResponse .class , false );
159+ protected CloseableHttpClient getHttpClient () {
160+ if (httpClient == null ) {
161+ HttpClientBuilder httpClientBuilder = HttpClientBuilder .create ();
142162
143- if ("fail" .equals (errorResponse .status )) {
144- logger .debug (content );
145- throw new ServerException (errorResponse .error .toString ());
146- } else if (!"ok" .equals (errorResponse .status ))
147- throw new NotImplementedException ();
163+ if (clientConfiguration .getUsesProxy ()) {
164+ String proxyUrl = clientConfiguration .getProxyUrl ();
165+ int proxyPort = clientConfiguration .getProxyPort ();
166+
167+ String proxyUsername = clientConfiguration .getProxyUsername ();
168+ String proxyPassword = clientConfiguration .getProxyPassword ();
148169
149- // complete parsing
150- T response = parseResponse (httpResponse , content , request .getReturnType (), true );
151- response .setHttpStatusCode (httpResponse .getStatusLine ().getStatusCode ());
152- response .setXmlContent (content );
170+ if (proxyUsername != null && proxyUsername .length () > 0 && proxyPassword != null && proxyPassword .length () > 0 ) {
171+ CredentialsProvider credentialsProvider = new BasicCredentialsProvider ();
172+ credentialsProvider .setCredentials (new AuthScope (proxyUrl , proxyPort ), new UsernamePasswordCredentials (proxyUsername , proxyPassword ));
173+ httpClientBuilder .setDefaultCredentialsProvider (credentialsProvider );
174+ }
153175
154- return response ;
176+ HttpHost proxy = new HttpHost (proxyUrl , proxyPort );
177+ requestConfig = RequestConfig .custom ().setProxy (proxy ).build ();
178+ }
179+ httpClient = httpClientBuilder .build ();
180+ }
181+
182+ return httpClient ;
155183 }
156184
157- private <T extends BasicResponse > T parseResponse (HttpResponse httpResponse , String content , Class <T > type , boolean strict ) throws ClientException {
185+ protected <T extends BasicResponse > T parseResponse (String content , Class <T > type , boolean strict ) throws ClientException {
158186 try {
159187 return (T ) PersisterFactory .createPersister ().read (type , content , strict );
160188 } catch (Exception e ) {
0 commit comments