Skip to content

Commit c0eedc7

Browse files
committed
fix(server): check if response is closed before replying to client
Signed-off-by: Trumeet <[email protected]>
1 parent e3446b0 commit c0eedc7

File tree

1 file changed

+75
-45
lines changed

1 file changed

+75
-45
lines changed

server/src/main/java/moe/yuuta/server/api/ApiHandlerImpl.java

Lines changed: 75 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.util.stream.Collectors;
1212

1313
import io.vertx.core.Vertx;
14+
import io.vertx.core.http.HttpServerResponse;
1415
import io.vertx.core.logging.Logger;
1516
import io.vertx.core.logging.LoggerFactory;
1617
import io.vertx.ext.web.RoutingContext;
@@ -65,10 +66,12 @@ public class ApiHandlerImpl implements ApiHandler {
6566

6667
@Override
6768
public void handleFrameworkIndex(RoutingContext routingContext) {
68-
routingContext.response()
69-
.putHeader("Content-Type", "text/html")
70-
.setStatusCode(200)
71-
.end(HTML_FRAMEWORK_INDEX);
69+
HttpServerResponse response = routingContext.response();
70+
if (!response.ended() && !response.closed()) {
71+
response.putHeader("Content-Type", "text/html")
72+
.setStatusCode(200)
73+
.end(HTML_FRAMEWORK_INDEX);
74+
}
7275
}
7376

7477
@Override
@@ -78,13 +81,19 @@ public void handlePush(RoutingContext routingContext) {
7881
try {
7982
request = ApiUtils.jsonToObject(buffer.toString(), PushRequest.class);
8083
} catch (IOException e) {
81-
routingContext.response().setStatusCode(400).end();
84+
HttpServerResponse response = routingContext.response();
85+
if (!response.ended() && !response.closed()) {
86+
response.setStatusCode(400).end();
87+
}
8288
return;
8389
}
8490
if ((request.getExtras() != null && request.getExtras().size() > 10) ||
8591
!DataVerifier.verify(request) ||
8692
routingContext.request().getHeader(Constants.HEADER_PRODUCT) == null) {
87-
routingContext.response().setStatusCode(400).end();
93+
HttpServerResponse response = routingContext.response();
94+
if (!response.ended() && !response.closed()) {
95+
response.setStatusCode(400).end();
96+
}
8897
return;
8998
}
9099
Message message = new Message();
@@ -157,15 +166,19 @@ public void handlePush(RoutingContext routingContext) {
157166
ar -> {
158167
if (ar.succeeded()) {
159168
SendMessageResponse response = ar.result().body();
160-
routingContext.response()
161-
.setStatusCode(response.getCode() == SendMessageResponse.CODE_SUCCESS ?
162-
NO_CONTENT.code() : 500)
163-
.end();
169+
HttpServerResponse httpResponse = routingContext.response();
170+
if (!httpResponse.ended() && !httpResponse.closed()) {
171+
httpResponse.setStatusCode(response.getCode() == SendMessageResponse.CODE_SUCCESS ?
172+
NO_CONTENT.code() : 500)
173+
.end();
174+
}
164175
} else {
165176
logger.error("Cannot send message", ar.cause());
166-
routingContext.response()
167-
.setStatusCode(500)
168-
.end();
177+
HttpServerResponse response = routingContext.response();
178+
if (!response.ended() && !response.closed()) {
179+
response.setStatusCode(500)
180+
.end();
181+
}
169182
}
170183
});
171184
});
@@ -178,17 +191,22 @@ public MiPushApi getMiPushApi () {
178191

179192
@Override
180193
public void handleTesterIndex(RoutingContext routingContext) {
181-
routingContext.response()
182-
.putHeader("Content-Type", "text/html")
183-
.setStatusCode(200)
184-
.end(HTML_TESTER_INDEX);
194+
HttpServerResponse response = routingContext.response();
195+
if (!response.ended() && !response.closed()) {
196+
response.putHeader("Content-Type", "text/html")
197+
.setStatusCode(200)
198+
.end(HTML_TESTER_INDEX);
199+
}
185200
}
186201

187202
@Override
188203
public void handleUpdate(RoutingContext routingContext) {
189204
final String productId = routingContext.request().getHeader(Constants.HEADER_PRODUCT);
190205
if (productId == null) {
191-
routingContext.response().setStatusCode(NO_CONTENT.code()).end();
206+
HttpServerResponse response = routingContext.response();
207+
if (!response.ended() && !response.closed()) {
208+
response.setStatusCode(NO_CONTENT.code()).end();
209+
}
192210
return;
193211
}
194212
String repo;
@@ -205,7 +223,10 @@ public void handleUpdate(RoutingContext routingContext) {
205223
break;
206224
default:
207225
logger.warn("An unknown client is attempting to get update status: " + productId);
208-
routingContext.response().setStatusCode(NO_CONTENT.code()).end();
226+
HttpServerResponse response = routingContext.response();
227+
if (!response.ended() && !response.closed()) {
228+
response.setStatusCode(NO_CONTENT.code()).end();
229+
}
209230
return;
210231
}
211232
getGitHubApi().getLatestRelease(owner, repo, ar -> {
@@ -216,7 +237,10 @@ public void handleUpdate(RoutingContext routingContext) {
216237
|| release.getTagName() == null
217238
|| release.getName().trim().equals("")
218239
|| release.getTagName().trim().equals("")) {
219-
routingContext.response().setStatusCode(NO_CONTENT.code()).end();
240+
HttpServerResponse response = routingContext.response();
241+
if (!response.ended() && !response.closed()) {
242+
response.setStatusCode(NO_CONTENT.code()).end();
243+
}
220244
} else {
221245
Update update = new Update();
222246
update.setHtmlLink(release.getHtmlUrl());
@@ -226,18 +250,22 @@ public void handleUpdate(RoutingContext routingContext) {
226250
update.setVersionCode(Integer.MAX_VALUE);
227251
}
228252
update.setVersionName(release.getName());
229-
routingContext.response()
230-
.putHeader("Content-Type", "application/json")
231-
.setChunked(true)
232-
.setStatusCode(200)
233-
.end(ApiUtils.tryObjectToJson(update));
253+
HttpServerResponse response = routingContext.response();
254+
if (!response.ended() && !response.closed()) {
255+
response.putHeader("Content-Type", "application/json")
256+
.setChunked(true)
257+
.setStatusCode(200)
258+
.end(ApiUtils.tryObjectToJson(update));
259+
}
234260
}
235261
} else {
236262
logger.error("Unable to get update", ar.cause());
237-
routingContext.response()
238-
.setChunked(true)
239-
.setStatusCode(500)
240-
.end();
263+
HttpServerResponse response = routingContext.response();
264+
if (!response.ended() && !response.closed()) {
265+
response.setChunked(true)
266+
.setStatusCode(500)
267+
.end();
268+
}
241269
}
242270
});
243271
}
@@ -249,21 +277,23 @@ public GitHubApi getGitHubApi() {
249277

250278
@Override
251279
public void handleGetTopicList(RoutingContext routingContext) {
252-
routingContext.response()
253-
.setChunked(true)
254-
.setStatusCode(200)
255-
.putHeader("Content-Type", "application/json")
256-
.end(ApiUtils.tryObjectToJson(TopicRegistry
257-
.getInstance()
258-
.allTopics()
259-
.stream()
260-
.peek(topic -> {
261-
topic.setTitle(Resources.getString(topic.getTitleResource(),
262-
routingContext));
263-
topic.setDescription(Resources.getString(topic.getDescriptionResource(),
264-
routingContext));
265-
})
266-
.collect(Collectors.toList())
267-
));
280+
HttpServerResponse response = routingContext.response();
281+
if (!response.ended() && !response.closed()) {
282+
response.setChunked(true)
283+
.setStatusCode(200)
284+
.putHeader("Content-Type", "application/json")
285+
.end(ApiUtils.tryObjectToJson(TopicRegistry
286+
.getInstance()
287+
.allTopics()
288+
.stream()
289+
.peek(topic -> {
290+
topic.setTitle(Resources.getString(topic.getTitleResource(),
291+
routingContext));
292+
topic.setDescription(Resources.getString(topic.getDescriptionResource(),
293+
routingContext));
294+
})
295+
.collect(Collectors.toList())
296+
));
297+
}
268298
}
269299
}

0 commit comments

Comments
 (0)