Parsing Headers
一个HttpHeader类代表了一个HTTP的头部信息。这个类将在第四章讲解。现在,我们了解以下内容就足够:
你可以通过使用它的无参构造函数来创建一个HttpHeader实例。
一旦你有一个HttpHeader实例,你可以把它传递给SocketInputStream的readHeader方法。如果有头部信息可读的话,readHeader方法将相应地填充好HttpHeader对象。如果没有头部信息可读,HttpHeader实例的nameEnd和valueEnd字段都将为0。
获取头部信息的名字和值,使用下面的方法:
String name = new String (header.name, 0, header.nameEnd);
String value = new String(header.value, 0, header.valueEnd);
parseHeader方法包含一个while循环持续从SocketInputStream读取头部信息,直到读取完所有的头部信息。这个循环在创建一个HttpHeader实例,并把它传递给SocketInputStream类的readHeader后开始执行:
HttpHeader header = new HttpHeader();
// Read the next header
input.readHeader(header);
然后,你可以测试在输入流中是否有下一个头部信息可读。使用HttpHeader实例的nameEnd和valueEnd字段:
if (header.nameEnd == 0) {
if (header.valueEnd == 0) {
return;
} else {
throw new ServletException (sm.getString("httpProcessor.parseHeaders.colon"));
}
}
如果有下一个头部信息,这个头部信息的name和value可以被获取:
String name = new String(header.name, 0, header.nameEnd);
String value = new String(header.value, 0, header.valueEnd);
一旦你得到了头部name和value。你调用addHeader方法把它添加到HttpRequest对象中的头部信息HashMap中。
request.addHeader(name, value);
一些头部信息也需要设置一些属性。例如:当servlet调用javax.servlet.ServletRequest的getContentLength方法,content-length头部信息的值被返回,cookie头部信息包含cookies被添加到cookie集合中。下面是处理过程:
if (name.equals("cookie")) {
... // process cookies here
}
else if (name.equals("content-length")) {
int n = -1;
try {
n = Integer.parseInt (value);
}
catch (Exception e) {
throw new ServletException(sm.getString(
"httpProcessor.parseHeaders.contentLength"));
}
request.setContentLength(n);
}
else if (name.equals("content-type")) {
request.setContentType(value);
}
Parsing Cookies
Cookies被浏览器作为HTTP请求头部信息发送。这样的一个头部信息有一个name为“cookie”和value为cookie值的name/value键值对。下面有一个例子:
Cookie: userName=budi; password=pwd;
Cookie的解析是通过使用org.apache.catalina.util.RequestUtil类的parseCookieHeader方法完成的。这个方法接收cookie头部信息和返回一个javax.servlet.http.Cookie类型的数组。这个数组中元素的个数和cookie的name/value键值对的个数是相等的。
Listing 3.5: The org.apache.catalina.util.RequestUtil class's parseCookieHeader method
public static Cookie[] parseCookieHeader(String header) {
if ((header == null) || (header.length 0 < 1) )
return (new Cookie[0]);
ArrayList cookies = new ArrayList();
while (header.length() > 0) {
int semicolon = header.indexOf(';');
if (semicolon < 0)
semicolon = header.length();
if (semicolon == 0)
break;
String token = header.substring(0, semicolon); if (semicolon < header.length())
header = header.substring(semicolon + 1);
else
header = "";
try {
int equals = token.indexOf('=');
if (equals > 0) {
String name = token.substring(0, equals).trim();
String value = token.substring(equals+1).trim();
cookies.add(new Cookie(name, value));
}
}catch (Throwable e) {
;
}
}
return ((Cookie[]) cookies.toArray (new Cookie [cookies.size ()]));
}