1069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/*
2069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/module-client/src/main/java/org/apache/http/impl/client/RequestWrapper.java $
3069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * $Revision: 674186 $
4069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * $Date: 2008-07-05 05:18:54 -0700 (Sat, 05 Jul 2008) $
5069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
6069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * ====================================================================
7069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one
8069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * or more contributor license agreements.  See the NOTICE file
9069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * distributed with this work for additional information
10069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * regarding copyright ownership.  The ASF licenses this file
11069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * to you under the Apache License, Version 2.0 (the
12069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * "License"); you may not use this file except in compliance
13069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * with the License.  You may obtain a copy of the License at
14069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
15069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *   http://www.apache.org/licenses/LICENSE-2.0
16069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
17069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Unless required by applicable law or agreed to in writing,
18069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * software distributed under the License is distributed on an
19069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
20069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * KIND, either express or implied.  See the License for the
21069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * specific language governing permissions and limitations
22069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * under the License.
23069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * ====================================================================
24069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
25069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * This software consists of voluntary contributions made by many
26069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * individuals on behalf of the Apache Software Foundation.  For more
27069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * information on the Apache Software Foundation, please see
28069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <http://www.apache.org/>.
29069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
30069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */
31069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
32069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectpackage org.apache.http.impl.client;
33069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
34069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.net.URI;
35069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.net.URISyntaxException;
36069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
37069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.HttpRequest;
38069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.ProtocolException;
39069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.ProtocolVersion;
40069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.RequestLine;
41069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.client.methods.HttpUriRequest;
42069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.message.AbstractHttpMessage;
43069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.message.BasicRequestLine;
44069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.params.HttpProtocolParams;
45069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
46069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/**
47069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * A wrapper class for {@link HttpRequest}s that can be used to change
48069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * properties of the current request without modifying the original
49069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * object.
50069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * </p>
51069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * This class is also capable of resetting the request headers to
52069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * the state of the original request.
53069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
54069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
55069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
56069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @version $Revision: 674186 $
57069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
58069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @since 4.0
59069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */
60069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectpublic class RequestWrapper extends AbstractHttpMessage implements HttpUriRequest {
61069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
62069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private final HttpRequest original;
63069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
64069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private URI uri;
65069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private String method;
66069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private ProtocolVersion version;
67069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private int execCount;
68069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
69069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public RequestWrapper(final HttpRequest request) throws ProtocolException {
70069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        super();
71069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (request == null) {
72069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            throw new IllegalArgumentException("HTTP request may not be null");
73069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
74069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        this.original = request;
75069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        setParams(request.getParams());
76069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // Make a copy of the original URI
77069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (request instanceof HttpUriRequest) {
78069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            this.uri = ((HttpUriRequest) request).getURI();
79069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            this.method = ((HttpUriRequest) request).getMethod();
80069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            this.version = null;
81069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else {
82069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            RequestLine requestLine = request.getRequestLine();
83069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            try {
84069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                this.uri = new URI(requestLine.getUri());
85069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            } catch (URISyntaxException ex) {
86069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                throw new ProtocolException("Invalid request URI: "
87069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                        + requestLine.getUri(), ex);
88069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            }
89069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            this.method = requestLine.getMethod();
90069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            this.version = request.getProtocolVersion();
91069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
92069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        this.execCount = 0;
93069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
94069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
95069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public void resetHeaders() {
96069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // Make a copy of original headers
97069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        this.headergroup.clear();
98069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        setHeaders(this.original.getAllHeaders());
99069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
100069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
101069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public String getMethod() {
102069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return this.method;
103069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
104069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
105069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public void setMethod(final String method) {
106069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (method == null) {
107069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            throw new IllegalArgumentException("Method name may not be null");
108069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
109069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        this.method = method;
110069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
111069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
112069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public ProtocolVersion getProtocolVersion() {
113069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (this.version != null) {
114069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return this.version;
115069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else {
116069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return HttpProtocolParams.getVersion(getParams());
117069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
118069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
119069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
120069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public void setProtocolVersion(final ProtocolVersion version) {
121069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        this.version = version;
122069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
123069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
124069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
125069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public URI getURI() {
126069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return this.uri;
127069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
128069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
129069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public void setURI(final URI uri) {
130069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        this.uri = uri;
131069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
132069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
133069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public RequestLine getRequestLine() {
134069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        String method = getMethod();
135069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        ProtocolVersion ver = getProtocolVersion();
136069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        String uritext = null;
137069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (uri != null) {
138069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            uritext = uri.toASCIIString();
139069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
140069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (uritext == null || uritext.length() == 0) {
141069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            uritext = "/";
142069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
143069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return new BasicRequestLine(method, uritext, ver);
144069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
145069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
146069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public void abort() throws UnsupportedOperationException {
147069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        throw new UnsupportedOperationException();
148069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
149069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
150069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public boolean isAborted() {
151069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return false;
152069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
153069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
154069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public HttpRequest getOriginal() {
155069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return this.original;
156069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
157069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
158069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public boolean isRepeatable() {
159069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return true;
160069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
161069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
162069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public int getExecCount() {
163069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return this.execCount;
164069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
165069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
166069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public void incrementExecCount() {
167069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        this.execCount++;
168069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
169069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
170069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
171