Hi Espen,

which JVM are you running this with and is the npn jar in the bootclasspath?
Have you tried setting org.eclipse.jetty.spdy to debug loglevel and checked the output?

Cheers,
Thomas

Am 9/6/13 9:59 AM, schrieb Espen A. Fossen:
Hi

Have been toying around with SPDYClient to make a simple spdy based call
to a public Google REST API. The code is based upon examples found in
http://wiki.eclipse.org/Jetty/Feature/SPDY and
SSLExternalServerTest.java (spdy-http-server).

The code runs just fine in a main() method, but when trying the same
code wrapped in a simple Servlet, StreamFrameListenere.onData() is never
called:

@WebServlet(urlPatterns = {"/rest"})
public class SPDYBasedRestCallServlet extends HttpServlet {

     private static final long serialVersionUID = 1L;
     private SPDYClient client;

     @Override
     public void init() throws ServletException {

         QueuedThreadPool threadPool = new QueuedThreadPool();
         SslContextFactory sslContextFactory = new SslContextFactory();
         sslContextFactory.setIncludeProtocols("TLSv1");
         sslContextFactory.setEndpointIdentificationAlgorithm("");
         SPDYClient.Factory clientFactory = new
SPDYClient.Factory(threadPool, null, sslContextFactory, 30000);

         try {
             clientFactory.start();
         } catch (Exception e) {
             throw new ServletException(e);
         }
         client = clientFactory.newSPDYClient(SPDY.V3);
     }

     @Override
     protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws IOException {

         final PrintWriter out = response.getWriter();
         response.setContentType("text/html;charset=UTF-8");

         StreamFrameListener streamListener = new
StreamFrameListener.Adapter()
         {
             public void onData(Stream stream, DataInfo dataInfo)
             {
                 // Data received from server
                 String content = dataInfo.asString("UTF-8", true);
                 out.append(content);
             }
         };

         try {
             Session session = client.connect(new
InetSocketAddress("www.googleapis.com", 443), null).get(5,
TimeUnit.SECONDS);

             Fields headers = new Fields();
             headers.put(HTTPSPDYHeader.SCHEME.name(SPDY.V3), "https");
             headers.put(HTTPSPDYHeader.HOST.name(SPDY.V3),
"www.googleapis.com" + ":" + "443");
             headers.put(HTTPSPDYHeader.METHOD.name(SPDY.V3), "GET");
             headers.put(HTTPSPDYHeader.URI.name(SPDY.V3),
"/urlshortener/v1/url?shortUrl=http://goo.gl/fbsS";);
             headers.put(HTTPSPDYHeader.VERSION.name(SPDY.V3), "HTTP/1.1");

             // Start a new session, and configure the stream listener
             session.syn(new SynInfo(headers, true), streamListener);
         } catch (ExecutionException | InterruptedException |
TimeoutException e) {
             e.printStackTrace();
         }
     }
}

The servlet return a page, but a TimeoutException is thrown in the logs,
which I guess is because the StreamFrameListenere.onData() is never called.

java.util.concurrent.TimeoutException
     at org.eclipse.jetty.util.FuturePromise.get(FuturePromise.java:130)
     at
com.test.SPDYBasedRestCallServlet.doGet(SPDYBasedRestCallServlet.java:65)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:735)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
     at
org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:698)
     at
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:505)
     at
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:138)
     at
org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:564)
     at
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:213)
     at
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1096)
     at
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:432)
     at
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:175)
     at
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1030)
     at
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:136)
     at
org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:201)
     at
org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109)
     at
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
     at org.eclipse.jetty.server.Server.handle(Server.java:445)
     at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:268)
     at
org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:229)
     at
org.eclipse.jetty.io.AbstractConnection$ReadCallback.run(AbstractConnection.java:358)
     at
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:601)
     at
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:532)
     at java.lang.Thread.run(Thread.java:724)

While the webapp runs using jetty-maven-plugin:run (9.0.5.v20130815),
both the main method test and webapp shares the same dependencies to:

* org.eclipse.jetty:jetty-server:9.0.5.v20130815
* org.eclipse.jetty.spdy:spdy-core:9.0.5.v20130815
* org.eclipse.jetty.spdy:spdy-client:9.0.5.v20130815
* org.eclipse.jetty.spdy:spdy-http-server:9.0.5.v20130815
* org.eclipse.jetty.npn:npn-api:1.1.0.v20120525

Any help would be appreciated.

Regards,
Espen

_______________________________________________
jetty-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/jetty-users


_______________________________________________
jetty-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/jetty-users

Reply via email to