/*
* ====================================================================
* Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://svnkit.com/license.html
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
* ====================================================================
*/
package org.tmatesoft.svn.core.internal.io.dav.http;
import java.text.ParseException;
import org.tmatesoft.svn.core.SVNErrorMessage;
/**
* @version 1.3
* @author TMate Software Ltd.
*/
public class HTTPStatus {
private String myStatusLine;
private String myVersion;
private int myCode;
private String myReason;
private HTTPHeader myHeader;
private SVNErrorMessage myError;
public static boolean isHTTPStatusLine(String statusLine) {
try {
HTTPStatus status = createHTTPStatus(statusLine);
return status != null;
} catch (ParseException pe) {
}
return false;
}
public static HTTPStatus createHTTPStatus(String statusLine) throws ParseException {
int length = statusLine.length();
int at = 0;
int start = 0;
String reason = null;
String version = null;
int code = -1;
try {
while (Character.isWhitespace(statusLine.charAt(at))) {
++at;
++start;
}
if (!"HTTP".equals(statusLine.substring(at, at += 4))) {
throw new ParseException("Status-Line '" + statusLine + "' does not start with HTTP", 0);
}
//handle the HTTP-Version
while (!Character.isWhitespace(statusLine.charAt(at)) && at < statusLine.length()) {
at++;
}
if (at == statusLine.length()) {
throw new ParseException("Unable to parse HTTP-Version from the status line: '" + statusLine + "'", 0);
}
version = (statusLine.substring(start, at)).toUpperCase();
//advance through spaces
while (Character.isWhitespace(statusLine.charAt(at)) && at < statusLine.length()) {
at++;
}
if (at == statusLine.length()) {
throw new ParseException("Status-Line '" + statusLine + "' is not valid", 0);
}
//handle the Status-Code
int to = at;
while(!Character.isWhitespace(statusLine.charAt(to)) && to < statusLine.length()) {
to++;
}
try {
code = Integer.parseInt(statusLine.substring(at, to));
} catch (NumberFormatException e) {
throw new ParseException("Unable to parse status code from status line: '" + statusLine + "'", 0);
}
//handle the Reason-Phrase
at = to + 1;
if (at < length) {
reason = statusLine.substring(at).trim();
} else {
reason = "";
}
} catch (StringIndexOutOfBoundsException e) {
throw new ParseException("Status-Line '" + statusLine + "' is not valid", 0);
}
return new HTTPStatus(version, reason, code, statusLine);
}
private HTTPStatus(String version, String reason, int code, String statusLine) {
myVersion = version;
myStatusLine = statusLine;
myReason = reason;
myCode = code;
}
public String getReason() {
return myReason;
}
public int getCode() {
return myCode;
}
public int getCodeClass() {
return myCode / 100;
}
public String getStatusLine() {
return myStatusLine;
}
public String getVersion() {
return myVersion;
}
public boolean isHTTP11() {
return "HTTP/1.1".equals(myVersion);
}
public void setHeader(HTTPHeader header) {
myHeader = header;
}
public HTTPHeader getHeader() {
return myHeader;
}
public void setError(SVNErrorMessage error) {
myError = error;
}
public SVNErrorMessage getError() {
return myError;
}
}