Skip to content

Commit 336b081

Browse files
committed
modernize to lambdas
fix bug in sendbody where chunked output never ended.
1 parent d0175e0 commit 336b081

File tree

1 file changed

+41
-62
lines changed

1 file changed

+41
-62
lines changed

AndroidAsync/src/com/koushikdutta/async/http/server/AsyncHttpServerResponseImpl.java

Lines changed: 41 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -113,40 +113,34 @@ void initFirstWrite() {
113113
String statusLine = String.format(Locale.ENGLISH, "%s %s %s", httpVersion, code, AsyncHttpServer.getResponseCodeDescription(code));
114114
String rh = mRawHeaders.toPrefixString(statusLine);
115115

116-
Util.writeAll(mSocket, rh.getBytes(), new CompletedCallback() {
117-
@Override
118-
public void onCompleted(Exception ex) {
119-
if (ex != null) {
120-
report(ex);
121-
return;
122-
}
123-
if (isChunked) {
124-
ChunkedOutputFilter chunked = new ChunkedOutputFilter(mSocket);
125-
chunked.setMaxBuffer(0);
126-
mSink = chunked;
127-
}
128-
else {
129-
mSink = mSocket;
130-
}
131-
132-
mSink.setClosedCallback(closedCallback);
133-
closedCallback = null;
134-
mSink.setWriteableCallback(writable);
135-
writable = null;
136-
if (ended) {
137-
// the response ended while headers were written
138-
end();
139-
return;
140-
}
141-
getServer().post(new Runnable() {
142-
@Override
143-
public void run() {
144-
WritableCallback wb = getWriteableCallback();
145-
if (wb != null)
146-
wb.onWriteable();
147-
}
148-
});
116+
Util.writeAll(mSocket, rh.getBytes(), ex -> {
117+
if (ex != null) {
118+
report(ex);
119+
return;
120+
}
121+
if (isChunked) {
122+
ChunkedOutputFilter chunked = new ChunkedOutputFilter(mSocket);
123+
chunked.setMaxBuffer(0);
124+
mSink = chunked;
125+
}
126+
else {
127+
mSink = mSocket;
128+
}
129+
130+
mSink.setClosedCallback(closedCallback);
131+
closedCallback = null;
132+
mSink.setWriteableCallback(writable);
133+
writable = null;
134+
if (ended) {
135+
// the response ended while headers were written
136+
end();
137+
return;
149138
}
139+
getServer().post(() -> {
140+
WritableCallback wb = getWriteableCallback();
141+
if (wb != null)
142+
wb.onWriteable();
143+
});
150144
});
151145
}
152146

@@ -183,9 +177,8 @@ public void end() {
183177
mRawHeaders.remove("Transfer-Encoding");
184178
}
185179
if (mSink instanceof ChunkedOutputFilter) {
186-
((ChunkedOutputFilter)mSink).setMaxBuffer(Integer.MAX_VALUE);
187-
mSink.write(new ByteBufferList());
188-
onEnd();
180+
// this filter won't close the socket underneath.
181+
mSink.end();
189182
}
190183
else if (!headWritten) {
191184
if (!mRequest.getMethod().equalsIgnoreCase(AsyncHttpHead.METHOD))
@@ -218,7 +211,7 @@ public void send(final String contentType, final byte[] bytes) {
218211
@Override
219212
public <T> void sendBody(AsyncParser<T> body, T value) {
220213
mRawHeaders.set("Content-Type", body.getMime());
221-
body.write(this, value, ex -> onEnd());
214+
body.write(this, value, ex -> end());
222215
}
223216

224217
@Override
@@ -234,12 +227,7 @@ public void send(String contentType, ByteBufferList bb) {
234227
if (contentType != null)
235228
mRawHeaders.set("Content-Type", contentType);
236229

237-
Util.writeAll(AsyncHttpServerResponseImpl.this, bb, new CompletedCallback() {
238-
@Override
239-
public void onCompleted(Exception ex) {
240-
onEnd();
241-
}
242-
});
230+
Util.writeAll(AsyncHttpServerResponseImpl.this, bb, ex -> onEnd());
243231
});
244232
}
245233

@@ -332,18 +320,12 @@ public void sendStream(final InputStream inputStream, long totalLength) {
332320
onEnd();
333321
return;
334322
}
335-
getServer().post(new Runnable() {
336-
@Override
337-
public void run() {
338-
Util.pump(inputStream, mContentLength, AsyncHttpServerResponseImpl.this, new CompletedCallback() {
339-
@Override
340-
public void onCompleted(Exception ex) {
341-
StreamUtility.closeQuietly(inputStream);
342-
onEnd();
343-
}
344-
});
345-
}
346-
});
323+
getServer().post(() ->
324+
Util.pump(inputStream, mContentLength, AsyncHttpServerResponseImpl.this,
325+
ex -> {
326+
StreamUtility.closeQuietly(inputStream);
327+
onEnd();
328+
}));
347329
}
348330
catch (Exception e) {
349331
code(500);
@@ -374,13 +356,10 @@ public void proxy(final AsyncHttpResponse remoteResponse) {
374356
getHeaders().addAll(remoteResponse.headers());
375357
// TODO: remove?
376358
remoteResponse.headers().set("Connection", "close");
377-
Util.pump(remoteResponse, this, new CompletedCallback() {
378-
@Override
379-
public void onCompleted(Exception ex) {
380-
remoteResponse.setEndCallback(new NullCompletedCallback());
381-
remoteResponse.setDataCallback(new DataCallback.NullDataCallback());
382-
end();
383-
}
359+
Util.pump(remoteResponse, this, ex -> {
360+
remoteResponse.setEndCallback(new NullCompletedCallback());
361+
remoteResponse.setDataCallback(new DataCallback.NullDataCallback());
362+
end();
384363
});
385364
}
386365

0 commit comments

Comments
 (0)