1 /*
2 (C) Copyright IBM Corp. 2005, 2013
3
4 THIS FILE IS PROVIDED UNDER THE TERMS OF THE ECLIPSE PUBLIC LICENSE
5 ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE
6 CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT.
7
8 You can obtain a current copy of the Eclipse Public License from
9 http://www.opensource.org/licenses/eclipse-1.0.php
10
11 @author : Roberto Pineiro, IBM, roberto.pineiro@us.ibm.com
12 * @author : Chung-hao Tan, IBM, chungtan@us.ibm.com
13 *
14 *
15 * Change History
16 * Flag Date Prog Description
17 *-------------------------------------------------------------------------------
18 * 12917 2004-11-11 thschaef HTTP Header parsing does not work for UNIX line delimitor
19 * 1535756 2006-08-07 lupusalex Make code warning free
20 * 1565892 2006-11-28 lupusalex Make SBLIM client JSR48 compliant
21 * 2003590 2008-06-30 blaschke-oss Change licensing from CPL to EPL
22 * 2204488 2008-10-28 raman_arora Fix code to remove compiler warnings
23 * 2524131 2009-01-21 raman_arora Upgrade client to JDK 1.5 (Phase 1)
24 * 2750520 2009-04-10 blaschke-oss Code cleanup from empty statement et al
25 * 3557283 2012-11-05 blaschke-oss Print full response when get EOF from CIMOM
26 * 2709 2013-11-13 blaschke-oss Lower the level of the EOF message to FINE
27 */
28
29 package org.metricshub.wbem.sblim.cimclient.internal.http;
30
31 /*-
32 * ╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲
33 * WBEM Java Client
34 * ჻჻჻჻჻჻
35 * Copyright 2023 - 2025 MetricsHub
36 * ჻჻჻჻჻჻
37 * Licensed under the Apache License, Version 2.0 (the "License");
38 * you may not use this file except in compliance with the License.
39 * You may obtain a copy of the License at
40 *
41 * http://www.apache.org/licenses/LICENSE-2.0
42 *
43 * Unless required by applicable law or agreed to in writing, software
44 * distributed under the License is distributed on an "AS IS" BASIS,
45 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
46 * See the License for the specific language governing permissions and
47 * limitations under the License.
48 * ╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱
49 */
50
51 import java.io.IOException;
52 import java.io.InputStream;
53 import java.util.logging.Level;
54 import org.metricshub.wbem.sblim.cimclient.internal.logging.LogAndTraceBroker;
55
56 /**
57 * Class HttpMethod provides a method to read a line from a given input stream
58 *
59 */
60 public abstract class HttpMethod {
61
62 /**
63 * Reads a line from a given input stream
64 *
65 * @param pStream
66 * The input stream
67 * @return The line
68 * @throws IOException
69 */
70 public static String readLine(InputStream pStream) throws IOException {
71 if (pStream == null) return null;
72
73 char buffer[] = new char[16];
74 int used = 0;
75 int prevChar;
76 boolean flag = true;
77
78 for (; (prevChar = pStream.read()) >= 0; buffer[used++] = (char) prevChar) {
79 flag = false;
80
81 // @12917 - thschaef
82 // see http://www.w3.org/Protocols/HTTP/AsImplemented.html for
83 // details
84 // Lines shall be delimited by an optional carriage return followed
85 // by a mandatory line feed character.
86 // The client should not assume that the carriage return will be
87 // present. Lines may be of any length.
88 // Well-behaved servers should restrict line length to 80 characters
89 // excluding the CR LF pair.
90
91 // if (prevChar == 13) continue;
92 if (prevChar == 10) break;
93
94 if (used >= buffer.length) {
95 char tmp[] = new char[buffer.length << 1];
96 System.arraycopy(buffer, 0, tmp, 0, used);
97 buffer = tmp;
98 }
99 }
100 if (flag) {
101 LogAndTraceBroker
102 .getBroker()
103 .trace(
104 Level.FINE,
105 "Unexpected EOF trying to read line from input stream - CIMOM closed its end of socket, check it for connection issues"
106 );
107 throw new IOException("Unexpected EOF");
108 }
109
110 for (; used > 0 && buffer[used - 1] <= ' '; used--) {
111 // back up over blanks and non-printables at end of line
112 }
113
114 return String.copyValueOf(buffer, 0, used);
115 }
116 }