KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > servletunit > HttpServletRequestSimulator


1 package servletunit;
2
3 import javax.servlet.RequestDispatcher JavaDoc;
4 import javax.servlet.ServletContext JavaDoc;
5 import javax.servlet.ServletInputStream JavaDoc;
6 import javax.servlet.ServletRequest JavaDoc;
7 import javax.servlet.http.Cookie JavaDoc;
8 import javax.servlet.http.HttpServletRequest JavaDoc;
9 import javax.servlet.http.HttpSession JavaDoc;
10 import java.io.BufferedReader JavaDoc;
11 import java.io.IOException JavaDoc;
12 import java.io.File JavaDoc;
13 import java.security.Principal JavaDoc;
14 import java.util.*;
15 import java.text.SimpleDateFormat JavaDoc;
16 import java.text.DateFormat JavaDoc;
17 import java.text.ParseException JavaDoc;
18
19
20 // StrutsTestCase - a JUnit extension for testing Struts actions
21
// within the context of the ActionServlet.
22
// Copyright (C) 2002 Deryl Seale
23
//
24
// This library is free software; you can redistribute it and/or
25
// modify it under the terms of the Apache Software License as
26
// published by the Apache Software Foundation; either version 1.1
27
// of the License, or (at your option) any later version.
28
//
29
// This library is distributed in the hope that it will be useful,
30
// but WITHOUT ANY WARRANTY; without even the implied warranty of
31
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
32
// Apache Software Foundation Licens for more details.
33
//
34
// You may view the full text here: http://www.apache.org/LICENSE.txt
35

