ffde93931324e369f2304d205d4e9db08f10f786
[teamcity/dotNetPackagesSupport.git] / nuget-server / src / jetbrains / buildServer / nuget / server / feed / reader / UrlResolver.java
1 /*\r
2  * Copyright 2000-2011 JetBrains s.r.o.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  * http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 package jetbrains.buildServer.nuget.server.feed.reader;\r
18 \r
19 import com.intellij.openapi.util.Pair;\r
20 import org.apache.http.Header;\r
21 import org.apache.http.HttpResponse;\r
22 import org.apache.http.HttpStatus;\r
23 import org.apache.http.client.methods.HttpGet;\r
24 import org.apache.http.client.params.ClientPNames;\r
25 import org.jetbrains.annotations.NotNull;\r
26 \r
27 import java.io.IOException;\r
28 \r
29 /**\r
30  * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
31  * Date: 12.08.11 10:24\r
32  */\r
33 public class UrlResolver {\r
34   private final FeedClient myClient;\r
35 \r
36   public UrlResolver(FeedClient client) {\r
37     myClient = client;\r
38   }\r
39 \r
40   /**\r
41    * Generates GET request to a given URL.\r
42    * If HTTP Status 3xx is returned, Location header is\r
43    * used to generate next request unless non 3xx status\r
44    * is returned\r
45    * @param feedUrl url to ping and resolve\r
46    * @return resolved URL and HttpResponse\r
47    * @throws IOException if failed to communicate or non 3xx or 200 status returned\r
48    */\r
49   @NotNull\r
50   public Pair<String, HttpResponse> resolvePath(@NotNull String feedUrl) throws IOException {\r
51     for(int _ = 100; _-->0;) {\r
52       HttpGet ping = new HttpGet(feedUrl);\r
53       ping.getParams().setBooleanParameter(ClientPNames.HANDLE_REDIRECTS, false);\r
54       final HttpResponse execute = myClient.getClient().execute(ping);\r
55       final int statusCode = execute.getStatusLine().getStatusCode();\r
56       if (statusCode / 100 == 3) {\r
57         final Header location = execute.getFirstHeader("Location");\r
58         if (location != null) {\r
59           feedUrl = location.getValue();\r
60           continue;\r
61         }\r
62       }\r
63       if (statusCode != HttpStatus.SC_OK) {\r
64         throw new IOException("Failed to connect to " + feedUrl);\r
65       }\r
66       return Pair.create(feedUrl, execute);\r
67     }\r
68     throw new IOException("Failed to resolve redirects");\r
69   }\r
70 \r
71 }\r