00001
package com.quadcap.http.server22;
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
import java.util.Collections;
00042
import java.util.Comparator;
00043
import java.util.Date;
00044
import java.util.Enumeration;
00045
import java.util.Hashtable;
00046
import java.util.Locale;
00047
import java.util.Vector;
00048
00049
import java.io.BufferedReader;
00050
import java.io.ByteArrayInputStream;
00051
import java.io.IOException;
00052
import java.io.InputStream;
00053
import java.io.InputStreamReader;
00054
import java.io.PushbackInputStream;
00055
00056
import java.net.InetAddress;
00057
00058
import java.text.DateFormat;
00059
00060
import java.security.Principal;
00061
00062
import javax.servlet.RequestDispatcher;
00063
import javax.servlet.ServletInputStream;
00064
import javax.servlet.http.Cookie;
00065
import javax.servlet.http.HttpServletRequest;
00066
import javax.servlet.http.HttpSession;
00067
00068
import com.quadcap.http.util.HeaderParser;
00069
00070
import com.quadcap.util.Debug;
00071
import com.quadcap.util.Util;
00072
00073
import com.quadcap.io.URLDecodeInputStream;
00074
00075
import com.quadcap.util.text.OctetMap;
00076
import com.quadcap.util.text.Scanner;
00077
00078
00079
00080
00081
00082
00083
00084
00085 public class HttpRequest implements HttpServletRequest {
00086 WebWorker w;
00087 HttpResponse res;
00088 HttpInputStream his;
00089 HttpDispatcher rd;
00090 HSession session = null;
00091 BufferedReader
reader = null;
00092
00093 Scanner
scanner;
00094 static OctetMap
mapM =
new OctetMap(
'&');
00095
static {
00096
mapM.include(
'\r');
00097
mapM.include(
'\n');
00098 }
00099 static OctetMap
mapE =
new OctetMap(
'=');
00100 static OctetMap
mapQuote =
new OctetMap(
'"');
00101
00102 String
method = null;
00103 String
uri = null;
00104 String
pathInfo = null;
00105 String
queryString = null;
00106 int queryStringStart = 0;
00107 int queryStringLen = 0;
00108 String
protocol = null;
00109 byte[]
headers =
new byte[4096];
00110 int[]
hOffsets =
new int[32];
00111 Hashtable
parameters =
new Hashtable();
00112 Hashtable
attributes = null;
00113 boolean getInputStreamCalled =
false;
00114 boolean getReaderCalled =
false;
00115
00116 static DateFormat
dateFormat = DateFormat.getInstance();
00117
00118 static final int CR =
'\r';
00119
00120 Cookie[]
cookies = null;
00121 boolean badRequest =
false;
00122
00123 static final String
methodGET =
"GET";
00124 static final String
methodHEAD =
"HEAD";
00125 static final String
methodPOST =
"POST";
00126
00127 static final String
proto_09 =
"HTTP/0.9";
00128 static final String
proto_10 =
"HTTP/1.0";
00129 static final String
proto_11 =
"HTTP/1.1";
00130
00131
00132
00133
00134
00135
00136
00137 public HttpRequest(
WebWorker w) {
00138
this.w = w;
00139
this.scanner =
new Scanner(null);
00140 }
00141
00142
00143
00144
00145 public void reset(
HttpInputStream is)
throws IOException {
00146
00147
00148
this.his = is;
00149
parameters.clear();
00150
attributes = null;
00151
method = null;
00152
uri = null;
00153
pathInfo = null;
00154
queryString = null;
00155
protocol = null;
00156
reader = null;
00157
session = null;
00158
rd = null;
00159
cookies = null;
00160
queryStringStart = 0;
00161
getInputStreamCalled =
false;
00162
getReaderCalled =
false;
00163
00164
00165
int hsize = is.getInputStream().readHeaders(
headers,
hOffsets);
00166
00167
00168
int lim =
hOffsets[1];
00169
int pos = 0;
00170
while (
headers[pos] ==
'\r' ||
headers[pos] ==
'\n') pos++;
00171
int start = pos;
00172
while (
headers[pos] !=
' ' && pos < lim) pos++;
00173
00174
final byte b1 =
headers[start];
00175
if (b1 ==
'G') {
00176
if (headers[start+1] ==
'E') {
00177
if (headers[start+2] ==
'T') {
00178
method =
methodGET;
00179 }
00180 }
00181 }
else if (b1 ==
'P') {
00182
if (headers[start+1] ==
'O') {
00183
if (headers[start+2] ==
'S') {
00184
if (headers[start+3] ==
'T') {
00185
method =
methodPOST;
00186 }
00187 }
00188 }
00189 }
else if (b1 ==
'H') {
00190
if (headers[start+1] ==
'E') {
00191
if (headers[start+2] ==
'A') {
00192
if (headers[start+3] ==
'D') {
00193
method =
methodHEAD;
00194 }
00195 }
00196 }
00197 }
00198
if (
method == null) {
00199
method =
new String(headers, start, pos - start);
00200
if (
method.equalsIgnoreCase(
"get")) {
00201
method =
methodGET;
00202 }
else if (
method.equalsIgnoreCase(
"post")) {
00203
method =
methodPOST;
00204 }
else if (
method.equalsIgnoreCase(
"head")) {
00205
method =
methodHEAD;
00206 }
00207 }
00208
00209
00210
while (headers[pos] ==
' ' && pos < lim) pos++;
00211 start = pos;
00212
while (headers[pos] !=
' ' && headers[pos] !=
'?' && pos < lim) pos++;
00213
uri =
new String(headers, start, pos - start);
00214
00215
if (headers[pos] ==
'?') {
00216 start = ++pos;
00217
while (headers[pos] !=
' ' && headers[pos] !=
'\r'&& pos < lim) {
00218 pos++;
00219 }
00220
queryStringStart = start;
00221
queryStringLen = pos - start;
00222
parseParameters(
parameters,
00223
new ByteArrayInputStream(headers, start,
00224 pos-start));
00225
00226 }
00227
while (headers[pos] ==
' ' && pos < lim) pos++;
00228 start = pos;
00229
if (pos < lim) {
00230
for (byte c = headers[pos];
00231 c !=
'\r' && c !=
'\n' && c !=
' ';
00232 c = headers[pos]) {
00233
if (++pos >= lim)
break;
00234 }
00235 }
00236
protocol =
proto_10;
00237
try {
00238
if (headers[pos-1] ==
'0') {
00239
protocol = proto_10;
00240 }
else if (headers[pos-1] ==
'1') {
00241
protocol =
proto_11;
00242 }
00243
if (
protocol == null) {
00244
protocol =
new String(headers, start, pos - start);
00245 }
00246 }
catch (Throwable t) {}
00247
00248
00249
int cl =
getContentLength();
00250
if (cl >= 0) {
00251 is.setContentLength(cl);
00252 }
00253 }
00254
00255 final void maybeParsePostData() {
00256
if (!
getReaderCalled && !
getInputStreamCalled &&
00257
method ==
methodPOST) {
00258 String type =
getContentType();
00259
if (type != null &&
00260 type.equals(
"application/x-www-form-urlencoded"))
00261 {
00262
scanner.reset(
his);
00263
parseParameters(
parameters,
scanner);
00264 }
00265 }
00266 }
00267
00268 boolean badRequest() {
return badRequest; }
00269
00270 public void setURI(String s) {
00271
try {
00272 Scanner
scanner =
00273
new Scanner(
new ByteArrayInputStream(s.getBytes()));
00274
this.uri = scanner.parseWhile(OctetMap.uriChars);
00275
if (scanner.peek() ==
'?') {
00276 scanner.matchChar(
'?');
00277
queryString = scanner.parseWhile(OctetMap.uriChars);
00278
parseParameters(
parameters,
00279
new ByteArrayInputStream(
queryString.getBytes()));
00280 }
else {
00281
queryString =
"";
00282 }
00283 }
catch (IOException e) {}
00284 }
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294 public int getContentLength() {
00295 String s =
getHeader(
"Content-Length");
00296
if (s == null)
return -1;
00297
try {
00298
return Integer.parseInt(s);
00299 }
catch (Exception e) {
00300
return -1;
00301 }
00302 }
00303
00304
00305
00306
00307
00308 public String
getContentType() {
00309
return getHeader(
"Content-Type");
00310 }
00311
00312
00313
00314
00315
00316
00317 public String
getProtocol() {
00318
return protocol;
00319 }
00320
00321
00322
00323
00324
00325
00326
00327
00328 public String
getScheme() {
00329
return "HTTP";
00330 }
00331
00332
00333
00334
00335
00336 public String
getServerName() {
00337
return w.getHostName();
00338 }
00339
00340
00341
00342
00343
00344 public int getServerPort() {
00345
return w.getPort();
00346 }
00347
00348
00349
00350
00351
00352 public String
getRemoteAddr() {
00353
return w.getRemoteAddr();
00354 }
00355
00356
00357
00358
00359
00360 public String
getRemoteHost() {
00361
return w.getRemoteHost();
00362 }
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375 public String
getRealPath(String path) {
00376
WebApplication app =
rd.
getContext();
00377
return app.
getRealPath(path);
00378 }
00379
00380
00381
00382
00383
00384
00385
00386
00387 public ServletInputStream
getInputStream() throws IOException {
00388
if (
getReaderCalled) {
00389
throw new IllegalStateException(
"getReader() already called");
00390 }
00391
getInputStreamCalled =
true;
00392
return w.
getHttpInputStream();
00393 }
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410 public String
getParameter(String name) {
00411
maybeParsePostData();
00412 String[] s = (String[])
parameters.get(name);
00413
if (s == null)
return null;
00414
return s[0];
00415 }
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426 public String[]
getParameterValues(String name) {
00427
maybeParsePostData();
00428 String[] ret =(String[])
parameters.get(name);
00429
return ret;
00430 }
00431
00432
00433
00434
00435
00436
00437
00438
00439 public Enumeration
getParameterNames() {
00440
maybeParsePostData();
00441
return parameters.keys();
00442 }
00443
00444
00445
00446
00447
00448
00449
00450 public Object
getAttribute(String name) {
00451 Object obj = null;
00452
if (
attributes != null) obj =
attributes.get(name);
00453
return obj;
00454 }
00455
00456
00457
00458
00459
00460
00461
00462 public void setAttribute(String name, Object obj) {
00463
if (
attributes == null)
attributes =
new Hashtable();
00464
attributes.put(name, obj);
00465 }
00466
00467
00468
00469
00470 public Enumeration
getAttributeNames() {
00471
if (
attributes == null)
return new Vector().elements();
00472
return attributes.keys();
00473 }
00474
00475
00476
00477
00478 public void removeAttribute(String name) {
00479
attributes.remove(name);
00480 }
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493 public BufferedReader
getReader() throws IOException {
00494
if (
getInputStreamCalled) {
00495
throw new IllegalStateException(
"getInputStream() already called");
00496 }
00497
if (
reader == null) {
00498
reader =
00499
new BufferedReader(
new InputStreamReader(
getInputStream()));
00500 }
00501
getReaderCalled =
true;
00502
return reader;
00503 }
00504
00505
00506
00507
00508 public String
getCharacterEncoding () {
00509 String s =
getContentType();
00510
if (s == null)
return null;
00511
00512
int idx = s.indexOf(
';');
00513
while (idx > 0) {
00514 s = s.substring(idx+1).trim();
00515 idx = s.indexOf(
';');
00516 String c = s;
00517
if (idx > 0) {
00518 c = s.substring(0, idx).trim();
00519 }
00520
if (c.startsWith(
"charset=")) {
00521
return c.substring(8);
00522 }
00523 }
00524
return null;
00525 }
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536 public Cookie[]
getCookies() {
00537
if (
cookies == null) {
00538
CookieParser cp =
new CookieParser(
getHeader(
"Cookie"));
00539
try {
00540
cookies = cp.
parseCookies();
00541 }
catch (IOException e) {
00542
Debug.print(e);
00543
cookies =
new Cookie[0];
00544 }
00545 }
00546
return cookies;
00547 }
00548
00549
00550
00551
00552
00553
00554
00555 public String
getMethod() {
00556
return method;
00557 }
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581 public String
getRequestURI() {
00582
return uri;
00583 }
00584
00585
00586
00587
00588
00589
00590
00591
00592 public String
getServletPath() {
00593
return rd.
getServletPath();
00594 }
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605 public String
getPathInfo() {
00606
return rd.
getPathInfo();
00607 }
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618 public String
getPathTranslated() {
00619
return null;
00620 }
00621
00622
00623
00624
00625
00626
00627
00628
00629 public String
getQueryString() {
00630
if (
queryString == null) {
00631
if (
queryStringStart > 0) {
00632
queryString =
new String(
headers,
queryStringStart,
00633 (
queryStringLen));
00634 }
00635 }
00636
return queryString;
00637 }
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648 public String
getRemoteUser() {
00649
return null;
00650 }
00651
00652
00653
00654
00655
00656
00657
00658 public String
getAuthType() {
00659
return null;
00660 }
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671 public String
getHeader(String name) {
00672 String ret = null;
00673
int hcnt =
hOffsets[0];
00674
for (
int i = 1; i < hcnt; i++) {
00675
int off = hOffsets[i];
00676
int lim = hOffsets[i+1];
00677
int pos = off;
00678
while (
headers[pos] !=
':' && pos < lim) pos++;
00679 String hdr =
new String(
headers, off, pos - off);
00680
if (name.equalsIgnoreCase(hdr)) {
00681 ret =
new String(
headers, pos+1, lim-pos-1).trim();
00682
break;
00683 }
00684 }
00685
return ret;
00686 }
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700 public int getIntHeader(String name) {
00701
int ret = -1;
00702 String val = getHeader(name);
00703
if (val != null) {
00704 ret = Integer.parseInt(val);
00705 }
00706
return ret;
00707 }
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720 public long getDateHeader(String name) {
00721
long ret = -1;
00722 String val = getHeader(name);
00723
if (val != null) {
00724
try {
00725
synchronized (
dateFormat) {
00726 Date d =
dateFormat.parse(val);
00727 ret = d.getTime();
00728 }
00729 }
catch (Exception e) {
00730 }
00731 }
00732
return ret;
00733 }
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743 public Enumeration
getHeaders() {
00744
return getHeaderNames();
00745 }
00746
00747 public Enumeration
getHeaders(String name) {
00748 Vector v =
new Vector();
00749
int hcnt =
hOffsets[0];
00750
for (
int i = 1; i < hcnt; i++) {
00751
int off = hOffsets[i];
00752
int lim = hOffsets[i+1];
00753
int pos = off;
00754
while (
headers[pos] !=
':' && pos < lim) pos++;
00755
if (name.equalsIgnoreCase(
new String(
headers, off, pos-off))) {
00756 pos++;
00757
int len = lim - pos;
00758 v.addElement(
new String(headers, pos, len).trim());
00759 }
00760 }
00761
return v.elements();
00762 }
00763
00764 public Enumeration
getHeaderNames() {
00765 Vector v =
new Vector();
00766
int hcnt =
hOffsets[0];
00767
for (
int i = 1; i < hcnt; i++) {
00768
int off = hOffsets[i];
00769
int lim = hOffsets[i+1];
00770
int pos = off;
00771
while (
headers[pos] !=
':' && pos < lim) pos++;
00772 v.addElement(
new String(
headers, off, pos-off));
00773 }
00774
return v.elements();
00775 }
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795 public HttpSession
getSession(
boolean create) {
00796
if (
session == null) {
00797
WebApplication app =
rd.
getContext();
00798 String sessionId =
getRequestedSessionId();
00799
if (sessionId != null) {
00800
session = app.
getSession(sessionId);
00801 }
else if (create) {
00802
session = app.
createSession();
00803 sessionId =
session.
getId();
00804 }
00805
if (sessionId != null) {
00806 Cookie c =
new Cookie(
"sessionId", sessionId);
00807 c.setPath(
getContextPath());
00808
res.
addCookie(c);
00809 }
00810 }
00811
if (
session != null)
session.
updateLastAccess();
00812
return session;
00813 }
00814
00815
00816
00817
00818
00819
00820
00821 public HttpSession
getSession() {
00822
return getSession(
true);
00823 }
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835 public String
getRequestedSessionId() {
00836 String sessionId = null;
00837
getCookies();
00838
WebApplication app =
rd.
getContext();
00839
boolean foundSession =
false;
00840
for (
int i = 0; i <
cookies.length; i++) {
00841 Cookie c =
cookies[i];
00842
if (c.getName().equals(
"sessionId")) {
00843 sessionId = c.getValue();
00844
if (app.
getSession(sessionId) != null) {
00845 foundSession =
true;
00846
break;
00847
00848
00849 }
00850 }
00851 }
00852
if (sessionId != null && !foundSession) {
00853 sessionId = app.
createSession().
getId();
00854 }
00855
return sessionId;
00856 }
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868 public boolean isRequestedSessionIdValid() {
00869
HSession sess = null;
00870 String sessionId =
getRequestedSessionId();
00871
if (sessionId != null) {
00872 sess =
rd.
getContext().
getSession(sessionId);
00873 }
00874
return (sess != null && sess.
isValid());
00875 }
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886 public boolean isRequestedSessionIdFromCookie() {
00887
return true;
00888 }
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899 public boolean isRequestedSessionIdFromURL() {
00900
return false;
00901 }
00902 public boolean isRequestedSessionIdFromUrl() {
00903
return false;
00904 }
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917 String
getToken(OctetMap map)
throws IOException {
00918
scanner.skipWhile(OctetMap.wsChars);
00919
return scanner.parseWhile(map);
00920 }
00921
00922 static OctetMap
versionMap =
new OctetMap(
"HhTtPp/1.0");
00923
00924
00925
00926
00927
00928
00929
00930
00931 String
parseHttpVersion() throws IOException {
00932
scanner.skipWhile(OctetMap.wsChars);
00933
return scanner.parseWhile(
versionMap);
00934 }
00935
00936 static final String
urlDecode(String s) {
00937 StringBuffer sb = null;
00938
for (
int i = 0; i < s.length(); i++) {
00939
char c = s.charAt(i);
00940
switch (c) {
00941
case '+':
00942
if (sb == null) sb =
new StringBuffer(s.substring(0, i));
00943 sb.append(
' ');
00944
break;
00945
case '%':
00946
if (sb == null) sb =
new StringBuffer(s.substring(0, i));
00947
try {
00948 sb.append((
char) Integer.parseInt(s.substring(i+1, i+3),
00949 16));
00950 i += 2;
00951 }
catch (NumberFormatException e) {
00952
throw new IllegalArgumentException();
00953 }
catch (StringIndexOutOfBoundsException e) {
00954 String rest = s.substring(i);
00955 sb.append(rest);
00956
if (rest.length()==2) i++;
00957 }
00958
break;
00959
default:
00960
if (sb != null) sb.append(c);
00961 }
00962 }
00963
return sb == null ? s : sb.toString();
00964 }
00965
00966
00967
00968
00969
00970
00971
00972
00973 public static void parseParameters(Hashtable params, InputStream is) {
00974 parseParameters(params,
new Scanner(is));
00975 }
00976
00977 public static void parseParameters(Hashtable params, Scanner s) {
00978
try {
00979
do {
00980 String name = urlDecode(s.parseUntil(
mapE));
00981 s.matchChar(
'=');
00982 String val = urlDecode(s.parseUntil(
mapM));
00983 String[] vals = (String[])params.get(name);
00984
if (vals == null) {
00985 vals =
new String[1];
00986 }
else {
00987 String[] oldvals = vals;
00988 vals =
new String[vals.length+1];
00989
for (
int i = 0; i < oldvals.length; i++) {
00990 vals[i] = oldvals[i];
00991 }
00992 }
00993 vals[vals.length-1] = val;
00994 params.put(name, vals);
00995 s.matchChar(
'&');
00996 }
while (s.peek() >= 0);
00997 }
catch (IOException e) {
00998 }
00999 }
01000
01001
01002
01003
01004
01005
01006
01007 void setResponse(
HttpResponse res) {
this.res = res; }
01008
01009
01010
01011
01012
01013 public String
getContextPath() {
01014
return rd.
getContextPath();
01015 }
01016
01017
01018
01019
01020
01021 public boolean isUserInRole(String role) {
01022
return false;
01023 }
01024
01025
01026
01027
01028
01029 public Principal
getUserPrincipal() {
01030
return null;
01031 }
01032
01033
01034
01035
01036
01037
01038 public Locale
getLocale() {
01039 Locale locale = null;
01040 String accept = getHeader(
"Accept-Language");
01041
if (accept != null) {
01042
int idx = accept.indexOf(
',');
01043
if (idx > 0) {
01044 accept = accept.substring(0, idx).trim();
01045 }
01046 locale =
makeLocale(accept);
01047 }
else {
01048 locale = Locale.getDefault();
01049 }
01050
return locale;
01051 }
01052
01053 final Locale
makeLocale(String s) {
01054
int idx = s.indexOf(
';');
01055
if (idx > 0) {
01056 s = s.substring(0, idx).trim();
01057 }
01058 idx = s.indexOf(
'-');
01059 String lang = null;
01060 String country =
"";
01061
if (idx > 0) {
01062 lang = s.substring(0, idx);
01063 country = s.substring(idx+1);
01064 }
else {
01065 lang = s;
01066 }
01067
return new Locale(lang, country);
01068 }
01069
01070 final float getLangQual(String s) {
01071
float q = 1.0f;
01072
int idx = s.indexOf(
';');
01073
if (idx > 0) {
01074 s = s.substring(idx+1).trim();
01075 idx = s.indexOf(
"q=");
01076
if (idx >= 0) {
01077 q =Float.parseFloat(s.substring(idx+2));
01078 }
01079 }
01080
return q;
01081 }
01082
01083 final int compareAccept(String a, String b) {
01084
float aq = getLangQual(a);
01085
float bq = getLangQual(b);
01086
if (aq < bq)
return -1;
01087
if (aq > bq)
return 1;
01088
return 0;
01089 }
01090
01091 public Enumeration
getLocales() {
01092 String accept = getHeader(
"Accept-Language");
01093
if (accept == null) {
01094 Vector v =
new Vector();
01095 v.addElement(Locale.getDefault());
01096
return v.elements();
01097 }
01098 Vector v =
Util.split(accept,
',');
01099 Comparator c =
new Comparator() {
01100
public int compare(Object a, Object b) {
01101
return compareAccept(a.toString(), b.toString());
01102 }
01103 };
01104 Collections.sort(v, c);
01105
final Enumeration e = v.elements();
01106
return new Enumeration() {
01107
public boolean hasMoreElements() {
01108
return e.hasMoreElements();
01109 }
01110
public Object nextElement() {
01111
return makeLocale(e.nextElement().toString());
01112 }
01113 };
01114 }
01115
01116 public RequestDispatcher
getRequestDispatcher(String path) {
01117
return rd.
getContext().
getRelativeRequestDispatcher(path,
this);
01118 }
01119
01120 public boolean isSecure() {
01121
return false;
01122 }
01123
01124 final void setRequestDispatcher(
HttpDispatcher rd) {
01125
this.rd = rd;
01126 }
01127
01128 }