11ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath/*
21ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath * Copyright (C) 2010 The Android Open Source Project
31ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath *
41ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath * Licensed under the Apache License, Version 2.0 (the "License");
51ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath * you may not use this file except in compliance with the License.
61ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath * You may obtain a copy of the License at
71ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath *
81ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath *      http://www.apache.org/licenses/LICENSE-2.0
91ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath *
101ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath * Unless required by applicable law or agreed to in writing, software
111ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath * distributed under the License is distributed on an "AS IS" BASIS,
121ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath * See the License for the specific language governing permissions and
141ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath * limitations under the License.
151ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath */
161ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
171ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamathpackage com.android.quicksearchbox.util;
181ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
191ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamathimport java.io.IOException;
201ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamathimport java.util.HashMap;
211ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamathimport java.util.Map;
221ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
231ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath/**
241ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath * An interface that can issue HTTP GET / POST requests
251ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath * with timeouts.
261ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath */
271ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamathpublic interface HttpHelper {
281ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
291ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath    public String get(GetRequest request) throws IOException, HttpException;
301ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
311ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath    public String get(String url, Map<String,String> requestHeaders)
321ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath            throws IOException, HttpException;
331ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
341ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath    public String post(PostRequest request) throws IOException, HttpException;
351ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
361ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath    public String post(String url, Map<String,String> requestHeaders, String content)
371ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath            throws IOException, HttpException;
381ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
391ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath    public void setConnectTimeout(int timeoutMillis);
401ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
411ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath    public void setReadTimeout(int timeoutMillis);
421ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
431ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath    public static class GetRequest {
441ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        private String mUrl;
451ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        private Map<String,String> mHeaders;
461ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
471ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        /**
481ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         * Creates a new request.
491ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         */
50b9c2b333a595dca5ee949cebfa4a355975d7f9a9Narayan Kamath        public GetRequest() {
511ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        }
521ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
531ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        /**
541ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         * Creates a new request.
551ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         *
561ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         * @param url Request URI.
571ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         */
58b9c2b333a595dca5ee949cebfa4a355975d7f9a9Narayan Kamath        public GetRequest(String url) {
591ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath            mUrl = url;
601ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        }
611ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
621ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        /**
631ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         * Gets the request URI.
641ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         */
651ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        public String getUrl() {
661ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath            return mUrl;
671ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        }
681ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        /**
691ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         * Sets the request URI.
701ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         */
711ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        public void setUrl(String url) {
721ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath            mUrl = url;
731ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        }
741ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
751ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        /**
761ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         * Gets the request headers.
771ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         *
781ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         * @return The response headers. May return {@code null} if no headers are set.
791ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         */
801ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        public Map<String, String> getHeaders() {
811ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath            return mHeaders;
821ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        }
831ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
841ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        /**
851ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         * Sets a request header.
861ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         *
871ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         * @param name Header name.
881ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         * @param value Header value.
891ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         */
901ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        public void setHeader(String name, String value) {
911ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath            if (mHeaders == null) {
921ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath                mHeaders = new HashMap<String,String>();
931ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath            }
941ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath            mHeaders.put(name, value);
951ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        }
961ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath    }
971ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
981ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath    public static class PostRequest extends GetRequest {
991ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
1001ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        private String mContent;
1011ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
1021ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        public PostRequest() {
1031ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        }
1041ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
1051ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        public PostRequest(String url) {
1061ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath            super(url);
1071ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        }
1081ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
1091ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        public void setContent(String content) {
1101ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath            mContent = content;
1111ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        }
1121ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
1131ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        public String getContent() {
1141ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath            return mContent;
1151ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        }
1161ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath    }
1171ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
1181ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath    /**
1191ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath     * A HTTP exception.
1201ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath     */
1211ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath    public static class HttpException extends IOException {
1221ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        private final int mStatusCode;
1231ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        private final String mReasonPhrase;
1241ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
1251ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        public HttpException(int statusCode, String reasonPhrase) {
1261ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath            super(statusCode + " " + reasonPhrase);
1271ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath            mStatusCode = statusCode;
1281ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath            mReasonPhrase = reasonPhrase;
1291ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        }
1301ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
1311ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        /**
1321ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         * Gets the HTTP response status code.
1331ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         */
1341ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        public int getStatusCode() {
1351ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath            return mStatusCode;
1361ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        }
1371ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
1381ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        /**
1391ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         * Gets the HTTP response reason phrase.
1401ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath         */
1411ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        public String getReasonPhrase() {
1421ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath            return mReasonPhrase;
1431ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath        }
1441ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath    }
1451ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath
1461ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath    /**
1471ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath     * An interface for URL rewriting.
1481ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath     */
1491ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath    public static interface UrlRewriter {
1501ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath      public String rewrite(String url);
1511ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath    }
1521ea50e57e0bb5bf1184e3c1e4fbda27c3d8e44a6Narayan Kamath}
153