Skip to content

Commit af5e60a

Browse files
author
Adrian Cole
committed
issue square#364: spdy should set content-length when it is known.
1 parent 54d4fcd commit af5e60a

File tree

2 files changed

+47
-3
lines changed

2 files changed

+47
-3
lines changed

okhttp/src/main/java/com/squareup/okhttp/internal/http/SpdyTransport.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ public SpdyTransport(HttpEngine httpEngine, SpdyConnection spdyConnection) {
3737
}
3838

3939
@Override public OutputStream createRequestBody() throws IOException {
40+
long fixedContentLength = httpEngine.policy.getFixedContentLength();
41+
if (fixedContentLength != -1) {
42+
httpEngine.requestHeaders.setContentLength(fixedContentLength);
43+
}
4044
// TODO: if we aren't streaming up to the server, we should buffer the whole request
4145
writeRequestHeaders();
4246
return stream.getOutputStream();

okhttp/src/test/java/com/squareup/okhttp/internal/http/HttpOverSpdyTest.java

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@
5050
import org.junit.Before;
5151
import org.junit.Test;
5252

53+
import static org.junit.Assert.assertArrayEquals;
5354
import static org.junit.Assert.assertEquals;
55+
import static org.junit.Assert.assertNull;
5456
import static org.junit.Assert.assertTrue;
5557
import static org.junit.Assert.fail;
5658

@@ -115,19 +117,57 @@ public boolean verify(String hostname, SSLSession session) {
115117
assertEquals(-1, connection.getInputStream().read());
116118
}
117119

118-
@Test public void post() throws Exception {
120+
byte[] postBytes = "FGHIJ".getBytes(Util.UTF_8);
121+
122+
/** An output stream can be written to more than once, so we can't guess content length. */
123+
@Test public void noDefaultContentLengthOnPost() throws Exception {
124+
MockResponse response = new MockResponse().setBody("ABCDE");
125+
server.enqueue(response);
126+
server.play();
127+
128+
HttpURLConnection connection = client.open(server.getUrl("/foo"));
129+
connection.setDoOutput(true);
130+
connection.getOutputStream().write(postBytes);
131+
assertContent("ABCDE", connection, Integer.MAX_VALUE);
132+
133+
RecordedRequest request = server.takeRequest();
134+
assertEquals("POST /foo HTTP/1.1", request.getRequestLine());
135+
assertArrayEquals(postBytes, request.getBody());
136+
assertNull(request.getHeader("Content-Length"));
137+
}
138+
139+
@Test public void userSuppliedContentLengthHeader() throws Exception {
140+
MockResponse response = new MockResponse().setBody("ABCDE");
141+
server.enqueue(response);
142+
server.play();
143+
144+
HttpURLConnection connection = client.open(server.getUrl("/foo"));
145+
connection.setRequestProperty("Content-Length", String.valueOf(postBytes.length));
146+
connection.setDoOutput(true);
147+
connection.getOutputStream().write(postBytes);
148+
assertContent("ABCDE", connection, Integer.MAX_VALUE);
149+
150+
RecordedRequest request = server.takeRequest();
151+
assertEquals("POST /foo HTTP/1.1", request.getRequestLine());
152+
assertArrayEquals(postBytes, request.getBody());
153+
assertEquals(postBytes.length, Integer.parseInt(request.getHeader("Content-Length")));
154+
}
155+
156+
@Test public void setFixedLengthStreamingModeSetsContentLength() throws Exception {
119157
MockResponse response = new MockResponse().setBody("ABCDE");
120158
server.enqueue(response);
121159
server.play();
122160

123161
HttpURLConnection connection = client.open(server.getUrl("/foo"));
162+
connection.setFixedLengthStreamingMode(postBytes.length);
124163
connection.setDoOutput(true);
125-
connection.getOutputStream().write("FGHIJ".getBytes(Util.UTF_8));
164+
connection.getOutputStream().write(postBytes);
126165
assertContent("ABCDE", connection, Integer.MAX_VALUE);
127166

128167
RecordedRequest request = server.takeRequest();
129168
assertEquals("POST /foo HTTP/1.1", request.getRequestLine());
130-
assertEquals("FGHIJ", request.getUtf8Body());
169+
assertArrayEquals(postBytes, request.getBody());
170+
assertEquals(postBytes.length, Integer.parseInt(request.getHeader("Content-Length")));
131171
}
132172

133173
@Test public void spdyConnectionReuse() throws Exception {

0 commit comments

Comments
 (0)