@Override public boolean handleConnectorRequest(VaadinRequest request, VaadinResponse response, String path) throws IOException { Matcher matcher = Pattern.compile("(\\d+)(/.*)?").matcher(path); if (!matcher.matches()) { return super.handleConnectorRequest(request, response, path); } DownloadStream stream; VaadinSession session = getSession(); session.lock(); try { List<URLReference> sources = getState().sources; int sourceIndex = Integer.parseInt(matcher.group(1)); if (sourceIndex < 0 || sourceIndex >= sources.size()) { getLogger().log(Level.WARNING, "Requested source index {0} is out of bounds", sourceIndex); return false; } URLReference reference = sources.get(sourceIndex); ConnectorResource resource = (ConnectorResource) ResourceReference .getResource(reference); stream = resource.getStream(); } finally { session.unlock(); } stream.writeResponse(request, response); return true; }
@Override public boolean handleConnectorRequest(VaadinRequest request, VaadinResponse response, String path) throws IOException { DownloadStream stream = null; String[] parts = path.split("/", 2); String key = parts[0]; VaadinSession session = getSession(); session.lock(); try { ConnectorResource resource = (ConnectorResource) getResource(key); if (resource == null) { return false; } stream = resource.getStream(); } finally { session.unlock(); } stream.writeResponse(request, response); return true; }
stream.writeResponse(request, response); return true;
session.unlock(); stream.writeResponse(request, response); return true;
@Test public void testContentDispositionHeaderIsSetCorrectly() throws Exception { // GIVEN String encodedFileName = EncodeUtil.rfc5987Encode(fileName); action = new DownloadBinaryAction<DownloadBinaryActionDefinition>(definition, item); DownloadStreamResource downloadStreamResource = action.getStreamResource(inputStream, fileName); String expectedContentDispositionHeaderValue = String.format("attachment;filename=\"%s\"; filename*=utf-8''%<s", encodedFileName); VaadinRequest vaadinRequest = mock(VaadinRequest.class); VaadinResponse vaadinResponse = mock(VaadinResponse.class); // WHEN downloadStreamResource.getStream().writeResponse(vaadinRequest, vaadinResponse); // THEN // At least as of 7.6 Vaadin may set content-disposition header twice with the same value verify(vaadinResponse, atLeastOnce()).setHeader("Content-Disposition", expectedContentDispositionHeaderValue); }
session.unlock(); stream.writeResponse(request, response); return true;
stream.writeResponse(request, response); return true;