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 package org.apache.http.impl.conn;
29
30 import java.io.IOException;
31
32 import org.apache.commons.logging.Log;
33 import org.apache.commons.logging.LogFactory;
34 import org.apache.http.HttpException;
35 import org.apache.http.HttpResponse;
36 import org.apache.http.HttpResponseFactory;
37 import org.apache.http.NoHttpResponseException;
38 import org.apache.http.ProtocolException;
39 import org.apache.http.StatusLine;
40 import org.apache.http.annotation.ThreadSafe;
41 import org.apache.http.config.MessageConstraints;
42 import org.apache.http.impl.DefaultHttpResponseFactory;
43 import org.apache.http.impl.io.AbstractMessageParser;
44 import org.apache.http.io.SessionInputBuffer;
45 import org.apache.http.message.BasicLineParser;
46 import org.apache.http.message.LineParser;
47 import org.apache.http.message.ParserCursor;
48 import org.apache.http.params.HttpParams;
49 import org.apache.http.util.Args;
50 import org.apache.http.util.CharArrayBuffer;
51
52
53
54
55
56
57
58 @SuppressWarnings("deprecation")
59 @ThreadSafe
60 public class DefaultHttpResponseParser extends AbstractMessageParser<HttpResponse> {
61
62 private final Log log = LogFactory.getLog(getClass());
63
64 private final HttpResponseFactory responseFactory;
65 private final CharArrayBuffer lineBuf;
66
67
68
69
70
71 @Deprecated
72 public DefaultHttpResponseParser(
73 final SessionInputBuffer buffer,
74 final LineParser parser,
75 final HttpResponseFactory responseFactory,
76 final HttpParams params) {
77 super(buffer, parser, params);
78 Args.notNull(responseFactory, "Response factory");
79 this.responseFactory = responseFactory;
80 this.lineBuf = new CharArrayBuffer(128);
81 }
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96 public DefaultHttpResponseParser(
97 final SessionInputBuffer buffer,
98 final LineParser lineParser,
99 final HttpResponseFactory responseFactory,
100 final MessageConstraints constraints) {
101 super(buffer, lineParser, constraints);
102 this.responseFactory = responseFactory != null ? responseFactory :
103 DefaultHttpResponseFactory.INSTANCE;
104 this.lineBuf = new CharArrayBuffer(128);
105 }
106
107
108
109
110
111
112
113
114
115
116 public DefaultHttpResponseParser(
117 final SessionInputBuffer buffer, final MessageConstraints constraints) {
118 this(buffer, null, null, constraints);
119 }
120
121
122
123
124
125
126
127
128 public DefaultHttpResponseParser(final SessionInputBuffer buffer) {
129 this(buffer, null, null, MessageConstraints.DEFAULT);
130 }
131
132 @Override
133 protected HttpResponse parseHead(
134 final SessionInputBuffer sessionBuffer) throws IOException, HttpException {
135
136 int count = 0;
137 ParserCursor cursor = null;
138 do {
139
140 this.lineBuf.clear();
141 final int i = sessionBuffer.readLine(this.lineBuf);
142 if (i == -1 && count == 0) {
143
144 throw new NoHttpResponseException("The target server failed to respond");
145 }
146 cursor = new ParserCursor(0, this.lineBuf.length());
147 if (lineParser.hasProtocolVersion(this.lineBuf, cursor)) {
148
149 break;
150 } else if (i == -1 || reject(this.lineBuf, count)) {
151
152 throw new ProtocolException("The server failed to respond with a " +
153 "valid HTTP response");
154 }
155 if (this.log.isDebugEnabled()) {
156 this.log.debug("Garbage in response: " + this.lineBuf.toString());
157 }
158 count++;
159 } while(true);
160
161 final StatusLine statusline = lineParser.parseStatusLine(this.lineBuf, cursor);
162 return this.responseFactory.newHttpResponse(statusline, null);
163 }
164
165 protected boolean reject(final CharArrayBuffer line, final int count) {
166 return false;
167 }
168
169 }