Author: fhanik Date: Tue Nov 25 19:39:03 2008 New Revision: 720724 URL: http://svn.apache.org/viewvc?rev=720724&view=rev Log: First attempt for SSL send file
Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java tomcat/trunk/java/org/apache/tomcat/util/net/NioChannel.java tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java tomcat/trunk/java/org/apache/tomcat/util/net/SecureNioChannel.java Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java?rev=720724&r1=720723&r2=720724&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java Tue Nov 25 19:39:03 2008 @@ -309,7 +309,6 @@ public void setUseSendfile(boolean useSendfile) { ep.setUseSendfile(useSendfile); } - // -------------------- Tcp setup -------------------- Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioChannel.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/NioChannel.java?rev=720724&r1=720723&r2=720724&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/NioChannel.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/NioChannel.java Tue Nov 25 19:39:03 2008 @@ -47,6 +47,8 @@ protected ApplicationBufferHandler bufHandler; protected Poller poller; + + protected boolean sendFile = false; public NioChannel(SocketChannel channel, ApplicationBufferHandler bufHandler) throws IOException { this.sc = channel; @@ -56,6 +58,7 @@ public void reset() throws IOException { bufHandler.getReadBuffer().clear(); bufHandler.getWriteBuffer().clear(); + this.sendFile = false; } public int getBufferSize() { @@ -191,5 +194,22 @@ public String toString() { return super.toString()+":"+this.sc.toString(); } + + public int getOutboundRemaining() { + return 0; + } + + public void flushOutbound() throws IOException { + + } + + public boolean isSendFile() { + return sendFile; + } + + public void setSendFile(boolean s) { + this.sendFile = s; + } + } Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?rev=720724&r1=720723&r2=720724&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Tue Nov 25 19:39:03 2008 @@ -30,6 +30,7 @@ import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; +import java.nio.channels.WritableByteChannel; import java.security.KeyStore; import java.util.Collection; import java.util.Iterator; @@ -644,7 +645,6 @@ } public void setUseSendfile(boolean useSendfile) { - this.useSendfile = useSendfile; } @@ -958,8 +958,7 @@ } public boolean getUseSendfile() { - //send file doesn't work with SSL - return useSendfile && (!isSSLEnabled()); + return useSendfile; } public int getOomParachute() { @@ -1328,10 +1327,10 @@ } else { cancel = true; } - if ( cancel ) getPoller0().cancelledKey(key,SocketStatus.ERROR,false); + if ( cancel ) socket.getPoller().cancelledKey(key,SocketStatus.ERROR,false); }catch (CancelledKeyException ckx) { try { - getPoller0().cancelledKey(key,SocketStatus.DISCONNECT,true); + socket.getPoller().cancelledKey(key,SocketStatus.DISCONNECT,true); }catch (Exception ignore) {} } }//end if @@ -1627,6 +1626,7 @@ } public boolean processSendfile(SelectionKey sk, KeyAttachment attachment, boolean reg, boolean event) { + NioChannel sc = null; try { //unreg(sk,attachment);//only do this if we do process send file on a separate thread SendfileData sd = attachment.getSendfileData(); @@ -1638,13 +1638,20 @@ } sd.fchannel = new FileInputStream(f).getChannel(); } - SocketChannel sc = attachment.getChannel().getIOChannel(); - long written = sd.fchannel.transferTo(sd.pos,sd.length,sc); - if ( written > 0 ) { - sd.pos += written; - sd.length -= written; + sc = attachment.getChannel(); + sc.setSendFile(true); + WritableByteChannel wc =(WritableByteChannel) ((sc instanceof SecureNioChannel)?sc:sc.getIOChannel()); + + if (sc.getOutboundRemaining()>0) { + sc.flushOutbound(); + } else { + long written = sd.fchannel.transferTo(sd.pos,sd.length,wc); + if ( written > 0 ) { + sd.pos += written; + sd.length -= written; + } } - if ( sd.length <= 0 ) { + if ( sd.length <= 0 && sc.getOutboundRemaining()<=0) { if (log.isDebugEnabled()) { log.debug("Send file complete for:"+sd.fileName); } @@ -1684,6 +1691,8 @@ log.error("",t); cancelledKey(sk, SocketStatus.ERROR, false); return false; + }finally { + if (sc!=null) sc.setSendFile(false); } return true; } Modified: tomcat/trunk/java/org/apache/tomcat/util/net/SecureNioChannel.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/SecureNioChannel.java?rev=720724&r1=720723&r2=720724&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/SecureNioChannel.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/SecureNioChannel.java Tue Nov 25 19:39:03 2008 @@ -400,7 +400,7 @@ return written; } else { //make sure we can handle expand, and that we only use on buffer - if ( src != bufHandler.getWriteBuffer() ) throw new IllegalArgumentException("You can only write using the application write buffer provided by the handler."); + if ( (!this.isSendFile()) && (src != bufHandler.getWriteBuffer()) ) throw new IllegalArgumentException("You can only write using the application write buffer provided by the handler."); //are we closing or closed? if ( closing || closed) throw new IOException("Channel is in closing state."); @@ -434,6 +434,17 @@ } } + @Override + public int getOutboundRemaining() { + return netOutBuffer.remaining(); + } + + @Override + public void flushOutbound() throws IOException { + flush(netOutBuffer); + } + + /** * Callback interface to be able to expand buffers * when buffer overflow exceptions happen --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]