/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.sun.jini.jeri.internal.http; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.StringTokenizer; /** * Class representing first line of an HTTP message. * * @author Sun Microsystems, Inc. * */ class StartLine { /** major version number */ final int major; /** minor version number */ final int minor; /** request or response line? */ final boolean isRequest; /** request method */ final String method; /** request URI */ final String uri; /** response status code */ final int status; /** response status reason */ final String reason; /** * Creates start line for HTTP request message. */ StartLine(int major, int minor, String method, String uri) { this.major = major; this.minor = minor; this.method = method; this.uri = uri; status = -1; reason = null; isRequest = true; } /** * Creates start line for HTTP response message. */ StartLine(int major, int minor, int status, String reason) { this.major = major; this.minor = minor; this.status = status; this.reason = reason; method = null; uri = null; isRequest = false; } /** * Reads start line from given input stream. */ StartLine(InputStream in) throws IOException { String line = MessageReader.readLine(in); if (line == null) { throw new HttpParseException("unexpected EOF in start line"); } try { StringTokenizer tok = new StringTokenizer(line, "", true); if (line.startsWith("HTTP")) { if (!tok.nextToken("/").equals("HTTP")) { throw new HttpParseException(); } tok.nextToken(); major = Integer.parseInt(tok.nextToken(".")); tok.nextToken(); minor = Integer.parseInt(tok.nextToken(" ")); tok.nextToken(); status = Integer.parseInt(tok.nextToken()); tok.nextToken(); reason = tok.nextToken("\n"); method = null; uri = null; isRequest = false; } else { method = tok.nextToken(" "); tok.nextToken(); uri = tok.nextToken(); tok.nextToken(); if (!tok.nextToken("/").equals("HTTP")) { throw new HttpParseException(); } tok.nextToken(); major = Integer.parseInt(tok.nextToken(".")); tok.nextToken(); minor = Integer.parseInt(tok.nextToken("\n")); status = -1; reason = null; isRequest = true; } } catch (Exception ex) { throw (HttpParseException) new HttpParseException("invalid start line").initCause(ex); } } /** * Writes start line to given output stream. */ void write(OutputStream out) throws IOException { String version = "HTTP/" + major + "." + minor; MessageWriter.writeLine(out, isRequest ? method + " " + uri + " " + version : version + " " + status + " " + reason); } /** * Compares two sets of major/minor version numbers. Returns -1 if * major1/minor1 is less than major2/minor2, 1 if major1/minor1 is more * than major2/minor2, and 0 if the two pairs are equal. */ static int compareVersions(int major1, int minor1, int major2, int minor2) { if (major1 != major2) { return (major1 > major2) ? 1 : -1; } else if (minor1 != minor2) { return (minor1 > minor2) ? 1 : -1; } else { return 0; } } }