Example usage for com.vaadin.server VaadinServletResponse setContentLength

List of usage examples for com.vaadin.server VaadinServletResponse setContentLength

Introduction

In this page you can find the example usage for com.vaadin.server VaadinServletResponse setContentLength.

Prototype

public void setContentLength(int len);

Source Link

Document

Sets the length of the content body in the response In HTTP servlets, this method sets the HTTP Content-Length header.

Usage

From source file:annis.gui.requesthandler.BinaryRequestHandler.java

License:Apache License

public void sendResponse(VaadinSession session, VaadinRequest request, VaadinResponse pureResponse,
        boolean sendContent) throws IOException {
    if (!(pureResponse instanceof VaadinServletResponse)) {
        pureResponse.sendError(500, "Binary requests only work with servlets");
    }//from   ww w .  ja  va 2 s. com

    VaadinServletResponse response = (VaadinServletResponse) pureResponse;

    Map<String, String[]> binaryParameter = request.getParameterMap();
    String toplevelCorpusName = binaryParameter.get("toplevelCorpusName")[0];
    String documentName = binaryParameter.get("documentName")[0];

    String mimeType = null;
    if (binaryParameter.containsKey("mime")) {
        mimeType = binaryParameter.get("mime")[0];
    }
    try {
        // always set the buffer size to the same one we will use for coyping, 
        // otherwise we won't notice any client disconnection
        response.reset();
        response.setCacheTime(-1);
        response.resetBuffer();
        response.setBufferSize(BUFFER_SIZE); // 4K

        String requestedRangeRaw = request.getHeader("Range");

        WebResource binaryRes = Helper.getAnnisWebResource().path("query").path("corpora")
                .path(urlPathEscape.escape(toplevelCorpusName)).path(urlPathEscape.escape(documentName))
                .path("binary");

        WebResource metaBinaryRes = Helper.getAnnisWebResource().path("meta").path("binary")
                .path(urlPathEscape.escape(toplevelCorpusName)).path(urlPathEscape.escape(documentName));

        // tell client that we support byte ranges
        response.setHeader("Accept-Ranges", "bytes");

        Preconditions.checkNotNull(mimeType, "No mime type given (parameter \"mime\"");

        AnnisBinaryMetaData meta = getMatchingMetadataFromService(metaBinaryRes, mimeType);
        if (meta == null) {
            response.sendError(404, "Binary file not found");
            return;
        }

        ContentRange fullRange = new ContentRange(0, meta.getLength() - 1, meta.getLength());

        ContentRange r = fullRange;
        try {
            if (requestedRangeRaw != null) {
                List<ContentRange> requestedRanges = ContentRange.parseFromHeader(requestedRangeRaw,
                        meta.getLength(), 1);

                if (!requestedRanges.isEmpty()) {
                    r = requestedRanges.get(0);
                }
            }

            long contentLength = (r.getEnd() - r.getStart() + 1);

            boolean useContentRange = !fullRange.equals(r);

            response.setContentType(meta.getMimeType());
            if (useContentRange) {
                response.setHeader("Content-Range", r.toString());
            }
            response.setContentLength((int) contentLength);
            response.setStatus(useContentRange ? 206 : 200);

            response.flushBuffer();
            if (sendContent) {
                try (OutputStream out = response.getOutputStream();) {
                    writeFromServiceToClient(r.getStart(), contentLength, binaryRes, out, mimeType);
                }
            }

        } catch (ContentRange.InvalidRangeException ex) {
            response.setHeader("Content-Range", "bytes */" + meta.getLength());
            response.sendError(416, "Requested range not satisfiable: " + ex.getMessage());
            return;
        }

    } catch (IOException ex) {
        log.warn("IOException in BinaryRequestHandler", ex);
        response.setStatus(500);
    } catch (ClientHandlerException | UniformInterfaceException ex) {
        log.error(null, ex);
        response.setStatus(500);
    }
}