View Javadoc
1   /*
2    *  Licensed to the Apache Software Foundation (ASF) under one
3    *  or more contributor license agreements.  See the NOTICE file
4    *  distributed with this work for additional information
5    *  regarding copyright ownership.  The ASF licenses this file
6    *  to you under the Apache License, Version 2.0 (the
7    *  "License"); you may not use this file except in compliance
8    *  with the License.  You may obtain a copy of the License at
9    *  
10   *    http://www.apache.org/licenses/LICENSE-2.0
11   *  
12   *  Unless required by applicable law or agreed to in writing,
13   *  software distributed under the License is distributed on an
14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   *  KIND, either express or implied.  See the License for the
16   *  specific language governing permissions and limitations
17   *  under the License. 
18   *  
19   */
20  package org.apache.mina.http;
21  
22  import java.util.ArrayList;
23  import java.util.HashMap;
24  import java.util.List;
25  import java.util.Map;
26  import java.util.regex.Matcher;
27  import java.util.regex.Pattern;
28  
29  import org.apache.mina.http.api.HttpMethod;
30  import org.apache.mina.http.api.HttpRequest;
31  import org.apache.mina.http.api.HttpVersion;
32  
33  /**
34   * A HTTP Request implementation
35   * 
36   * @author <a href="http://mina.apache.org">Apache MINA Project</a>
37   */
38  public class HttpRequestImpl implements HttpRequest {
39      /** The HTTP version */
40      private final HttpVersion version;
41  
42      /** The HTTP method */
43      private final HttpMethod method;
44  
45      /** The requested path */
46      private final String requestedPath;
47      
48      /** The query string */
49      private final String queryString;
50  
51      /** The set of headers */
52      private final Map<String, String> headers;
53  
54      /**
55       * Creates a new HttpRequestImpl instance
56       * 
57       * @param version The HTTP version
58       * @param method The HTTP method
59       * @param requestedPath The request path
60       * @param queryString The query string
61       * @param headers The headers
62       */
63      public HttpRequestImpl(HttpVersion version, HttpMethod method, String requestedPath, String queryString, Map<String, String> headers) {
64          this.version = version;
65          this.method = method;
66          this.requestedPath = requestedPath;
67          this.queryString = queryString;
68          this.headers = headers;
69      }
70  
71      /**
72       * {@inheritDoc}
73       */
74      @Override
75      public HttpVersion getProtocolVersion() {
76          return version;
77      }
78  
79      /**
80       * {@inheritDoc}
81       */
82      @Override
83      public String getContentType() {
84          return headers.get("content-type");
85      }
86  
87      /**
88       * {@inheritDoc}
89       */
90      @Override
91      public boolean isKeepAlive() {
92          return false;
93      }
94  
95      /**
96       * {@inheritDoc}
97       */
98      @Override
99      public String getHeader(String name) {
100         return headers.get(name);
101     }
102 
103     /**
104      * {@inheritDoc}
105      */
106     @Override
107     public boolean containsHeader(String name) {
108         return headers.containsKey(name);
109     }
110 
111     /**
112      * {@inheritDoc}
113      */
114     @Override
115     public Map<String, String> getHeaders() {
116         return headers;
117     }
118 
119     /**
120      * {@inheritDoc}
121      */
122     @Override
123     public boolean containsParameter(String name) {
124         Matcher m = parameterPattern(name);
125         return m.find();
126     }
127 
128     /**
129      * {@inheritDoc}
130      */
131     @Override
132     public String getParameter(String name) {
133         Matcher m = parameterPattern(name);
134         if (m.find()) {
135             return m.group(1);
136         } else {
137             return null;
138         }
139     }
140     
141     protected Matcher parameterPattern(String name) {
142         return Pattern.compile("[&]"+name+"=([^&]*)").matcher("&"+queryString);
143     }
144 
145     /**
146      * {@inheritDoc}
147      */
148     @Override
149     public Map<String, List<String>> getParameters() {
150         Map<String, List<String>> parameters = new HashMap<>();
151         String[] params = queryString.split("&");
152         
153         if (params.length == 1) {
154             return parameters;
155         }
156         
157         for (String parameter:params) {
158             String[] param = parameter.split("=");
159             String name = param[0];
160             String value = param.length == 2 ? param[1] : "";
161             
162             if (!parameters.containsKey(name)) {
163                 parameters.put(name, new ArrayList<String>());
164             }
165             
166             parameters.get(name).add(value);
167         }
168         
169         return parameters;
170     }
171     
172     /**
173      * {@inheritDoc}
174      */
175     @Override
176     public String getQueryString() {
177         return queryString;
178     }
179 
180     /**
181      * {@inheritDoc}
182      */
183     @Override
184     public HttpMethod getMethod() {
185         return method;
186     }
187     
188     /**
189      * {@inheritDoc}
190      */
191     @Override
192     public String getRequestPath() {
193         return requestedPath;
194     }
195 
196     /**
197      * {@inheritDoc}
198      */
199     @Override
200     public String toString() {
201         StringBuilder sb = new StringBuilder();
202         sb.append("HTTP REQUEST METHOD: ").append(method).append('\n');
203         sb.append("VERSION: ").append(version).append('\n');
204         sb.append("PATH: ").append(requestedPath).append('\n');
205         sb.append("QUERY:").append(queryString).append('\n');
206 
207         sb.append("--- HEADER --- \n");
208         
209         for (Map.Entry<String, String> entry : headers.entrySet()) {
210             sb.append(entry.getKey()).append(':').append(entry.getValue()).append('\n');
211         }
212 
213         sb.append("--- PARAMETERS --- \n");
214         Map<String, List<String>> parameters = getParameters();
215 
216         for (Map.Entry<String, List<String>> entry : parameters.entrySet()) {
217             String key = entry.getKey();
218             
219             for (String value : entry.getValue()) { 
220                 sb.append(key).append(':').append(value).append('\n'); 
221             }
222         }
223         
224         return sb.toString();
225     }
226 }