1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
/*******************************************************************************
* Copyright (c) 2002-2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
*******************************************************************************/
package org.eclipse.wst.wsi.internal.core.profile.validator.impl.message;
import java.util.StringTokenizer;
import org.eclipse.wst.wsi.internal.core.WSIException;
import org.eclipse.wst.wsi.internal.core.analyzer.AssertionFailException;
import org.eclipse.wst.wsi.internal.core.log.MessageEntry;
import org.eclipse.wst.wsi.internal.core.profile.TestAssertion;
import org.eclipse.wst.wsi.internal.core.profile.validator.EntryContext;
import org.eclipse.wst.wsi.internal.core.profile.validator.MessageValidator;
import org.eclipse.wst.wsi.internal.core.profile.validator.impl.AssertionProcess;
import org.eclipse.wst.wsi.internal.core.profile.validator.impl.BaseMessageValidator;
import org.eclipse.wst.wsi.internal.core.report.AssertionResult;
/**
* BP1002.
* If it is a request, the arg #2 of POST is <HTTP/1.1> or <HTTP/1.0>. If absent, first line
* of the body is: HTTP-Version = HTTP/1.1. (or HTTP/1.0). If it is a response, it starts with
* <HTTP/1.1> or <HTTP/1.0> or higher;
*/
public class BP1002 extends AssertionProcess
{
private final BaseMessageValidator validator;
/**
* @param BaseMessageValidator
*/
public BP1002(BaseMessageValidator impl)
{
super(impl);
this.validator = impl;
}
public AssertionResult validate(
TestAssertion testAssertion,
EntryContext entryContext)
throws WSIException
{
String httpHeader = entryContext.getMessageEntry().getHTTPHeaders();
// If this is a request message, then check POST for 1.1 or 1.0
if (entryContext
.getMessageEntry()
.getType()
.equalsIgnoreCase(MessageEntry.TYPE_REQUEST))
{
// Get each entry in the post header
StringTokenizer postMessage = new StringTokenizer(httpHeader, " \r\n");
// If there is no third token, then fail
if (postMessage.countTokens() < 3)
{
result = AssertionResult.RESULT_FAILED;
failureDetail = this.validator.createFailureDetail(httpHeader, entryContext);
}
else
{
// Get the 3rd token (there must be a better way to do this?)
String httpVersion = "";
String messageType = "";
for (int i = 0; i < 3; i++)
{
// Message type
if (i == 0)
messageType = postMessage.nextToken();
else if (i == 2)
httpVersion = postMessage.nextToken();
else
postMessage.nextToken();
}
if (!messageType.equals("POST"))
{
result = AssertionResult.RESULT_NOT_APPLICABLE;
}
// If the third token is not HTTP/1.1 ot HTTP/1.0, then fail
else if (
(!httpVersion.equalsIgnoreCase(MessageValidator.HTTP_VERSION_1_1))
&& (!httpVersion.equalsIgnoreCase(MessageValidator.HTTP_VERSION_1_0)))
{
result = AssertionResult.RESULT_FAILED;
failureDetail = this.validator.createFailureDetail(httpHeader, entryContext);
}
}
}
// Else it is a response message
else
{
// Response-Line (1st) = HTTP-Version SP Response-code SP Response-text CRLF
StringTokenizer httpMessageTokenizer =
new StringTokenizer(httpHeader, "\n\r\f");
String startLine = null;
try
{
if (httpMessageTokenizer.hasMoreTokens())
{
startLine = httpMessageTokenizer.nextToken();
}
else
{
// HTTP version info expected but not found
// (state the fact in the exception message?)
throw new AssertionFailException(httpHeader);
}
// check that protocol version indicates HTTP/1.0 or HTTP/1.1
if (!startLine.startsWith(MessageValidator.HTTP_VERSION_1_1)
&& !startLine.startsWith(MessageValidator.HTTP_VERSION_1_0))
{
throw new AssertionFailException(httpHeader);
}
}
catch (AssertionFailException e)
{
result = AssertionResult.RESULT_FAILED;
failureDetail = this.validator.createFailureDetail(e.getMessage(), entryContext);
}
}
// Return assertion result
return validator.createAssertionResult(testAssertion, result, failureDetail);
}
}
|