in frontend/server/src/main/java/org/pytorch/serve/util/NettyUtils.java [144:201]
public static void sendHttpResponse(
ChannelHandlerContext ctx, FullHttpResponse resp, boolean keepAlive) {
// Send the response and close the connection if necessary.
Channel channel = ctx.channel();
Session session = channel.attr(SESSION_KEY).getAndSet(null);
HttpHeaders headers = resp.headers();
ConfigManager configManager = ConfigManager.getInstance();
if (session != null) {
// session might be recycled if channel is closed already.
session.setCode(resp.status().code());
headers.set(REQUEST_ID, session.getRequestId());
logger.info(session.toString());
}
int code = resp.status().code();
if (code >= 200 && code < 300) {
loggerTsMetrics.info("{}", REQUESTS_2_XX);
} else if (code >= 400 && code < 500) {
loggerTsMetrics.info("{}", REQUESTS_4_XX);
} else {
loggerTsMetrics.info("{}", REQUESTS_5_XX);
}
String allowedOrigin = configManager.getCorsAllowedOrigin();
String allowedMethods = configManager.getCorsAllowedMethods();
String allowedHeaders = configManager.getCorsAllowedHeaders();
if (allowedOrigin != null
&& !allowedOrigin.isEmpty()
&& !headers.contains(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN)) {
headers.set(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN, allowedOrigin);
}
if (allowedMethods != null
&& !allowedMethods.isEmpty()
&& !headers.contains(HttpHeaderNames.ACCESS_CONTROL_ALLOW_METHODS)) {
headers.set(HttpHeaderNames.ACCESS_CONTROL_ALLOW_METHODS, allowedMethods);
}
if (allowedHeaders != null
&& !allowedHeaders.isEmpty()
&& !headers.contains(HttpHeaderNames.ACCESS_CONTROL_ALLOW_HEADERS)) {
headers.set(HttpHeaderNames.ACCESS_CONTROL_ALLOW_HEADERS, allowedHeaders);
}
// Add cache-control headers to avoid browser cache response
headers.set("Pragma", "no-cache");
headers.set("Cache-Control", "no-cache; no-store, must-revalidate, private");
headers.set("Expires", "Thu, 01 Jan 1970 00:00:00 UTC");
HttpUtil.setContentLength(resp, resp.content().readableBytes());
if (!keepAlive || code >= 400) {
headers.set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE);
ChannelFuture f = channel.writeAndFlush(resp);
f.addListener(ChannelFutureListener.CLOSE);
} else {
headers.set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
channel.writeAndFlush(resp);
}
}