Name: bsT130419 Date: 10/11/2001 java version "1.3.1_01" Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.1_01) Java HotSpot(TM) Client VM (build 1.3.1_01, mixed mode) java version "1.4.0-beta2" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-beta2-b77) Java HotSpot(TM) Client VM (build 1.4.0-beta2-b77, mixed mode) 1) Both in JDK 1.3.1_01 and 1.4.0-beta2, calling getInputStream on a URLConnection for which the server returns a staus code of 500, result in a IOException like : java.io.IOException: Server returned HTTP response code: 500 for URL: http://easysoap.sourceforge.net/cgi-bin/interopserver This makes impossible using HttpURLConnection for reading SOAP responses, like example 9 of the SOAP 1.1. spec. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.Reader; import java.net.ServerSocket; import java.net.Socket; import java.net.URL; import java.net.URLConnection; /** * test case to show that on jdk 1.3.1_01 and 1.4.0-beta2 * it is not possible to read the body of an HTTP response with status code 500, * as for example a SOAP response with a fault. */ public class TestCaseFaultHttp500 { private static final int SERVER_PORT = 7008; private TestFakeHttpServer fakeHttpServer; private String baseServerURL; private static String SOAP_REQUEST = "<SOAP-ENV:Envelope" + "\n" + " xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'" + "\n" + " SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'>" + "\n" + " <SOAP-ENV:Body>" + "\n" + " <m:GetLastTradePrice xmlns:m='Some-URI'>" + "\n" + " <symbol>DIS</symbol>" + "\n" + " </m:GetLastTradePrice>" + "\n" + " </SOAP-ENV:Body>" + "</SOAP-ENV:Envelope>"; public static void main(String[] args) { TestCaseFaultHttp500 _tc = null; try { _tc = new TestCaseFaultHttp500(); _tc.testFault200(); _tc.testFault500(); } catch (Exception e) { e.printStackTrace(); } finally{ if(_tc!=null) _tc.fakeHttpServer.stop(); } } public TestCaseFaultHttp500() throws Exception { fakeHttpServer = new TestFakeHttpServer(SERVER_PORT); baseServerURL = "http://localhost:" + SERVER_PORT; } /** * this works with no problems * with jdk 1.3.1 and 1.3.1_01 */ public void testFault200() throws Exception { doTest(TestFakeHttpServer.PATH_USE_200); } /** * with jdk1.3.1_01 fails with * java.io.IOException: Server returned HTTP response code: 500 for URL: http://localhost:8008/use500 * * with 1.3.1 fails with * java.io.FileNotFoundException: http://localhost:8008/use500 */ public void testFault500() throws Exception { System.out.println("-------------------------------------"); doTest(TestFakeHttpServer.PATH_USE_500); System.out.println("-------------------------------------"); } private void doTest(String aPath) throws Exception { URL _url = new URL(baseServerURL + aPath); System.out.println("testing with " + _url.toExternalForm()); URLConnection _urlConnection = _url.openConnection(); _urlConnection.setDoInput(true); _urlConnection.setDoOutput(true); _urlConnection.setUseCaches(false); OutputStream _os = _urlConnection.getOutputStream(); PrintWriter _pw = new PrintWriter(new OutputStreamWriter(_os)); System.out.println("writing ..."); _pw.write(SOAP_REQUEST); _pw.flush(); InputStream _is = _urlConnection.getInputStream(); BufferedReader _br = new BufferedReader(new InputStreamReader(_is)); System.out.println("reading ..."); String _line = null; while(((_line = _br.readLine()) !=null)) { System.out.print(_line); System.out.print("\n"); } } } /** * sends back a hardcoded soap fault, using http response code that depends * on the path of the POST request (200 or 500) */ class TestFakeHttpServer { public static String PATH_USE_200 = "/use200"; public static String PATH_USE_500 = "/use500"; private static String SOAP_FAULT_RESPONSE = "<SOAP-ENV:Envelope " + "\n" + " xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>" + "\n" + " <SOAP-ENV:Body>" + "\n" + " <SOAP-ENV:Fault>" + "\n" + " <faultcode>SOAP-ENV:Server</faultcode>" + "\n" + " <faultstring>I am just a fake server!</faultstring>" + "\n" + " </SOAP-ENV:Fault>" + "\n" + " </SOAP-ENV:Body>" + "\n" + "</SOAP-ENV:Envelope>"; private ServerSocket serverSocket; private boolean keepRunning = true; public TestFakeHttpServer(int aPort) throws Exception { serverSocket = new ServerSocket(aPort); new Thread(new Runnable() { public void run() { while (keepRunning) { Socket _clientSocket = null; try { _clientSocket = serverSocket.accept(); fakeHttp(_clientSocket); } catch (Exception anExc) { if(keepRunning) anExc.printStackTrace(); //else a socket close is expected and normal } finally { if (_clientSocket != null) try { _clientSocket.close(); } catch (IOException e) { //ignore } } } } }).start(); } private void fakeHttp(Socket aSocket) throws Exception { InputStream _inputStream = aSocket.getInputStream(); Reader _br = new InputStreamReader(_inputStream); int _responseCodeToUse = 0; int _contentLength = 0; boolean _firstLine = true; String _line=null; //read headers while(((_line = readLine(_br))!=null)) { if(_firstLine) { //not interested in anything but the path to see // if we should respond with 200 or 500 if(_line.startsWith("POST")) { if(_line.indexOf(PATH_USE_200)!=-1) _responseCodeToUse = 200; else if(_line.indexOf(PATH_USE_500)!=-1) _responseCodeToUse = 500; else throw new Exception("TestFakeHttpServer - " + PATH_USE_200 + " or " + PATH_USE_500 + " POST PATH expected"); } else { throw new Exception("TestFakeHttpServer - POST expected"); } _firstLine = false; } if(_line.toUpperCase().indexOf("CONTENT-LENGTH:")!=-1) { _contentLength = Integer.parseInt(_line.substring("CONTENT-LENGTH: ".length())); } if(_line.equals("")) break; } //read body (and discard, because we're a fake server ;-) for(int i=0; i<_contentLength; i++) _br.read(); OutputStream _outputStream = aSocket.getOutputStream(); PrintWriter _pw = new PrintWriter(new OutputStreamWriter(_outputStream)); if(_responseCodeToUse==200) _pw.write("HTTP/1.0 200 OK\r\n"); else if(_responseCodeToUse==500) _pw.write("HTTP/1.0 500 Internal Server Error\r\n"); else throw new Exception("TestFakeHttpServer - _responseCode should be 200 or 500"); _pw.write("Content-Type: text/xml\r\n"); _pw.write("Content-Length: " + SOAP_FAULT_RESPONSE.length() +"\r\n"); _pw.write("\r\n"); _pw.write(SOAP_FAULT_RESPONSE); _pw.flush(); } /** * @return line without ending \r\n */ private String readLine(Reader aReader) throws Exception { StringBuffer _line = new StringBuffer(); int _char = 0; while(((_char = aReader.read())!=-1)) { _line.append((char)_char); int _length = _line.length(); if(_length >=2) { if(_line.charAt(_length-1) == '\n' && _line.charAt(_length-2) == '\r') { break; } } } if(_line.length() == 0) return null; else { return _line.substring(0, _line.length()-2); } } public void stop() { if (serverSocket != null) { keepRunning = false; try { ServerSocket _tmp = serverSocket; serverSocket = null; _tmp.close(); } catch (IOException anIOExc) { anIOExc.printStackTrace(); } } } } 3) the output of the above program on jdk131_01 is : C:\Edo\java\jdk1.3.1_01\bin\javaw.exe -classpath C:\Edo\java\jdk1.3.1_01 \jre\lib\rt.jar;C:\Edo\myDev\http500\classes TestCaseFaultHttp500 testing with http://localhost:7008/use200 writing ... reading ... <SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'> <SOAP-ENV:Body> <SOAP-ENV:Fault> <faultcode>SOAP-ENV:Server</faultcode> <faultstring>I am just a fake server!</faultstring> </SOAP-ENV:Fault> </SOAP-ENV:Body> </SOAP-ENV:Envelope> ------------------------------------- testing with http://localhost:7008/use500 writing ... java.io.IOException: Server returned HTTP response code: 500 for URL: http://localhost:7008/use500 at sun.net.www.protocol.http.HttpURLConnection.getInputStream (HttpURLConnection.java:564) at TestCaseFaultHttp500.doTest(TestCaseFaultHttp500.java:93) at TestCaseFaultHttp500.testFault500(TestCaseFaultHttp500.java:72) at TestCaseFaultHttp500.main(TestCaseFaultHttp500.java:37) Process terminated with exit code 0 (Review ID: 133429) ======================================================================
|