36 public class HttpServletRequestSimulator implements HttpServletRequest JavaDoc
37 {
38     private Hashtable attributes;
39     private String JavaDoc scheme;
40     private String JavaDoc protocol = "HTTP/1.1";
41     private String JavaDoc requestURI;
42     private String JavaDoc requestURL;
43     private String JavaDoc contextPath = "";
44     private String JavaDoc servletPath;
45     private String JavaDoc pathInfo;
46     private String JavaDoc queryString;
47     private String JavaDoc method;
48     private String JavaDoc contentType;
49     private Locale locale;
50     private Principal JavaDoc principal;
51     String JavaDoc remoteAddr;
52     String JavaDoc localAddr;
53     String JavaDoc remoteHost;
54     String JavaDoc localName;
55     int remotePort;
56     int localPort;
57     private String JavaDoc remoteUser;
58     private String JavaDoc userRole;
59     private String JavaDoc reqSessionId;
60     String JavaDoc authType;
61     String JavaDoc charEncoding;
62     private String JavaDoc serverName;
63     private int port;
64
65     private Hashtable parameters;
66     private Hashtable headers;
67     private Vector cookies;
68
69     private HttpSession JavaDoc session;
70     private ServletContext JavaDoc context;
71
72     /**
73      * Constant used by {@link #setMethod} to indicate that the GET method
74      * made this request.
75      */

76
77     public final static int GET = 0;
78
79     /**
80      * Constant used by {@link #setMethod} to indicate that the POST method
81      * made this request.
82      */

83     public final static int POST = 1;
84
85     /**
86      * Constant used by {@link #setMethod} to indicate that the PUT method
87      * made this request.
88      */

89     public final static int PUT = 2;
90
91     public HttpServletRequestSimulator(ServletContext JavaDoc context)
92     {
93         scheme = "http";
94         attributes = new Hashtable();
95         parameters = new Hashtable();
96         headers = new Hashtable();
97         cookies = new Vector();
98         this.context = context;
99         //if (getHeader("Accept")==null)
100
//setHeader("Accept","dummy accept");
101
}
102
103     /**
104      * Adds a parameter to this object's list of parameters
105      *
106      * @param key The name of the parameter
107      * @param value The value of the parameter
108      */

109     public void addParameter( String JavaDoc key, String JavaDoc value )
110     {
111         if ((key != null) && (value != null))
112             this.parameters.put( key, value );
113     }
114
115     /**
116      * Adds a parameter as a String array to this object's list of parameters
117      */

118     public void addParameter(String JavaDoc name, String JavaDoc[] values) {
119         if ((name != null) && (values != null))
120             parameters.put(name,values);
121     }
122
123     /**
124      * Returns a java.util.Map of the parameters of this request.
125      * Request parameters
126      * are extra information sent with the request. For HTTP servlets,
127      * parameters are contained in the query string or posted form data.
128      *
129      * @return an immutable java.util.Map containing parameter names as
130      * keys and parameter values as map values. The keys in the parameter
131      * map are of type String. The values in the parameter map are of type
132      * String array.
133      *
134      */

135     public Map getParameterMap() {
136         return this.parameters;
137     }
138
139     /**
140      *
141      * Returns the value of the named attribute as an <code>Object</code>,
142      * or <code>null</code> if no attribute of the given name exists.
143      *
144      * <p> Attributes can be set two ways. The servlet container may set
145      * attributes to make available custom information about a request.
146      * For example, for requests made using HTTPS, the attribute
147      * <code>javax.servlet.request.X509Certificate</code> can be used to
148      * retrieve information on the certificate of the client. Attributes
149      * can also be set programatically using
150      * {@link ServletRequest#setAttribute}. This allows information to be
151      * embedded into a request before a {@link RequestDispatcher} call.
152      *
153      * <p>Attribute names should follow the same conventions as package
154      * names. This specification reserves names matching <code>java.*</code>,
155      * <code>javax.*</code>, and <code>sun.*</code>.
156      *
157      * @param s a <code>String</code> specifying the name of
158      * the attribute
159      *
160      * @return an <code>Object</code> containing the value
161      * of the attribute, or <code>null</code> if
162      * the attribute does not exist
163      *
164      */

165     public Object JavaDoc getAttribute(String JavaDoc s)
166     {
167         return attributes.get(s);
168     }
169
170     /**
171      * Returns an <code>Enumeration</code> containing the
172      * names of the attributes available to this request.
173      * This method returns an empty <code>Enumeration</code>
174      * if the request has no attributes available to it.
175      *
176      *
177      * @return an <code>Enumeration</code> of strings
178      * containing the names
179      * of the request's attributes
180      *
181      */

182     public Enumeration getAttributeNames()
183     {
184         return attributes.keys();
185     }
186
187     /**
188      * Returns the name of the authentication scheme used to protect
189      * the servlet. All servlet containers support basic, form and client
190      * certificate authentication, and may additionally support digest
191      * authentication.
192      * If the servlet is not authenticated <code>null</code> is returned.
193      *
194      * <p>Same as the value of the CGI variable AUTH_TYPE.
195      *
196      *
197      * @return one of the static members BASIC_AUTH,
198      * FORM_AUTH, CLIENT_CERT_AUTH, DIGEST_AUTH
199      * (suitable for == comparison)
200      * indicating the authentication scheme, or
201      * <code>null</code> if the request was
202      * not authenticated.
203      *
204      */

205     public String JavaDoc getAuthType()
206     {
207         return authType;
208     }
209
210     /**
211      * Returns the name of the character encoding used in the body of this
212      * request. This method returns <code>null</code> if the request
213      * does not specify a character encoding
214      *
215      *
216      * @return a <code>String</code> containing the name of
217      * the chararacter encoding, or <code>null</code>
218      * if the request does not specify a character encoding
219      */

220     public String JavaDoc getCharacterEncoding()
221     {
222         return charEncoding;
223     }
224
225     /**
226      * Returns the length, in bytes, of the request body
227      * and made available by the input stream, or -1 if the
228      * length is not known. For HTTP servlets, same as the value
229      * of the CGI variable CONTENT_LENGTH.
230      *
231      * @return -1, since this is a mock container
232      */

233     public int getContentLength()
234     {
235         return -1;
236     }
237
238     /**
239      * Returns the MIME type of the body of the request, or
240      * <code>null</code> if the type is not known. For HTTP servlets,
241      * same as the value of the CGI variable CONTENT_TYPE.
242      *
243      * @return a <code>String</code> containing the name
244      * of the MIME type of
245      * the request, or null if the type is not known
246      *
247      */

248     public String JavaDoc getContentType()
249     {
250         return contentType;
251     }
252
253     /**
254      *
255      * Returns the portion of the request URI that indicates the context
256      * of the request. The context path always comes first in a request
257      * URI. The path starts with a "/" character but does not end with a "/"
258      * character. For servlets in the default (root) context, this method
259      * returns "". The container does not decode this string.
260      *
261      *
262      * @return a <code>String</code> specifying the
263      * portion of the request URI that indicates the context
264      * of the request
265      *
266      *
267      */

268     public String JavaDoc getContextPath()
269     {
270         return contextPath;
271     }
272
273     /**
274      * Adds a cookie that can be retrieved from this request via the
275      * getCookies() method.
276      *
277      * @param cookie a Cookie object to be retrieved from this
278      * request.
279      *
280      * @see #getCookies
281      */

282     public void addCookie(Cookie JavaDoc cookie) {
283         cookies.addElement(cookie);
284     }
285
286     /**
287      * Adds a set of cookies that can be retrieved from this request via the
288      * getCookies() method.
289      *
290      * @param cookies an array of Cookie object to be retrieved from this
291      * request.
292      *
293      * @see #getCookies
294      */

295     public void setCookies(Cookie JavaDoc[] cookies) {
296         for (int i = 0; i < cookies.length; i++)
297             this.cookies.addElement(cookies[i]);
298     }
299
300     /**
301      *
302      * Returns an array containing all of the <code>Cookie</code>
303      * objects the client sent with this request.
304      * This method returns <code>null</code> if no cookies were sent.
305      *
306      * @return an array of all the <code>Cookies</code>
307      * included with this request, or <code>null</code>
308      * if the request has no cookies
309      *
310      *
311      */

312     public Cookie JavaDoc [] getCookies()
313     {
314         if (cookies.isEmpty())
315             return null;
316         else {
317             Cookie JavaDoc[] cookieArray = new Cookie JavaDoc[cookies.size()];
318             return (Cookie JavaDoc []) cookies.toArray(cookieArray);
319         }
320     }
321
322     /**
323      * Returns the value of the specified request header as a long value that represents a Date object. Use this
324      * method with headers that contain dates, such as If-Modified-Since.
325      * <br><br>
326      * The date is returned as the number of milliseconds since January 1, 1970 GMT. The header name is case insensitive.
327      * <br><br>
328      * If the request did not have a header of the specified name, this method returns -1. If the header can't be converted to a date, the method throws an IllegalArgumentException.
329      * @param name a String specifying the name of the header
330      * @return a <code>long</code> value representing the date specified in the header expressed as the number of milliseconds since January 1, 1970 GMT, or -1 if the named header was not included with the reqest.
331      */

332     public long getDateHeader(String JavaDoc name)
333     {
334         String JavaDoc s1 = getHeader(name);
335         if(s1 == null)
336             return -1L;
337         try
338         {
339             DateFormat JavaDoc dateFormat = new SimpleDateFormat JavaDoc("EEE, d MMM yyyy HH:mm:ss z");
340             return dateFormat.parse(s1).getTime();
341         }
342         catch(ParseException JavaDoc exception) {
343             throw new IllegalArgumentException JavaDoc("Cannot parse date: " + s1);
344         }
345     }
346
347     /**
348      * Sets a header with the appropriate date string given the time in milliseconds.
349      * @param name the name of the header
350      * @param millis the time in milliseconds
351      */

352     public void setDateHeader(String JavaDoc name, long millis)
353     {
354         String JavaDoc dateString = new SimpleDateFormat JavaDoc("EEE, d MMM yyyy HH:mm:ss z").format(new Date(millis));
355         setHeader(name, dateString);
356     }
357
358     /**
359      *
360      * Returns the value of the specified request header
361      * as a <code>String</code>. If the request did not include a header
362      * of the specified name, this method returns <code>null</code>.
363      * The header name is case insensitive. You can use
364      * this method with any request header.
365      *
366      * @param s a <code>String</code> specifying the
367      * header name
368      *
369      * @return a <code>String</code> containing the
370      * value of the requested
371      * header, or <code>null</code>
372      * if the request does not
373      * have a header of that name
374      *
375      */

376     public String JavaDoc getHeader(String JavaDoc s)
377     {
378         return (String JavaDoc) headers.get(s);
379     }
380
381     /**
382      *
383      * Returns an enumeration of all the header names
384      * this request contains. If the request has no
385      * headers, this method returns an empty enumeration.
386      *
387      * <p>Some servlet containers do not allow do not allow
388      * servlets to access headers using this method, in
389      * which case this method returns <code>null</code>
390      *
391      * @return an enumeration of all the
392      * header names sent with this
393      * request; if the request has
394      * no headers, an empty enumeration;
395      * if the servlet container does not
396      * allow servlets to use this method,
397      * <code>null</code>
398      *
399      *
400      */

401     public Enumeration getHeaderNames()
402     {
403         return headers.keys();
404     }
405
406     /**
407      * This operation is not supported.
408      */

409     public Enumeration getHeaders(String JavaDoc s)
410     {
411         throw new UnsupportedOperationException JavaDoc("getHeaders operation is not supported!");
412     }
413
414     /**
415      * This operation is not supported.
416      */

417     public ServletInputStream JavaDoc getInputStream() throws IOException JavaDoc {
418         throw new UnsupportedOperationException JavaDoc("getInputStream operation is not supported!");
419     }
420
421     /**
422      *
423      * Returns the value of the specified request header
424      * as an <code>int</code>. If the request does not have a header
425      * of the specified name, this method returns -1. If the
426      * header cannot be converted to an integer, this method
427      * throws a <code>NumberFormatException</code>.
428      *
429      * <p>The header name is case insensitive.
430      *
431      * @param s a <code>String</code> specifying the name
432      * of a request header
433      *
434      * @return an integer expressing the value
435      * of the request header or -1
436      * if the request doesn't have a
437      * header of this name
438      *
439      * @exception NumberFormatException If the header value
440      * can't be converted
441      * to an <code>int</code>
442      */

443     public int getIntHeader(String JavaDoc s)
444     {
445         Object JavaDoc header = headers.get(s);
446         if (header != null) {
447             try {
448                 Integer JavaDoc intHeader = (Integer JavaDoc) header;
449                 return intHeader.intValue();
450             } catch (ClassCastException JavaDoc e) {
451                 throw new NumberFormatException JavaDoc("header '" + s + "' cannot be converted to number format.");
452             }
453         } else
454             return -1;
455     }
456
457     /**
458      *
459      * Returns the preferred <code>Locale</code> that the client will
460      * accept content in, based on the Accept-Language header.
461      * If the client request doesn't provide an Accept-Language header,
462      * this method returns the default locale for the server.
463      *
464      *
465      * @return the preferred <code>Locale</code> for the client,
466      * defaults to Locale.US if {@link #setLocale} has
467      * not been called.
468      *
469      */

470     public Locale getLocale()
471     {
472         if (this.locale == null)
473             return Locale.US;
474         else
475             return this.locale;
476     }
477
478     /**
479      * Returns an Enumeration of Locale objects indicating, in decreasing order starting with the preferred locale, the locales that are acceptable to the client based on the Accept-Language header. If the client request doesn't provide an Accept-Language header, this method returns an Enumeration containing one Locale, the default locale for the server.
480      * @return an <code>Enumeration</code> of preferred Locale objects for the client
481      */

482
483
484
485     public Enumeration getLocales()
486     {
487         return java.util.Collections.enumeration(Collections.singleton(getLocale()));
488     }
489
490     /**
491      *
492      * Returns the name of the HTTP method with which this
493      * request was made, for example, GET, POST, or PUT.
494      * Same as the value of the CGI variable REQUEST_METHOD.
495      *
496      * @return a <code>String</code>
497      * specifying the name
498      * of the method with which
499      * this request was made
500      *
501      */

502     public String JavaDoc getMethod()
503     {
504         if (method == null)
505             return "POST";
506         else
507             return method;
508     }
509
510     /**
511      * Returns the value of a request parameter as a <code>String</code>,
512      * or <code>null</code> if the parameter does not exist. Request parameters
513      * are extra information sent with the request. For HTTP servlets,
514      * parameters are contained in the query string or posted form data.
515      *
516      * <p>You should only use this method when you are sure the
517      * parameter has only one value. If the parameter might have
518      * more than one value, use {@link #getParameterValues}.
519      *
520      * <p>If you use this method with a multivalued
521      * parameter, the value returned is equal to the first value
522      * in the array returned by <code>getParameterValues</code>.
523      *
524      * <p>If the parameter data was sent in the request body, such as occurs
525      * with an HTTP POST request, then reading the body directly via {@link
526      * #getInputStream} or {@link #getReader} can interfere
527      * with the execution of this method.
528      *
529      * @param s a <code>String</code> specifying the
530      * name of the parameter
531      *
532      * @return a <code>String</code> representing the
533      * single value of the parameter
534      *
535      * @see #getParameterValues
536      *
537      */

538     public String JavaDoc getParameter( String JavaDoc s )
539     {
540         if (s == null)
541             return null;
542
543         Object JavaDoc param = parameters.get(s);
544         if( null == param )
545             return null;
546         if( param.getClass().isArray() )
547             return ((String JavaDoc[]) param)[0];
548         return (String JavaDoc)param;
549     }
550
551     /**
552      *
553      * Returns an <code>Enumeration</code> of <code>String</code>
554      * objects containing the names of the parameters contained
555      * in this request. If the request has
556      * no parameters, the method returns an
557      * empty <code>Enumeration</code>.
558      *
559      * @return an <code>Enumeration</code> of <code>String</code>
560      * objects, each <code>String</code> containing
561      * the name of a request parameter; or an
562      * empty <code>Enumeration</code> if the
563      * request has no parameters
564      *
565      */

566     public Enumeration getParameterNames()
567     {
568         return parameters.keys();
569     }
570
571     /**
572      * Returns an array of <code>String</code> objects containing
573      * all of the values the given request parameter has, or
574      * <code>null</code> if the parameter does not exist.
575      *
576      * <p>If the parameter has a single value, the array has a length
577      * of 1.
578      *
579      * @param s a <code>String</code> containing the name of
580      * the parameter whose value is requested
581      *
582      * @return an array of <code>String</code> objects
583      * containing the parameter's values
584      *
585      * @see #getParameter
586      *
587      */

588     public String JavaDoc[] getParameterValues( String JavaDoc s )
589     {
590         if (s == null)
591             return null;
592         Object JavaDoc param = parameters.get( s );
593         if( null == param )
594             return null;
595         else {
596             if (param.getClass().isArray()) {
597                 return (String JavaDoc[]) param;
598             } else {
599                 return new String JavaDoc[] {(String JavaDoc) param};
600             }
601         }
602     }
603
604     /**
605      *
606      * Returns any extra path information associated with
607      * the URL the client sent when it made this request.
608      * The extra path information follows the servlet path
609      * but precedes the query string.
610      * This method returns <code>null</code> if there
611      * was no extra path information.
612      *
613      * <p>Same as the value of the CGI variable PATH_INFO.
614      *
615      *
616      * @return a <code>String</code>, decoded by the
617      * web container, specifying
618      * extra path information that comes
619      * after the servlet path but before
620      * the query string in the request URL;
621      * or <code>null</code> if the URL does not have
622      * any extra path information
623      *
624      */

625     public String JavaDoc getPathInfo()
626     {
627         return pathInfo;
628     }
629
630     /**
631      * This operation is not supported.
632      */

633     public String JavaDoc getPathTranslated()
634     {
635         throw new UnsupportedOperationException JavaDoc("getPathTranslated operation is not supported!");
636     }
637
638     /**
639      * Returns the name and version of the protocol the request uses
640      * in the form <i>protocol/majorVersion.minorVersion</i>, for
641      * example, HTTP/1.1. For HTTP servlets, the value
642      * returned is the same as the value of the CGI variable
643      * <code>SERVER_PROTOCOL</code>.
644      *
645      * @return a <code>String</code> containing the protocol
646      * name and version number
647      *
648      */

649     public String JavaDoc getProtocol()
650     {
651         return protocol;
652     }
653
654     /**
655      *
656      * Returns the query string that is contained in the request
657      * URL after the path. This method returns <code>null</code>
658      * if the URL does not have a query string. Same as the value
659      * of the CGI variable QUERY_STRING.
660      *
661      * @return a <code>String</code> containing the query
662      * string or <code>null</code> if the URL
663      * contains no query string. The value is not
664      * decoded by the container.
665      *
666      */

667     public String JavaDoc getQueryString()
668     {
669         return queryString;
670     }
671
672     /**
673      * This operation is not supported.
674      */

675     public BufferedReader JavaDoc getReader() throws IOException JavaDoc {
676         throw new UnsupportedOperationException JavaDoc("getReader operation is not supported!");
677     }
678
679     /**
680      *
681      * @deprecated As of Version 2.1 of the Java Servlet API,
682      * use {@link ServletContext#getRealPath} instead.
683      *
684      */

685     public String JavaDoc getRealPath(String JavaDoc path)
686     {
687         File JavaDoc contextDirectory = ((ServletContextSimulator) context).getContextDirectory();
688         if ((contextDirectory == null) || (path == null))
689             return null;
690         else
691             return (new File JavaDoc(contextDirectory, path)).getAbsolutePath();
692     }
693
694     /**
695      * Returns the Internet Protocol (IP) address of the client
696      * that sent the request. For HTTP servlets, same as the value of the
697      * CGI variable <code>REMOTE_ADDR</code>.
698      *
699      * @return a <code>String</code> containing the
700      * IP address of the client that sent the request
701      *
702      */

703     public String JavaDoc getRemoteAddr() {
704         return remoteAddr;
705     }
706
707     /**
708      * Returns the fully qualified name of the client that sent the
709      * request. If the engine cannot or chooses not to resolve the hostname
710      * (to improve performance), this method returns the dotted-string form of
711      * the IP address. For HTTP servlets, same as the value of the CGI variable
712      * <code>REMOTE_HOST</code>.
713      *
714      * @return a <code>String</code> containing the fully
715      * qualified name of the client
716      *
717      */

718     public String JavaDoc getRemoteHost() {
719         return remoteHost;
720     }
721
722     /**
723      * Returns the fully qualified name of the client that sent the
724      * request. If the engine cannot or chooses not to resolve the hostname
725      * (to improve performance), this method returns the dotted-string form of
726      * the IP address. For HTTP servlets, same as the value of the CGI variable
727      * <code>REMOTE_HOST</code>.
728      *
729      * @return a <code>String</code> containing the fully
730      * qualified name of the client
731      *
732      */

733     public String JavaDoc getRemoteUser()
734     {
735         return remoteUser;
736     }
737
738     /**
739      *
740      * Returns a {@link RequestDispatcher} object that acts as a wrapper for
741      * the resource located at the given path.
742      * A <code>RequestDispatcher</code> object can be used to forward
743      * a request to the resource or to include the resource in a response.
744      * The resource can be dynamic or static.
745      *
746      * <p>The pathname specified may be relative, although it cannot extend
747      * outside the current servlet context. If the path begins with
748      * a "/" it is interpreted as relative to the current context root.
749      * This method returns <code>null</code> if the servlet container
750      * cannot return a <code>RequestDispatcher</code>.
751      *
752      * <p>The difference between this method and {@link
753      * ServletContext#getRequestDispatcher} is that this method can take a
754      * relative path.
755      *
756      * @param url a <code>String</code> specifying the pathname
757      * to the resource
758      *
759      * @return a <code>RequestDispatcher</code> object
760      * that acts as a wrapper for the resource
761      * at the specified path
762      *
763      * @see RequestDispatcherSimulator
764      * @see ServletContextSimulator#getRequestDispatcher
765      *
766      */

767     public RequestDispatcher JavaDoc getRequestDispatcher( String JavaDoc url )
768     {
769         return context.getRequestDispatcher(url);
770     }
771
772     /**
773      *
774      * Returns the session ID specified by the client. This may
775      * not be the same as the ID of the actual session in use.
776      * For example, if the request specified an old (expired)
777      * session ID and the server has started a new session, this
778      * method gets a new session with a new ID. If the request
779      * did not specify a session ID, this method returns
780      * <code>null</code>.
781      *
782      *
783      * @return a <code>String</code> specifying the session
784      * ID, or <code>null</code> if the request did
785      * not specify a session ID
786      *
787      * @see #isRequestedSessionIdValid
788      *
789      */

790     public String JavaDoc getRequestedSessionId()
791     {
792         return reqSessionId;
793     }
794
795     /**
796      *
797      * Returns the part of this request's URL from the protocol
798      * name up to the query string in the first line of the HTTP request.
799      * The web container does not decode this String.
800      * For example:
801      *
802      *
803      * <table>
804      * <tr align=left><th>First line of HTTP request </th>
805      * <th> Returned Value</th>
806      * <tr><td>POST /some/path.html HTTP/1.1<td><td>/some/path.html
807      * <tr><td>GET http://foo.bar/a.html HTTP/1.0
808      * <td><td>/a.html
809      * <tr><td>HEAD /xyz?a=b HTTP/1.1<td><td>/xyz
810      * </table>
811      *
812      *
813      * @return a <code>String</code> containing
814      * the part of the URL from the
815      * protocol name up to the query string
816      *
817      *
818      */

819     public String JavaDoc getRequestURI()
820     {
821         return requestURI;
822     }
823
824
825     /**
826      * Reconstructs the URL the client used to make the request. The returned URL contains a protocol, server name, port number, and server path, but it does not include query string parameters.
827      * <br><br>
828      * Because this method returns a StringBuffer, not a string, you can modify the URL easily, for example, to append query parameters.
829      * <br><br>
830      * This method is useful for creating redirect messages and for reporting errors.
831      * @return a <code>StringBuffer</code> object containing the reconstructed URL
832      */

833
834     public StringBuffer JavaDoc getRequestURL()
835     {
836         return new StringBuffer JavaDoc(requestURL);
837     }
838
839     /**
840      * Returns the name of the scheme used to make this request,
841      * for example,
842      * <code>http</code>, <code>https</code>, or <code>ftp</code>.
843      * Different schemes have different rules for constructing URLs,
844      * as noted in RFC 1738.
845      *
846      * @return a <code>String</code> containing the name
847      * of the scheme used to make this request
848      *
849      */

850     public String JavaDoc getScheme()
851     {
852         return scheme;
853     }
854
855     /**
856      * Returns the host name of the server that received
857      * the request. For HTTP servlets, same as the value of
858      * the CGI variable SERVER_NAME.
859      * @return the name of the server to which the request was sent
860      */

861     public String JavaDoc getServerName() {
862         return serverName;
863     }
864
865     /**
866      * Returns the port number on which this request was received. For HTTP servlets, same as the value of the CGI variable SERVER_PORT.
867      * @return an integer specifying the port number
868      */

869     public int getServerPort() {
870         return this.port;
871     }
872
873     /**
874      * Sets the server port to be used with {@link#getServerPort}.
875      */

876     public void setServerPort(int port) {
877         this.port = port;
878     }
879
880     /**
881      *
882      * Returns the part of this request's URL that calls
883      * the servlet. This includes either the servlet name or
884      * a path to the servlet, but does not include any extra
885      * path information or a query string. Same as the value
886      * of the CGI variable SCRIPT_NAME.
887      *
888      *
889      * @return a <code>String</code> containing
890      * the name or path of the servlet being
891      * called, as specified in the request URL,
892      * decoded.
893      *
894      *
895      */

896     public String JavaDoc getServletPath()
897     {
898         return servletPath;
899     }
900
901     /**
902      *
903      * Returns the current session associated with this request,
904      * or if the request does not have a session, creates one.
905      *
906      * @return the <code>HttpSession</code> associated
907      * with this request
908      *
909      * @see #getSession(boolean)
910      *
911      */

912     public HttpSession JavaDoc getSession()
913     {
914         return getSession(true);
915     }
916
917     /**
918      *
919      * Returns the current <code>HttpSession</code>
920      * associated with this request or, if if there is no
921      * current session and <code>create</code> is true, returns
922      * a new session.
923      *
924      * <p>If <code>create</code> is <code>false</code>
925      * and the request has no valid <code>HttpSession</code>,
926      * this method returns <code>null</code>.
927      *
928      * <p>To make sure the session is properly maintained,
929      * you must call this method before
930      * the response is committed. If the container is using cookies
931      * to maintain session integrity and is asked to create a new session
932      * when the response is committed, an IllegalStateException is thrown.
933      *
934      *
935      *
936      *
937      * @param b <code>true</code> to create
938      * a new session for this request if necessary;
939      * <code>false</code> to return <code>null</code>
940      * if there's no current session
941      *
942      *
943      * @return the <code>HttpSession</code> associated
944      * with this request or <code>null</code> if
945      * <code>create</code> is <code>false</code>
946      * and the request has no valid session
947      *
948      * @see #getSession()
949      *
950      *
951      */

952     public HttpSession JavaDoc getSession(boolean b)
953     {
954         if ((session == null) && (b))
955             this.session = new HttpSessionSimulator(context);
956         else if ((session != null) && (!((HttpSessionSimulator) session).isValid()) && (b))
957             this.session = new HttpSessionSimulator(context);
958         if ((session != null) && (((HttpSessionSimulator) session).isValid()))
959             return this.session;
960         else
961             return null;
962     }
963
964     /**
965      *
966      * Returns a <code>java.security.Principal</code> object containing
967      * the name of the current authenticated user. If the user has not been
968      * authenticated, the method returns <code>null</code>.
969      *
970      * @return a <code>java.security.Principal</code> containing
971      * the name of the user making this request;
972      * <code>null</code> if the user has not been
973      * authenticated
974      *
975      */

976     public Principal JavaDoc getUserPrincipal()
977     {
978         return this.principal;
979     }
980
981     /**
982      *
983      * Checks whether the requested session ID came in as a cookie.
984      *
985      * @return <code>true</code> in all cases
986      *
987      * @see #getSession
988      *
989      */

990     public boolean isRequestedSessionIdFromCookie()
991     {
992         return true;
993     }
994
995     /**
996      *
997      * @deprecated As of Version 2.1 of the Java Servlet
998      * API, use {@link #isRequestedSessionIdFromURL}
999      * instead.
1000     *
1001     */

1002    public boolean isRequestedSessionIdFromUrl()
1003    {
1004        return isRequestedSessionIdFromURL();
1005    }
1006
1007    /**
1008     *
1009     * Checks whether the requested session ID came in as part of the
1010     * request URL.
1011     *
1012     * @return <code>false</code> in all cases.
1013     *
1014     * @see #getSession
1015     *
1016     */

1017    public boolean isRequestedSessionIdFromURL()
1018    {
1019        return false;
1020    }
1021
1022    /**
1023     *
1024     * Checks whether the requested session ID is still valid.
1025     *
1026     * @return <code>true</code> if this
1027     * request has an id for a valid session
1028     * in the current session context;
1029     * <code>false</code> otherwise
1030     *
1031     * @see #getRequestedSessionId
1032     * @see #getSession
1033     *
1034     */

1035    public boolean isRequestedSessionIdValid()
1036    {
1037        if (session != null) {
1038            try {
1039                session.getId();
1040                return true;
1041            } catch (IllegalStateException JavaDoc e) {
1042                return false;
1043            }
1044        } else
1045            return false;
1046    }
1047
1048    /**
1049     *
1050     * Returns a boolean indicating whether this request was made using a
1051     * secure channel, such as HTTPS.
1052     *
1053     *
1054     * @return true if scheme has been set to HTTPS (ignoring case)
1055     *
1056     */

1057    public boolean isSecure()
1058    {
1059        if(scheme==null){
1060            return false;
1061        } else{
1062            return scheme.equalsIgnoreCase("HTTPS");
1063        }
1064    }
1065
1066    /**
1067     *
1068     * Returns a boolean indicating whether the authenticated user is included
1069     * in the specified logical "role". Roles and role membership can be
1070     * defined using deployment descriptors. If the user has not been
1071     * authenticated, the method returns <code>false</code>.
1072     *
1073     * @param s a <code>String</code> specifying the name
1074     * of the role
1075     *
1076     * @return <code>false</code> in all cases
1077     *
1078     */

1079    public boolean isUserInRole(String JavaDoc s)
1080    {
1081        return s.equals(userRole);
1082    }
1083
1084    /**
1085     * Sets user role to be used in {@link #isUserInRole}
1086     */

1087    public void setUserRole(String JavaDoc role) {
1088        this.userRole = role;
1089    }
1090
1091    /**
1092     *
1093     * Removes an attribute from this request. This method is not
1094     * generally needed as attributes only persist as long as the request
1095     * is being handled.
1096     *
1097     * <p>Attribute names should follow the same conventions as
1098     * package names. Names beginning with <code>java.*</code>,
1099     * <code>javax.*</code>, and <code>com.sun.*</code>, are
1100     * reserved for use by Sun Microsystems.
1101     *
1102     *
1103     * @param s a <code>String</code> specifying
1104     * the name of the attribute to remove
1105     *
1106     */

1107    public void removeAttribute(String JavaDoc s)
1108    {
1109        attributes.remove(s);
1110    }
1111
1112    /**
1113     *
1114     * Stores an attribute in this request.
1115     * Attributes are reset between requests. This method is most
1116     * often used in conjunction with {@link RequestDispatcher}.
1117     *
1118     * <p>Attribute names should follow the same conventions as
1119     * package names. Names beginning with <code>java.*</code>,
1120     * <code>javax.*</code>, and <code>com.sun.*</code>, are
1121     * reserved for use by Sun Microsystems.
1122     *<br> If the value passed in is null, the effect is the same as
1123     * calling {@link #removeAttribute}.
1124     *
1125     *
1126     *
1127     * @param name a <code>String</code> specifying
1128     * the name of the attribute
1129     *
1130     * @param o the <code>Object</code> to be stored
1131     *
1132     */

1133    public void setAttribute(String JavaDoc name, Object JavaDoc o)
1134    {
1135        if (o == null)
1136            attributes.remove(name);
1137        else
1138            attributes.put(name, o);
1139    }
1140
1141
1142    /**
1143     * Sets authentication scheme to be used in {@link #getAuthType}.
1144     */

1145    public void setAuthType(String JavaDoc s)
1146    {
1147        authType = s;
1148    }
1149
1150    /**
1151     * Sets character encoding to be used in {@link #getCharacterEncoding}.
1152     */

1153    public void setCharacterEncoding(String JavaDoc s)
1154    {
1155        charEncoding = s;
1156    }
1157
1158    /**
1159     * Sets content type to be used in {@link #getContentType}.
1160     */

1161    public void setContentType(String JavaDoc s) {
1162        contentType = s;
1163    }
1164
1165    /**
1166     * Sets a header to be used in {@link #getHeader}.
1167     */

1168    public void setHeader(String JavaDoc key, String JavaDoc value)
1169    {
1170        headers.put(key,value);
1171    }
1172
1173    /**
1174     * Sets the name of the HTTP method with which this request
1175     * was made. This value will be returned in the getMethod
1176     * method.
1177     *
1178     *
1179     * @param methodType one of the following constant values
1180     * defined in this class: {@link #GET}, {@link #POST}, and {@link #PUT}
1181     *
1182     */

1183    public void setMethod(int methodType)
1184    {
1185        switch (methodType)
1186        {
1187            case GET:method="GET";break;
1188            case PUT:method="PUT";break;
1189            case POST:method="POST";break;
1190            default:method="POST";
1191        }
1192    }
1193
1194    /**
1195     * Sets parameter value to be used by {@link #getParameter}.
1196     */

1197    public void setParameterValue( String JavaDoc key, String JavaDoc[] value )
1198    {
1199        parameters.put( key, value );
1200    }
1201
1202    /**
1203     * Sets path information to be used by {@link #getPathInfo}.
1204     */

1205    public void setPathInfo(String JavaDoc s)
1206    {
1207        pathInfo = s;
1208    }
1209
1210    /**
1211     * Sets query string to be used by {@link #getQueryString}.
1212     */

1213    public void setQueryString(String JavaDoc s) {
1214        this.queryString = s;
1215    }
1216
1217    /**
1218     * Sets remote user to be used by {@link #getRemoteUser}.
1219     */

1220    public void setRemoteUser(String JavaDoc remoteUser)
1221    {
1222        this.remoteUser = remoteUser;
1223    }
1224
1225    /**
1226     * Sets remote address to be used by {@link #getRemoteAddr}.
1227     */

1228    public void setRemoteAddr(String JavaDoc remoteAddr) {
1229        this.remoteAddr = remoteAddr;
1230    }
1231
1232    /**
1233     * Sets remote host to be used by {@link #getRemoteHost}.
1234     */

1235    public void setRemoteHost(String JavaDoc remoteHost) {
1236        this.remoteHost = remoteHost;
1237    }
1238
1239    /**
1240     * Sets requested session ID to be used by {@link #getRequestedSessionId}.
1241     */

1242    public void setRequestedSessionId(String JavaDoc s)
1243    {
1244        reqSessionId = s;
1245    }
1246
1247    /**
1248     * Sets request URI to be used by {@link #getRequestURI}.
1249     */

1250    public void setRequestURI(String JavaDoc requestURI)
1251    {
1252        this.requestURI = requestURI;
1253    }
1254
1255    /**
1256     * Sets the request URL to be used in this test. This method uses
1257     * the given request URL to also set the scheme, server name, server
1258     * port, request URI, and query string.
1259     */

1260    public void setRequestURL(String JavaDoc url) {
1261
1262        // set request url
1263
int queryIndex = url.lastIndexOf('?');
1264        if (queryIndex < 0)
1265            queryIndex = url.length();
1266        this.requestURL = url.substring(0,queryIndex);
1267
1268        // set query string
1269
if (queryIndex != url.length())
1270            setQueryString(url.substring(queryIndex + 1));
1271
1272        // set scheme
1273
int schemeIndex = url.lastIndexOf("://");
1274        setScheme(url.substring(0,schemeIndex));
1275
1276        // set uri
1277
setRequestURI(url.substring(url.indexOf('/',schemeIndex + 3),queryIndex));
1278
1279        // set server name and port
1280
int portIndex = url.indexOf(':',schemeIndex + 2);
1281        if (portIndex > 0) {
1282            setServerName(url.substring(schemeIndex + 3, portIndex));
1283            setServerPort(Integer.parseInt(url.substring(portIndex + 1,url.indexOf('/',schemeIndex + 3))));
1284        } else {
1285            setServerName(url.substring(schemeIndex + 3,url.indexOf('/',schemeIndex + 3)));
1286            if (isSecure())
1287                setServerPort(443);
1288            else
1289                setServerPort(80);
1290        }
1291    }
1292
1293    /**
1294     * Sets scheme to be used by {@link #getScheme}.
1295     */

1296    public void setScheme(String JavaDoc s)
1297    {
1298        scheme = s;
1299    }
1300
1301    /**
1302     * Sets servlet path to be used by {@link #getServletPath}.
1303     */

1304    public void setServletPath(String JavaDoc s)
1305    {
1306        servletPath = s;
1307    }
1308
1309    /**
1310     * Sets server name to be used by {@link #getServerName}.
1311     */

1312    public void setServerName(String JavaDoc s)
1313    {
1314        serverName = s;
1315    }
1316
1317    /**
1318     * Sets the context path to be used by {@link #getContextPath}.
1319     */

1320    public void setContextPath(String JavaDoc s)
1321    {
1322        contextPath = s;
1323    }
1324
1325
1326    /**
1327     * Sets the locale to be used by {@link #getLocale}.
1328     */

1329    public void setLocale(Locale locale) {
1330        this.locale = locale;
1331    }
1332
1333    /**
1334     * Sets the Principal used by {@link #getUserPrincipal}.
1335     */

1336    public void setUserPrincipal(Principal JavaDoc principal) {
1337        this.principal = principal;
1338    }
1339
1340    public int getRemotePort() {
1341        return remotePort;
1342    }
1343
1344    public void setRemotePort(int remotePort) {
1345        this.remotePort = remotePort;
1346    }
1347
1348    public String JavaDoc getLocalAddr() {
1349        return localAddr;
1350    }
1351
1352    public void setLocalAddr(String JavaDoc localAddr) {
1353        this.localAddr = localAddr;
1354    }
1355
1356    public String JavaDoc getLocalName() {
1357        return localName;
1358    }
1359
1360    public void setLocalName(String JavaDoc localName) {
1361        this.localName = localName;
1362    }
1363
1364    public int getLocalPort() {
1365        return localPort;
1366    }
1367
1368    public void setLocalPort(int localPort) {
1369        this.localPort = localPort;
1370    }
1371
1372
1373}
1374
Popular Tags