class HttpResponseHelper {

private static final Logger logger = LoggerFactory.getLogger(HttpResponseHelper.class);

/**
 * sendResponse
 *
 * @param ctx
 * @param status
 */
public static void sendResponse(String requestId, ChannelHandlerContext ctx, HttpResponseStatus status) {
    sendResponse(requestId, ctx, status, "status: " + status.toString() + "\r\n");
    }

/**
 * sendResponse
 *
 * @param ctx
 * @param status
 * @param msg
 */
public static void sendResponse(String requestId, ChannelHandlerContext ctx, HttpResponseStatus status, String msg) {
    FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, status, Unpooled.copiedBuffer(msg, CharsetUtil.UTF_8));
    response.headers().set(CONTENT_TYPE, "text/plain; charset=UTF-8");
    response.headers().set(HttpHeaders.Names.CONTENT_LENGTH, response.content().readableBytes());
    response.headers().set(ACCESS_CONTROL_ALLOW_ORIGIN, "*");
    ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);

    removeChannelHandlerContext(requestId, ctx);
    }

/**
 * sendResponse（成功应答需要注意isKeepAlive和isCloseChannel的值）
 *
 * @param requestId
 * @param ctx
 * @param status
 * @param contentType
 * @param respBodyString
 * @param isKeepAlive
 * @param isCloseChannel
 */
public static void sendResponse(String requestId, ChannelHandlerContext ctx, HttpResponseStatus status, String contentType, String respBodyString, boolean isKeepAlive, boolean isCloseChannel) {
    FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, status, Unpooled.copiedBuffer(respBodyString, CharsetUtil.UTF_8));
    if (!StringUtil.isNullOrEmpty(contentType)) {
    response.headers().set(CONTENT_TYPE, contentType);
    } else {
    response.headers().set(CONTENT_TYPE, "text/plain; charset=UTF-8");
    }

    if (isKeepAlive) {
    response.headers().set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.KEEP_ALIVE);
    }

    response.headers().set(HttpHeaders.Names.CONTENT_LENGTH, response.content().readableBytes());
    response.headers().set(ACCESS_CONTROL_ALLOW_ORIGIN, "*");

    ChannelFuture future = ctx.channel().writeAndFlush(response);
    if (!isKeepAlive) {
    future.addListener(ChannelFutureListener.CLOSE);
    }

    removeChannelHandlerContext(requestId, ctx, isCloseChannel);
    }

/**
 * sendResponse
 *
 * @param ctx
 * @param statusCode
 * @param resultDesc
 */
public static void sendResponse(String requestId, ChannelHandlerContext ctx, int statusCode, String resultDesc) {
    HttpResponseStatus httpResponseStatus = new HttpResponseStatus(statusCode, resultDesc);
    FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, httpResponseStatus, Unpooled.copiedBuffer(resultDesc, CharsetUtil.UTF_8));
    response.headers().set(CONTENT_TYPE, "text/plain; charset=UTF-8");
    response.headers().set(HttpHeaders.Names.CONTENT_LENGTH, response.content().readableBytes());
    response.headers().set(ACCESS_CONTROL_ALLOW_ORIGIN, "*");
    ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);

    removeChannelHandlerContext(requestId, ctx);
    }

/**
 * 断点上传204应答
 *
 * @param ctx
 * @param contentRange
 */
public static void sendBrokenUpload204Resonse(String requestId, ChannelHandlerContext ctx, String contentRange, boolean isKeepAlive, boolean isCloseChannel) {
    FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, HttpResponseStatus.NO_CONTENT, Unpooled.copiedBuffer("", CharsetUtil.UTF_8));
    response.headers().set(ACCESS_CONTROL_ALLOW_ORIGIN, "*");
    response.headers().set(CONTENT_RANGE, contentRange);

    ChannelFuture future = ctx.channel().writeAndFlush(response);
    if (!isKeepAlive) {
    future.addListener(ChannelFutureListener.CLOSE);
    }

    removeChannelHandlerContext(requestId, ctx, isCloseChannel);
    }


public static String getMultipartUploadResponseBody(String remoteFileName, String fileUrl) throws Exception {

    return "{\"rc_url\":{\"path\":\"" + fileUrl + "\",\"type\":0}}";
}

/**
 * getContentType
 *
 * @param fileName
 * @return
 */

public static String getFileExt(String fileName) {
    int index = fileName.lastIndexOf(".");
    if (index == -1) {
        return "";
    }

    return fileName.substring(index + 1).toLowerCase();
}

public static String getContentType(String fileName) {
    String fileExtName = getFileExt(fileName);
    if (fileExtName.equals("png")) { // MimetypesFileTypeMap目前缺少png类型
    return "image/png";
    } else {
    return "application/octet-stream";
    }
    }

/**
 * removeChannelHandlerContext
 *
 * @param requestId
 * @param ctx
 */
private static void removeChannelHandlerContext(String requestId, ChannelHandlerContext ctx) {
    removeChannelHandlerContext(requestId, ctx, true);
    }

private static void removeChannelHandlerContext(String requestId, ChannelHandlerContext ctx, boolean isCloseChannel) {<FILL_FUNCTION_BODY>}
    }

    try {
    if (!StringUtil.isNullOrEmpty(requestId)) {
//    HttpFileServerController.getInstance().removeChannelHandlerContext(requestId);
    }

    if (isCloseChannel)
    ctx.channel().close();
    } catch (Exception e) {
    logger.error("close error!", e);
    }
    
<no_super_class>