mcardle     2006/01/06 02:08:56 CET

  Modified files:
    src/net/sf/j2ep/responsehandlers ResponseHandlerBase.java 
  Log:
  * deals with "Connection reset by peer: socket write error"
  
  Revision  Changes    Path
  1.21      +57 -34    
esi_server/src/net/sf/j2ep/responsehandlers/ResponseHandlerBase.java
http://jahia.mine.nu:8080/cgi-bin/cvsweb.cgi/esi_server/src/net/sf/j2ep/responsehandlers/ResponseHandlerBase.java.diff?r1=1.20&r2=1.21&f=h
  
  
  
  Index: ResponseHandlerBase.java
  ===================================================================
  RCS file: 
/home/cvs/repository/esi_server/src/net/sf/j2ep/responsehandlers/ResponseHandlerBase.java,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- ResponseHandlerBase.java  4 Jan 2006 22:57:29 -0000       1.20
  +++ ResponseHandlerBase.java  6 Jan 2006 01:08:56 -0000       1.21
  @@ -20,10 +20,7 @@
   import java.io.InputStream;
   import java.io.OutputStream;
   import java.io.ByteArrayOutputStream;
  -import java.net.InetAddress;
  -import java.net.UnknownHostException;
  -import java.net.URL;
  -import java.net.MalformedURLException;
  +import java.net.*;
   import java.util.Vector;
   import java.util.Enumeration;
   import java.util.Date;
  @@ -167,12 +164,17 @@
                       //log.debug(".");
                       read = streamFromServer.read(buffer);
                   }
  -                streamFromServer.close();
  +
  +            }
  +        }
  +        catch (SocketException ex) {
  +            if ( ex.getMessage().equals("Connection reset by peer: socket 
write error") ) {
  +                log.info("Client "+clientRequest.getRemoteAddr()+" has 
prematurely closed the connection to " + this.getClientRequestURL().toString());
               }
  -            clientResponseStream.flush();
           }
           finally {
  -
  +            streamFromServer.close();
  +            clientResponseStream.flush();
               clientResponseStream.close();
           }
       }
  @@ -183,52 +185,69 @@
           OutputStream clientResponseStream = clientResponse.getOutputStream();
   
           ByteArrayOutputStream cacheStream = new ByteArrayOutputStream(1000);
  +        boolean transferError = false;
   
  -        if (streamFromServer != null) {
  -            byte[] buffer = new byte[1024];
  -            int read = streamFromServer.read(buffer);
  -            while (read > 0) {
  -                clientResponseStream.write(buffer, 0, read);
  -                cacheStream.write(buffer, 0, read);
  +        try {
  +            if (streamFromServer != null) {
  +                byte[] buffer = new byte[1024];
  +                int read = streamFromServer.read(buffer);
  +                while (read > 0) {
  +                    clientResponseStream.write(buffer, 0, read);
  +                    cacheStream.write(buffer, 0, read);
   
  -                read = streamFromServer.read(buffer);
  +                    read = streamFromServer.read(buffer);
  +                }
               }
  -            streamFromServer.close();
           }
  -        clientResponseStream.flush();
  -        clientResponseStream.close();
  +        catch (SocketException ex) {
  +            if ( ex.getMessage().equals("Connection reset by peer: socket 
write error") ) {
  +                log.info("Client "+clientRequest.getRemoteAddr()+" has 
prematurely closed the connection to " + this.getClientRequestURL().toString());
  +                transferError = true;
  +            }
  +        }
  +        finally {
  +            streamFromServer.close();
   
  -        cacheStream.flush();
  -        cacheStream.close();
  +            clientResponseStream.flush();
  +            clientResponseStream.close();
   
  -        byte[] cacheByteContent = cacheStream.toByteArray();
  +            cacheStream.flush();
  +            cacheStream.close();
  +        }
   
  -        FragmentCache fragmentCache = FragmentCache.getInstance();
  +        if (!transferError) {
  +            byte[] cacheByteContent = cacheStream.toByteArray();
   
  -        //fragmentCache.add(cacheKey, this.method, cacheByteContent);
  -        fragmentCache.add(cacheKey, this.methodToServer, cacheByteContent,
  -                this.getClientRequestURL().toString(),
  -                null, null, null ,null);  //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  +            FragmentCache fragmentCache = FragmentCache.getInstance();
   
  +            //fragmentCache.add(cacheKey, this.method, cacheByteContent);
  +            fragmentCache.add(cacheKey, this.methodToServer, 
cacheByteContent,
  +                    this.getClientRequestURL().toString(),
  +                    null, null, null ,null);  
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   
  +        }
       }
   
       public void sendStreamToClientFromCache(ServletResponse clientResponse, 
byte[] cachedByteContent) throws IOException {
   
           OutputStream clientResponseStream = clientResponse.getOutputStream();
   
  -        //reset content-length header previously set by 
copyHeadersFromServerResponseToClientResponse()
  -        clientResponse.setContentLength(cachedByteContent.length);
  -
           try {
  +            //reset content-length header previously set by 
copyHeadersFromServerResponseToClientResponse()
  +            clientResponse.setContentLength(cachedByteContent.length);
  +
               if (cachedByteContent==null) {
                   log.error("sendStreamToClientFromCache : cachedByteContent 
is NULL. so not sending anything");
               }
               else
                   clientResponseStream.write(cachedByteContent, 0, 
cachedByteContent.length);
  -            clientResponseStream.flush();
  +        }
  +        catch (SocketException ex) {
  +            if ( ex.getMessage().equals("Connection reset by peer: socket 
write error") )
  +                log.info("Client "+clientRequest.getRemoteAddr()+" has 
prematurely closed the connection to " + this.getClientRequestURL().toString());
           }
           finally {
  +            clientResponseStream.flush();
               clientResponseStream.close();
           }
       }
  @@ -274,6 +293,10 @@
                   location=true;
               else if (name.equalsIgnoreCase("referer"))
                   referer=true;
  +            else if (name.equalsIgnoreCase("Server")) {
  +                clientResponse.addHeader(name, "Remote-" + val); //this is 
the Server header from Jahia, so rename it since the current response will add 
it's own Server Header
  +                continue;
  +            }
               else if (name.equalsIgnoreCase("Transfer-Encoding")
                       && val.toLowerCase().indexOf("chunked")!=-1)
                   transferEncodingChunked=true;
  @@ -306,7 +329,7 @@
               }
   
               if (!connection
  -                && !transferEncodingChunked) {
  +                    && !transferEncodingChunked) {
                   //optionally ignore Set-Cookie header
                   if (setcookie && ignoreCookies) {
                       log.info("Ignored Set-Cookie header because this is a 
response returned from Cache. Header:"+header);
  @@ -459,8 +482,8 @@
               else {
                   if (errorStatusCode==-5)
                       clientResponse.setStatus(getStatusCode());
  -                //if an TransferFailedException occured, then the 
getStatusCode() might return NULL
  -                //so use the errorCode returned in the exception
  +                    //if an TransferFailedException occured, then the 
getStatusCode() might return NULL
  +                    //so use the errorCode returned in the exception
                   else
                       clientResponse.setStatus(errorStatusCode);
   
  @@ -486,7 +509,7 @@
           Vector retrievedFrags = new Vector();
   
           if (urlObj==null //not in cache?
  -         || urlObj.getExpirationDateInSecs() < (new Date()).getTime()/1000 
//expired? //TODO: when implemented add "+ urlObj.getMaxRemovalDelayInSecs()"
  +                || urlObj.getExpirationDateInSecs() < (new 
Date()).getTime()/1000 //expired? //TODO: when implemented add "+ 
urlObj.getMaxRemovalDelayInSecs()"
                   ) {
               //TODO:Need to support all other methods such as POST !
               fetchingSkeleton = true;
  @@ -639,7 +662,7 @@
                   }
               }
               else
  -                if (log.isDebugEnabled()) log.debug("client submitted a 
IfNoneMatch:"+IfNoneMatchHeader +" but cached server response did not contain 
an ETag");
  +            if (log.isDebugEnabled()) log.debug("client submitted a 
IfNoneMatch:"+IfNoneMatchHeader +" but cached server response did not contain 
an ETag");
           }
   
           long modSinceHeader = 
clientRequest.getDateHeader("If-Modified-Since");
  

Reply via email to