1

I am trying to write an InputStream, which I get from an URL by the doGet method of Servlet. Here is my code:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 String requestedUrl = request.getParameter("url");
 if (StringUtils.isNotBlank(requestedUrl)) {
 ReadableByteChannel inputChannel = null;
 WritableByteChannel outputChannel = null;
 try {
 URL url = new URL(requestedUrl);
 HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();
 int responseCode = httpConnection.getResponseCode();
 System.out.println(responseCode);
 if (responseCode == HttpURLConnection.HTTP_OK) {
 response.setContentType("image/jpg");
 httpConnection.connect();
 InputStream imageStream = url.openStream();
 OutputStream outputStream = response.getOutputStream();
 inputChannel = Channels.newChannel(imageStream);
 outputChannel = Channels.newChannel(outputStream);
 ByteBuffer buffer = ByteBuffer.allocate(10240);
 while (inputChannel.read(buffer) != -1) {
 buffer.flip();
 outputChannel.write(buffer);
 buffer.clear();
 }
 }
 } catch (Exception ex) {
 Log.error(this, ex.getMessage(), ex);
 } finally {
 if (ObjectUtils.notEqual(outputChannel, null)) {
 try {
 outputChannel.close();
 } catch (IOException ignore) {
 }
 }
 if (ObjectUtils.notEqual(inputChannel, null)) {
 try {
 inputChannel.close();
 } catch (IOException ignore) {
 }
 }
 }
 }
}

I can see in console that the responseCode is 200 but it is not writing anything in the page. In Firefox I am getting:

The image "the_context_root/dam/no-image-aware-servlet?url=http%3A//localhost%3A80/file/MHIS044662&Rendition=164FixedWidth&noSaveAs=1" cannot be displayed because it contains errors.

I am unable to find what I am doing wrong. Any pointer would be very helpful.

asked Nov 22, 2013 at 15:53
9
  • Can you use response code prior to httpConnection.connect()? Commented Nov 22, 2013 at 15:57
  • @Taylor I am not sure I catch you. Did you mean to call httpConnection.connect() before httpConnection.getResponseCode();? Commented Nov 22, 2013 at 15:59
  • Yes. I'd be surprised if you had a response code before connecting. Commented Nov 22, 2013 at 16:00
  • @TapasBose getResponseCode() only returns something useful if you do the httpConnection.connect() BEFORE. Commented Nov 22, 2013 at 16:01
  • Did you set the correct content type for the response? Commented Nov 22, 2013 at 16:02

1 Answer 1

2

I've tried to modify your code a little bit to address the wrong order of getResponseCode() and connect() as well as some other minor issues.

Especially make sure to ALWAYS return an error status code (other than 2xx) if something goes wrong (e.g. file not found on other server, IOException, illegal URL, ...), otherwise the browser always gets 200 - OK but no data!

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 String requestedUrl = request.getParameter("url");
 if (StringUtils.isBlank(requestedUrl)) {
 // TODO: send error code 400 - Bad Request
 return;
 }
 try {
 URL url = new URL(requestedUrl);
 HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();
 response.setContentType("image/jpg");
 httpConnection.connect();
 int responseCode = httpConnection.getResponseCode();
 if (responseCode == HttpURLConnection.HTTP_OK) {
 // TODO: set correct content type to response
 OutputStream outputStream = response.getOutputStream();
 try (InputStream imageStream = url.openStream()) {
 IOUtils.copy(imageStream, outputStream );
 }
 } else {
 // TODO: send error code (depends on responseCode), probably 500
 }
 } catch (Exception ex) {
 Log.error(this, ex.getMessage(), ex);
 // TODO: send error code 400 if malformed url
 // TODO: send error code 404 if image not found (responseCode == 404)
 // TODO: send error code 500 else
 }
 // Don't close the response-OutputStream! You didn't open it either!
}
answered Nov 22, 2013 at 16:16

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.