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 package org.apache.commons.httpclient;
32
33 /***
34 * <p>HTTP version, as specified in RFC 2616.</p>
35 * <p>
36 * HTTP uses a "<major>.<minor>" numbering scheme to indicate
37 * versions of the protocol. The protocol versioning policy is intended to
38 * allow the sender to indicate the format of a message and its capacity for
39 * understanding further HTTP communication, rather than the features
40 * obtained via that communication. No change is made to the version
41 * number for the addition of message components which do not affect
42 * communication behavior or which only add to extensible field values.
43 * The <minor> number is incremented when the changes made to the
44 * protocol add features which do not change the general message parsing
45 * algorithm, but which may add to the message semantics and imply
46 * additional capabilities of the sender. The <major> number is
47 * incremented when the format of a message within the protocol is
48 * changed. See RFC 2145 [36] for a fuller explanation.
49 * </p>
50 * <p>
51 * The version of an HTTP message is indicated by an HTTP-Version field
52 * in the first line of the message.
53 * </p>
54 * <pre>
55 * HTTP-Version = "HTTP" "/" 1*DIGIT "." 1*DIGIT
56 * </pre>
57 * <p>
58 * Note that the major and minor numbers MUST be treated as separate
59 * integers and that each MAY be incremented higher than a single digit.
60 * Thus, HTTP/2.4 is a lower version than HTTP/2.13, which in turn is
61 * lower than HTTP/12.3. Leading zeros MUST be ignored by recipients and
62 * MUST NOT be sent.
63 * </p>
64 *
65 * @author <a href="mailto:oleg@ural.ru">Oleg Kalnichevski</a>
66 *
67 * @version $Revision$ $Date$
68 *
69 * @since 3.0
70 */
71 public class HttpVersion implements Comparable {
72
73 /*** Major version number of the HTTP protocol */
74 private int major = 0;
75
76 /*** Minor version number of the HTTP protocol */
77 private int minor = 0;
78
79 /*** HTTP protocol version 0.9 */
80 public static final HttpVersion HTTP_0_9 = new HttpVersion(0, 9);
81
82 /*** HTTP protocol version 1.0 */
83 public static final HttpVersion HTTP_1_0 = new HttpVersion(1, 0);
84
85 /*** HTTP protocol version 1.1 */
86 public static final HttpVersion HTTP_1_1 = new HttpVersion(1, 1);
87
88 /***
89 * Create an HTTP protocol version designator.
90 *
91 * @param major the major version number of the HTTP protocol
92 * @param minor the minor version number of the HTTP protocol
93 *
94 * @throws IllegalArgumentException if either major or minor version number is negative
95 */
96 public HttpVersion(int major, int minor) {
97 if (major < 0) {
98 throw new IllegalArgumentException("HTTP major version number may not be negative");
99 }
100 this.major = major;
101 if (minor < 0) {
102 throw new IllegalArgumentException("HTTP minor version number may not be negative");
103 }
104 this.minor = minor;
105 }
106
107 /***
108 * Returns the major version number of the HTTP protocol.
109 *
110 * @return the major version number.
111 */
112 public int getMajor() {
113 return major;
114 }
115
116 /***
117 * Returns the minor version number of the HTTP protocol.
118 *
119 * @return the minor version number.
120 */
121 public int getMinor() {
122 return minor;
123 }
124
125 /***
126 * @see java.lang.Object#hashCode()
127 */
128 public int hashCode() {
129 return this.major * 100000 + this.minor;
130 }
131
132 /***
133 * @see java.lang.Object#equals(java.lang.Object)
134 */
135 public boolean equals(Object obj) {
136 if (this == obj) {
137 return true;
138 }
139 if (!(obj instanceof HttpVersion)) {
140 return false;
141 }
142 return equals((HttpVersion)obj);
143 }
144
145 /***
146 * Compares this HTTP protocol version with another one.
147 *
148 * @param anotherVer the version to be compared with.
149 *
150 * @return a negative integer, zero, or a positive integer as this version is less than,
151 * equal to, or greater than the specified version.
152 */
153 public int compareTo(HttpVersion anotherVer) {
154 if (anotherVer == null) {
155 throw new IllegalArgumentException("Version parameter may not be null");
156 }
157 int delta = getMajor() - anotherVer.getMajor();
158 if (delta == 0) {
159 delta = getMinor() - anotherVer.getMinor();
160 }
161 return delta;
162 }
163
164 /***
165 * @see java.lang.Comparable#compareTo(java.lang.Object)
166 */
167 public int compareTo(Object o) {
168 return compareTo((HttpVersion)o);
169 }
170
171 /***
172 * Test if the HTTP protocol version is equal to the given number.
173 *
174 * @return <tt>true</tt> if HTTP protocol version is given to the given number,
175 * <tt>false</tt> otherwise.
176 */
177 public boolean equals(HttpVersion version) {
178 return compareTo(version) == 0;
179 }
180
181 /***
182 * Test if the HTTP protocol version is greater or equal to the given number.
183 *
184 * @return <tt>true</tt> if HTTP protocol version is greater or equal given to the
185 * given number, <tt>false</tt> otherwise.
186 */
187 public boolean greaterEquals(HttpVersion version) {
188 return compareTo(version) >= 0;
189 }
190
191 /***
192 * Test if the HTTP protocol version is less or equal to the given number.
193 *
194 * @return <tt>true</tt> if HTTP protocol version is less or equal to given to the
195 * given number, <tt>false</tt> otherwise.
196 */
197 public boolean lessEquals(HttpVersion version) {
198 return compareTo(version) <= 0;
199 }
200
201 /***
202 * @see java.lang.Object#toString()
203 */
204 public String toString() {
205 StringBuffer buffer = new StringBuffer();
206 buffer.append("HTTP/");
207 buffer.append(this.major);
208 buffer.append('.');
209 buffer.append(this.minor);
210 return buffer.toString();
211 }
212
213 /***
214 * Parses the textual representation of the given HTTP protocol version.
215 *
216 * @return HTTP protocol version.
217 *
218 * @throws ProtocolException if the string is not a valid HTTP protocol version.
219 */
220 public static HttpVersion parse(final String s) throws ProtocolException {
221 if (s == null) {
222 throw new IllegalArgumentException("String may not be null");
223 }
224 if (!s.startsWith("HTTP/")) {
225 throw new ProtocolException("Invalid HTTP version string: " + s);
226 }
227 int major, minor;
228
229 int i1 = "HTTP/".length();
230 int i2 = s.indexOf(".", i1);
231 if (i2 == -1) {
232 throw new ProtocolException("Invalid HTTP version number: " + s);
233 }
234 try {
235 major = Integer.parseInt(s.substring(i1, i2));
236 } catch (NumberFormatException e) {
237 throw new ProtocolException("Invalid HTTP major version number: " + s);
238 }
239 i1 = i2 + 1;
240 i2 = s.length();
241 try {
242 minor = Integer.parseInt(s.substring(i1, i2));
243 } catch (NumberFormatException e) {
244 throw new ProtocolException("Invalid HTTP minor version number: " + s);
245 }
246 return new HttpVersion(major, minor);
247 }
248
249 }