1 /*
2 * (C)opyright 2010, Nikolaos Georgosopoulos
3 *
4 * This file is part of URLChecker.
5
6 URLChecker is free software: you can redistribute it and/or modify
7 it under the terms of the Lesser General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 URLChecker is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the Lesser General Public License
17 along with URLChecker. If not, see <http://www.gnu.org/licenses/>.
18
19 */
20 package net.sf.urlchecker.v2.communication;
21
22 import java.io.IOException;
23
24 import javax.net.ssl.SSLHandshakeException;
25
26 import net.sf.urlchecker.communication.CommunicationFactory;
27
28 import org.apache.http.HttpEntityEnclosingRequest;
29 import org.apache.http.HttpRequest;
30 import org.apache.http.NoHttpResponseException;
31 import org.apache.http.client.HttpRequestRetryHandler;
32 import org.apache.http.protocol.ExecutionContext;
33 import org.apache.http.protocol.HttpContext;
34
35 /**
36 * The Class RequestRetryHandler for the new version of the HttpClient. This
37 * Handler is much like the default. It is here for future enhancements.
38 *
39 * <p>
40 * <b> $Id: RequestRetryHandler.java 183 2010-12-17 19:10:21Z georgosn $</b>
41 * </p>
42 *
43 * @author $LastChangedBy: georgosn $
44 * @version $LastChangedRevision: 183 $
45 */
46 public class RequestRetryHandler implements HttpRequestRetryHandler {
47
48 /*
49 * (non-Javadoc)
50 *
51 * @see org.apache.http.client.HttpRequestRetryHandler#retryRequest(java.io.
52 * IOException, int, org.apache.http.protocol.HttpContext)
53 */
54 /** {@inheritDoc} */
55 public boolean retryRequest(IOException exception, int executionCount,
56 HttpContext context) {
57 if (executionCount >= CommunicationFactory.getInstance()
58 .getMaxretries()) {
59 // Do not retry if over max retry count
60 return false;
61 }
62
63 if (executionCount >= 5) {
64 // Do not retry if over max retry count
65 return false;
66 }
67 if (exception instanceof NoHttpResponseException) {
68 // Retry if the server dropped connection on us
69 return true;
70 }
71 if (exception instanceof SSLHandshakeException) {
72 // Do not retry on SSL handshake exception
73 return false;
74 }
75 final HttpRequest request = (HttpRequest) context
76 .getAttribute(ExecutionContext.HTTP_REQUEST);
77 final boolean idempotent = !(request instanceof HttpEntityEnclosingRequest);
78 if (idempotent) {
79 // Retry if the request is considered idempotent
80 return true;
81 }
82
83 return false;
84 }
85
86 }