United StatesChange Country, Oracle Worldwide Web Sites Communities I am a... I want to...
JDK-5026745 : Cannot flush output stream when writing to an HttpUrlConnection

Details
Type:
Bug
Submit Date:
2004-04-05
Status:
Resolved
Updated Date:
2004-05-13
Project Name:
JDK
Resolved Date:
2004-05-13
Component:
core-libs
OS:
windows_nt,generic,windows_2000
Sub-Component:
java.net
CPU:
x86,generic
Priority:
P3
Resolution:
Fixed
Affected Versions:
1.3.0,1.3.1,5.0
Fixed Versions:
5.0 (b50)

Related Reports
Duplicate:
Relates:
Relates:
Relates:
Relates:
Relates:
Relates:

Sub Tasks

Description
###@###.### 2004-04-05

The CAP member has a requirement to support signing/encryption for large 
file upload using their Security Applet, i.e. they would like require
support for chunked uploads using the URL connection. Hence would request
to re-open bug(4212479). In this bug, this problem would be fixed if talking
to HTTP1.1 compliant servers.   However even when talking to HTTP1.1. servers,
they still have the same problem.

J2SE Version (please include all output from java -version flag):
  java version "1.5.0-beta2"
  Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-beta2-b42)
  Java HotSpot(TM) Client VM (build 1.5.0-beta2-b42, mixed mode)

Does this problem occur on J2SE 1.3, 1.4 or 1.4.1?  Yes / No (pick one)
  Yes

Bug Description: 
  When writing to an HttpUrlConnection through a DataOutputStream, the call 
to flush() does not actually flush the stream. Internally the data
continues to be buffered until the stream is closed. If you are uploading
large amounts of data then the buffer will eventually grow larger than heap
size and the app will bail with the message "java.lang.OutOfMemoryError:
Java heap space" (JDK 1.5 beta2 b42). 

Recommended behaviour: 
  If the stream is flushed before it is closed, and no content length is set,
then implement HTTP 1.1 Transfer-Encoding=chunked in the client. This will prevent the app from hitting the heap size limit.

Other comments: 
  increasing the heap space is not an option since customers are
running in an applet environment. BTW J2ME already implements HTTP 1.1
chunked transfer encoding in this scenario.  Why can't it also be made
avaible in the PC browser environement
 

Test code:
//
//package chunkingtestapplication;

import java.io.*;
import java.net.*;

public class ChunkTester extends Thread {
    
    ChunkTester(String fileName) {
        m_fileName = fileName;
    }
    
    //Main method
    public static void main(String[] args) throws Exception {  
        if (args.length != 1)  {
            System.out.println("Usage: ChunkEncodedPost <file>");
            System.out.println("<file> - full path to a file to be posted");
            System.exit(1);
        }        
        
        ChunkTester threadA = new ChunkTester(args[0]);
        threadA.start();
    }
        
        
public void run() {

    try {
        // Open the file
        FileInputStream in = new FileInputStream(new File(m_fileName));

        // Set up the connection
        URL url = new URL("http://localhost:80/chunkyserver");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setUseCaches(false);
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.setRequestProperty("Transfer-Encoding", "chunked" );

        // Write the file data to the connection in parts
        DataOutputStream dos = new DataOutputStream( conn.getOutputStream()
);
        byte[] buffer = new byte[2048];

        int readLength;
        while ((readLength = in.read(buffer)) != -1) {
            dos.write(buffer, 0, readLength);
            dos.flush(); // *does not actually flush*
        }

        // close streams
        in.close();
        dos.flush();
        dos.close();
    }
    catch (Exception e) {
        System.out.println(e.getMessage());
    }
}
    private String m_fileName = null;
}


                                    

Comments
EVALUATION

Fixed in tiger b50

###@###.### 2004-05-13
                                     
2004-05-13
CONVERTED DATA

BugTraq+ Release Management Values

COMMIT TO FIX:
tiger-beta2

FIXED IN:
tiger-beta2

INTEGRATED IN:
tiger-b50
tiger-beta2


                                     
2004-07-08



Hardware and Software, Engineered to Work Together