blob: 1c7976f5add4e1323b2530f3e70bb3cc1d1edd80 [file] [log] [blame]
/*******************************************************************************
* 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.envelope;
import java.net.HttpURLConnection;
import java.util.StringTokenizer;
import java.util.Vector;
import org.eclipse.wst.wsi.internal.core.WSIConstants;
import org.eclipse.wst.wsi.internal.core.WSIException;
import org.eclipse.wst.wsi.internal.core.analyzer.AssertionFailException;
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.impl.AssertionProcess;
import org.eclipse.wst.wsi.internal.core.profile.validator.impl.BaseMessageValidator;
import org.eclipse.wst.wsi.internal.core.report.AssertionResult;
import org.eclipse.wst.wsi.internal.core.xml.XMLUtils;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
/**
* BP1305.
* It is in an HTTP 500 message with "Server" Error code.
*/
public class BP1305 extends AssertionProcess
{
private final BaseMessageValidator validator;
/**
* @param BaseMessageValidator
*/
public BP1305(BaseMessageValidator impl)
{
super(impl);
this.validator = impl;
}
public AssertionResult validate(
TestAssertion testAssertion,
EntryContext entryContext)
throws WSIException
{
Document doc;
// Check if this is one way response
// or message is mepty or invalid
if (this.validator.isOneWayResponse(entryContext)
|| (doc = entryContext.getMessageEntryDocument()) == null)
{
result = AssertionResult.RESULT_NOT_APPLICABLE;
}
else
{
// look for <soap:Fault> element:
NodeList faultList =
doc.getElementsByTagNameNS(
WSIConstants.NS_URI_SOAP,
XMLUtils.SOAP_ELEM_FAULT);
if ((faultList == null) || (faultList.getLength() == 0))
{
// Response does not contain a soap:fault
result = AssertionResult.RESULT_NOT_APPLICABLE;
}
else
{
// we have a soap:Fault. Check that it is contained in a HTTP 500 message
// GT : base HTTP Header parsing on BP1001 - this should be factored to a
// general-purpose HTTP message parsing method or methods (request & response)
String httpHeader = entryContext.getMessageEntry().getHTTPHeaders();
//Response-Line = HTTP-Version ResponseCode ResponseMsg SP CRLF
Vector responseLine = new Vector();
String startLine = null;
//String httpVersion = null;
//String responseCode = null;
String statusCode = null;
StringTokenizer httpMessageTokenizer =
new StringTokenizer(httpHeader, "\n\r\f");
if (httpMessageTokenizer.hasMoreTokens())
startLine = httpMessageTokenizer.nextToken();
if (startLine.startsWith("HTTP"))
{
StringTokenizer startLineTokenizer =
new StringTokenizer(startLine, "\u0020");
while (startLineTokenizer.hasMoreTokens())
{
responseLine.add(startLineTokenizer.nextToken());
}
//httpVersion = (String) responseLine.get(0);
// PB: Check for 500 status code which should be the second token in the string
statusCode = (String) responseLine.get(1);
//responseCode = (String) responseLine.get(1);
//statusCode = (String) responseLine.get(2);
}
try
{
// PB: Just check for 500 status code
if (!statusCode
.equals(String.valueOf(HttpURLConnection.HTTP_INTERNAL_ERROR)))
{
//if (!responseCode.equalsIgnoreCase("OK") ||
// (!statusCode.equalsIgnoreCase("ServerError"))) {
// Assertion failed
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);
}
}