users@grizzly.java.net

Re: SEVERE: ProtocolChain exception - ARP over HTTPS problem

From: Danijel <danijel.bjelajac_at_gmail.com>
Date: Thu, 13 Mar 2008 02:55:29 -0700 (PDT)

Salut Jeanfrancois,

I posted the issues it's #93.
Thanks for your help, can't wait for the bug fix, it's kind of holding me
down on continuing my grizzly usage.

--
Danijel
Jeanfrancois Arcand-2 wrote:
> 
> Salut,
> 
> Danijel wrote:
>> Hello,
>> 
>> I'm trying to do some async request processing, but I get an error.
>> 
>> I tried to code some ARP using Brian McCallister example
>> (http://kasparov.skife.org/blog/src/java/grizzly-arp-basic.html) as a
>> starting point, I added some of my own code like a ResumeThead and
>> TransactionHandler so that I can send response before scheduler call if I
>> have a response ready.
>> 
>> Now, my code works fine in a HTTP version, but same code in a HTTPS
>> version
>> fails and throws SEVERE
>> exception, only difference beetween the two is that HTTPS version uses
>> SSLSelectorThread.
> 
> 
> 
> 
>> 
>> I tested this both with grizzly-http-webserver jars in version 1.7.1 and
>> 1.7.2.
>> 
>> Finally I downloaded 1.7.2 source code from SVN and did some debugging.
>> 
>> Here what I found:
>> 
>> When execution comes to DefaultProtocolChain::executeProtocolFilter
>> method I
>> see that in my 
>> protocol chain there are 2 filters SSLReadFilter and
>> SSLAsyncProtocolFilter
>> 
>> SSLReadFilter executes fine but SSLAsyncProtocolFilter fails,
>> and it fails in AsyncProtocolFilter:: execute method at
>> nextBuffer.clear();
>> 
>>  /**
>>   * Switch ByteBuffer since we are asynchronous.
>>   */
>>  ByteBuffer nextBuffer = inputStream.getByteBuffer();
>>  nextBuffer.clear();
>> 
>> This inputStream.getByteBuffer(); returns null, and there for I get
>> NullPointerException
>> inputStream's inputBB buffer exists but byteBuffer does not, it's null
>> 
>> Any ideas how to solve this?
>> 
>> I'll put code of my main SSLApp class below and here is my output.
> 
> Looks like a bug. Can you file an issue here:
> 
> https://grizzly.dev.java.net/issues/
> 
> so this time I don't forget to reply.
> 
> I will take a look as soon as possible...I'm at a php conference and 
> well, this is a little boring so I might fix the issue today. If not, 
> tomorrow for sure as your issue is most probably reproducible using 
> GlassFish v3, which means they will file an issue as well :-)!
> 
> A+
> 
> -- Jeanfrancois
> 
> 
> 
> 
> 
>> 
>> Mar 12, 2008 7:49:39 PM com.sun.grizzly.http.SelectorThread
>> displayConfiguration
>> INFO: 
>>  Grizzly configuration for port 8282
>> 	 maxThreads: 5
>> 	 minThreads: 5
>> 	 ByteBuffer size: 8192
>> 	 useDirectByteBuffer: false
>> 	 useByteBufferView: false
>> 	 maxHttpHeaderSize: 8192
>> 	 maxKeepAliveRequests: 256
>> 	 keepAliveTimeoutInSeconds: 30
>> 	 Static File Cache enabled: true
>> 	 Stream Algorithm : com.sun.grizzly.http.algorithms.NoParsingAlgorithm
>> 	 Pipeline : com.sun.grizzly.http.LinkedListPipeline
>> 	 Round Robin Selector Algorithm enabled: false
>> 	 Round Robin Selector pool size: 0
>> 	 recycleTasks: true
>> 	 Asynchronous Request Processing enabled: true
>> Mar 12, 2008 7:51:00 PM com.sun.grizzly.DefaultProtocolChain
>> executeProtocolFilter
>> SEVERE: ProtocolChain exception
>> java.lang.NullPointerException
>> 	at
>> com.sun.grizzly.arp.AsyncProtocolFilter.execute(AsyncProtocolFilter.java:136)
>> 	at
>> com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:101)
>> 	at
>> com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:78)
>> 	at
>> com.sun.grizzly.http.SelectorThread$1.execute(SelectorThread.java:669)
>> 	at
>> com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
>> 	at
>> com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
>> 	at com.sun.grizzly.util.WorkerThreadImpl.run(WorkerThreadImpl.java:179)
>> 
>> 
>> 
>> import java.io.IOException;
>> import java.util.HashMap;
>> import java.util.concurrent.ArrayBlockingQueue;
>> 
>> import com.sun.grizzly.SSLConfig;
>> import com.sun.grizzly.arp.DefaultAsyncHandler;
>> import com.sun.grizzly.http.AsyncExecutor;
>> import com.sun.grizzly.http.AsyncFilter;
>> import com.sun.grizzly.http.AsyncHandler;
>> import com.sun.grizzly.http.AsyncTask;
>> import com.sun.grizzly.http.DefaultProcessorTask;
>> import com.sun.grizzly.http.SelectorThread;
>> import com.sun.grizzly.ssl.SSLSelectorThread;
>> import com.sun.grizzly.util.buf.ByteChunk;
>> import com.sun.grizzly.util.net.jsse.JSSEImplementation;
>> 
>> public class SSLApp {
>> 	public static ArrayBlockingQueue<NameValue> msgs = new
>> ArrayBlockingQueue<NameValue>( 100 );
>> 	public static HashMap<String, TransactionHandler> map = new
>> HashMap<String,
>> TransactionHandler>();
>> 	public static String TRAN_ID = "ID";
>> 	static long count = 0;
>> 	public static void main( String[] args ) {
>> 		SSLApp app = new SSLApp();
>> 		ServerStarter ss = app.new ServerStarter();
>> 		ss.start();
>> 		ResumerThread resThread = new ResumerThread();
>> 		resThread.start();
>> 	}
>> 
>> 	public class ServerStarter extends Thread {
>> 		private SSLConfig sslConfig;
>> 		
>> 	  private void setUp() {
>> 			sslConfig = new SSLConfig();
>> 	    // override system properties
>> 	   sslConfig.setTrustStoreFile("c:/temp/key/ssltest-cacerts.jks");
>> 	   sslConfig.setKeyStoreFile("c:/temp/key/ssltest-keystore.jks");
>> 		}
>> 	  
>> 	  private SelectorThread createSelectorThread(int port) {
>> 	    SSLSelectorThread selectorThread = new SSLSelectorThread();
>> 	    selectorThread.setPort(port);
>> 	    SSLSelectorThread.setWebAppRootPath( "/dev/null" );
>> 	    selectorThread.setSSLConfig(sslConfig);
>> 	    try {
>> 				selectorThread.setSSLImplementation( new JSSEImplementation() );
>> 			} catch ( ClassNotFoundException e ) {
>> 				// TODO Auto-generated catch block
>> 				e.printStackTrace();
>> 			}
>> 			AsyncHandler handler = new DefaultAsyncHandler();
>> 			handler.addAsyncFilter( new MyAsyncFilter() );
>> 			selectorThread.setAsyncHandler( handler );
>> 			selectorThread.setEnableAsyncExecution( true );
>> 			selectorThread.setAdapter( new MyAdapter() );
>> 	    return selectorThread;
>> 	}
>> 		@Override
>> 		public void run() {
>> 			setUp();
>> 			SelectorThread sel = createSelectorThread( 8282 );
>> 			sel.setDisplayConfiguration( true );
>> 			try {
>> 				sel.initEndpoint();
>> 				sel.startEndpoint();
>> 			} catch ( IOException e ) {
>> 				e.printStackTrace();
>> 			} catch ( InstantiationException e ) {
>> 				e.printStackTrace();
>> 			}
>> 		}
>> 	}
>> 	private class MyAsyncFilter implements AsyncFilter {
>> 		public boolean doFilter( AsyncExecutor executor ) {
>> 			System.out.println("DO_FILTER");
>> 			AsyncTask asyncTask = executor.getAsyncTask();
>> 			AsyncHandler asyncHandler = executor.getAsyncHandler();
>> 			DefaultProcessorTask processorTask = (DefaultProcessorTask)
>> executor.getAsyncTask().getProcessorTask();
>> 			int contentLenght = processorTask.getRequest().getContentLength();
>> 			ByteChunk byteChunk = new ByteChunk();
>> 			byteChunk.setLimit( contentLenght );
>> 			try {
>> 				processorTask.getRequest().doRead( byteChunk );
>> 			} catch ( IOException e ) {
>> 				e.printStackTrace();
>> 			}
>> 			String requestURI =
>> processorTask.getRequest().requestURI().toString();
>> 			System.out.println("New incoming to service: " + getService(
>> requestURI
>> ));
>> 			String inStr = byteChunk.toString();
>> 			TransactionHandler transHandler = new TransactionHandler();
>> 			transHandler.setMsg( inStr );
>> 			transHandler.setRunnable( new MyRunnable( asyncHandler, asyncTask ) );
>> 			map.put( Long.toString( count), transHandler );
>> 			processorTask.getRequest().setAttribute( TRAN_ID, Long.toString(
>> count)
>> );
>> 			processorTask.invokeAdapter();
>> 			return false;
>> 		}
>> 	}
>> 
>> 	/**
>> 	 * Get the service that is mapped to the specified request.
>> 	 */
>> 	private String getService( String uri ) {
>> 		if ( uri == null )
>> 			return "";
>> 		String serviceName="";
>> 		if ( uri.startsWith( "/" ) ) {
>> 			serviceName = uri.substring( 1 );
>> 		} else {
>> 			serviceName = uri;
>> 		}
>> 		return serviceName;
>> 	}
>> }
>> 
>> -----
>> --
>> Danijel
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe_at_grizzly.dev.java.net
> For additional commands, e-mail: users-help_at_grizzly.dev.java.net
> 
> 
> 
-----
--
Danijel
-- 
View this message in context: http://www.nabble.com/SEVERE%3A-ProtocolChain-exception---ARP-over-HTTPS-problem-tp16012530p16024166.html
Sent from the Grizzly - Users mailing list archive at Nabble.com.