1 package servletunit;
2
3 import javax.servlet.RequestDispatcher;
4 import javax.servlet.ServletContext;
5 import javax.servlet.ServletInputStream;
6 import javax.servlet.ServletRequest;
7 import javax.servlet.http.Cookie;
8 import javax.servlet.http.HttpServletRequest;
9 import javax.servlet.http.HttpSession;
10 import java.io.BufferedReader;
11 import java.io.IOException;
12 import java.io.File;
13 import java.security.Principal;
14 import java.util.*;
15 import java.text.SimpleDateFormat;
16 import java.text.DateFormat;
17 import java.text.ParseException;
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
37 {
38 private Hashtable attributes;
39 private String scheme;
40 private String protocol = "HTTP/1.1";
41 private String requestURI;
42 private String requestURL;
43 private String contextPath = "";
44 private String servletPath;
45 private String pathInfo;
46 private String queryString;
47 private String method;
48 private String contentType;
49 private Locale locale;
50 private Principal principal;
51 String remoteAddr;
52 String localAddr;
53 String remoteHost;
54 String localName;
55 int remotePort;
56 int localPort;
57 private String remoteUser;
58 private String userRole;
59 private String reqSessionId;
60 String authType;
61 String charEncoding;
62 private String serverName;
63 private int port;
64
65 private Hashtable parameters;
66 private Hashtable headers;
67 private Vector cookies;
68
69 private HttpSession session;
70 private ServletContext 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 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 key, String 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 name, String[] 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 getAttribute(String 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 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 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 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 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 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[] 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 [] getCookies()
313 {
314 if (cookies.isEmpty())
315 return null;
316 else {
317 Cookie[] cookieArray = new Cookie[cookies.size()];
318 return (Cookie []) 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 name)
333 {
334 String s1 = getHeader(name);
335 if(s1 == null)
336 return -1L;
337 try
338 {
339 DateFormat dateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z");
340 return dateFormat.parse(s1).getTime();
341 }
342 catch(ParseException exception) {
343 throw new IllegalArgumentException("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 name, long millis)
353 {
354 String dateString = new SimpleDateFormat("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 getHeader(String s)
377 {
378 return (String) 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 s)
410 {
411 throw new UnsupportedOperationException("getHeaders operation is not supported!");
412 }
413
414 /**
415 * This operation is not supported.
416 */
417 public ServletInputStream getInputStream() throws IOException {
418 throw new UnsupportedOperationException("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 s)
444 {
445 Object header = headers.get(s);
446 if (header != null) {
447 try {
448 Integer intHeader = (Integer) header;
449 return intHeader.intValue();
450 } catch (ClassCastException e) {
451 throw new NumberFormatException("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 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 getParameter( String s )
539 {
540 if (s == null)
541 return null;
542
543 Object param = parameters.get(s);
544 if( null == param )
545 return null;
546 if( param.getClass().isArray() )
547 return ((String[]) param)[0];
548 return (String)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[] getParameterValues( String s )
589 {
590 if (s == null)
591 return null;
592 Object param = parameters.get( s );
593 if( null == param )
594 return null;
595 else {
596 if (param.getClass().isArray()) {
597 return (String[]) param;
598 } else {
599 return new String[] {(String) 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 getPathInfo()
626 {
627 return pathInfo;
628 }
629
630 /**
631 * This operation is not supported.
632 */
633 public String getPathTranslated()
634 {
635 throw new UnsupportedOperationException("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 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 getQueryString()
668 {
669 return queryString;
670 }
671
672 /**
673 * This operation is not supported.
674 */
675 public BufferedReader getReader() throws IOException {
676 throw new UnsupportedOperationException("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 getRealPath(String path)
686 {
687 File contextDirectory = ((ServletContextSimulator) context).getContextDirectory();
688 if ((contextDirectory == null) || (path == null))
689 return null;
690 else
691 return (new File(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 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 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 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 getRequestDispatcher( String 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 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 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 getRequestURL()
835 {
836 return new StringBuffer(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 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 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 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 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 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 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 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 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 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 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 name, Object 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 s)
1146 {
1147 authType = s;
1148 }
1149
1150 /**
1151 * Sets character encoding to be used in {@link #getCharacterEncoding}.
1152 */
1153 public void setCharacterEncoding(String s)
1154 {
1155 charEncoding = s;
1156 }
1157
1158 /**
1159 * Sets content type to be used in {@link #getContentType}.
1160 */
1161 public void setContentType(String s) {
1162 contentType = s;
1163 }
1164
1165 /**
1166 * Sets a header to be used in {@link #getHeader}.
1167 */
1168 public void setHeader(String key, String 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 key, String[] 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 s)
1206 {
1207 pathInfo = s;
1208 }
1209
1210 /**
1211 * Sets query string to be used by {@link #getQueryString}.
1212 */
1213 public void setQueryString(String s) {
1214 this.queryString = s;
1215 }
1216
1217 /**
1218 * Sets remote user to be used by {@link #getRemoteUser}.
1219 */
1220 public void setRemoteUser(String 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 remoteAddr) {
1229 this.remoteAddr = remoteAddr;
1230 }
1231
1232 /**
1233 * Sets remote host to be used by {@link #getRemoteHost}.
1234 */
1235 public void setRemoteHost(String 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 s)
1243 {
1244 reqSessionId = s;
1245 }
1246
1247 /**
1248 * Sets request URI to be used by {@link #getRequestURI}.
1249 */
1250 public void setRequestURI(String 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 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 s)
1297 {
1298 scheme = s;
1299 }
1300
1301 /**
1302 * Sets servlet path to be used by {@link #getServletPath}.
1303 */
1304 public void setServletPath(String s)
1305 {
1306 servletPath = s;
1307 }
1308
1309 /**
1310 * Sets server name to be used by {@link #getServerName}.
1311 */
1312 public void setServerName(String 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 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 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 getLocalAddr() {
1349 return localAddr;
1350 }
1351
1352 public void setLocalAddr(String localAddr) {
1353 this.localAddr = localAddr;
1354 }
1355
1356 public String getLocalName() {
1357 return localName;
1358 }
1359
1360 public void setLocalName(String 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 }