public X excute <X, Y>(Request <Y> request, HttpResponseHandler <X> responseHandler, KS3Signer <Y> ks3Signer) where Y : KS3Request { this.setUserAgent(request); HttpWebRequest httpRequest = null; HttpWebResponse httpResponse = null; X result = default(X); for (int i = 0; i < Constants.RETRY_TIMES; i++) { try { // Sign the request if a signer was provided if (ks3Signer != null && request.getOriginalRequest().getRequestCredentials() != null) { ks3Signer.sign(request, request.getOriginalRequest().getRequestCredentials()); } request.setResourcePath(request.getResourcePath().Replace("%5C", "/").Replace("//", "/%2F")); if (request.getResourcePath().EndsWith("%2F")) { request.setResourcePath(request.getResourcePath().Substring(0, request.getResourcePath().Length - 3)); } httpRequest = HttpRequestFactory.createHttpRequest(request, this.config); httpResponse = (HttpWebResponse)httpRequest.GetResponse(); result = responseHandler.handle(httpResponse); break; } catch (WebException we) { HttpWebResponse errorResponse = (HttpWebResponse)we.Response; ServiceException serviceException = null; try { serviceException = errorResponseHandler.handle(errorResponse); } catch { throw we; } throw serviceException; } catch (IOException ex) { if (i == Constants.RETRY_TIMES - 1) { throw ex; } Thread.Sleep(1000); } finally { if (httpResponse != null) { httpResponse.Close(); } } } return(result); }