Re: Accessing ServletContext from WebSocket endpoint
On 7 December 2013 04:48, Christopher Schultz ch...@christopherschultz.netwrote: because i only see currently api to get the HttpSession and then through that the ServletContext, problem is that there is no http session.. Aah... if there is no session, getHttpSession doesn't automatically create one(). Boo. and can it create one? if a browser does a ws: request that will be first just a http request i guess that is then upgraded But in that first request can cookies be send over? Because if a websocket creates a http session then a jsessionid cookie must be set in the browser over the websocket request. And that jsession cookie must then be used by also normal http request a browser does to that server.. problem is that i don't want to create a session, i just want to ServletContext to read some files. So something like: EndpointConfig.getUserProperties().put(ServletContext,request.get Context()); That context can then just return an object which i need to cast and is then up to the container to provide. -- Johan Compagner Servoy
Re: Accessing ServletContext from WebSocket endpoint
-BEGIN PGP SIGNED MESSAGE- Hash: SHA256 Johan, On 12/7/13, 4:30 AM, Johan Compagner wrote: On 7 December 2013 04:48, Christopher Schultz ch...@christopherschultz.netwrote: because i only see currently api to get the HttpSession and then through that the ServletContext, problem is that there is no http session.. Aah... if there is no session, getHttpSession doesn't automatically create one(). Boo. and can it create one? if a browser does a ws: request that will be first just a http request i guess that is then upgraded But in that first request can cookies be send over? Because if a websocket creates a http session then a jsessionid cookie must be set in the browser over the websocket request. And that jsession cookie must then be used by also normal http request a browser does to that server.. I'm no WebSocket expert, but the server has to first handle the request as HTTP, and then upgrade it to WebSocket. The client can establish a session first, then switch over to WebSocket and inherit the session. I'm not sure if a pure WebSocket request can create a session, since WebSocket is /not/ HTTP and therefore cookies are a bit meaningless. problem is that i don't want to create a session, i just want to ServletContext to read some files. Yup, I get it. So something like: EndpointConfig.getUserProperties().put(ServletContext,request.get Context()); That context can then just return an object which i need to cast and is then up to the container to provide. I would lobby to have the container put the ServletContext into the user properties -- just as you have above -- automatically during connection set-up. There's nothing stopping Tomcat from doing that right now, except that it would technically violate the spec and introduce a non-standard vendor extension. In this case, it's pretty clear that there is a quite desirable feature missing from the spec and I think it might be reasonable to violate it in this instance. I'd prefer to get Mark or Konstantin to weigh-in on such a step, because it might set a bad precedent for Tomcat. I'm certainly not going to commit that myself. :) - -chris -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.15 (Darwin) Comment: GPGTools - http://gpgtools.org Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBCAAGBQJSozG4AAoJEBzwKT+lPKRYwHUP/1/rTzHMuYnG0PydbKAffDOo 5D+/YABdkxvmAs49MhVJyAFs9QLZn3NNmuNLoLnxirkAx2lG1RHxOrnS2VdHWrgE g5WH5gEoMFyl52rl6QOiaXBFNDfBG7X3kqn8TzUWRMkoxZbwoN5GGG6Uhk3jWv9x rWw/Bos7DqmssfrT+Y8Uk9+TbegkP0s9r56FY9PUvVPFSqjALX9sFd7WpzEPS8up NwbAMJpiFydgIwXTmMy69kmTgcvYacfrcbyZuhQmV2PllfKDbNt4THxgop6TXlYp KrDu3YzINf0DSFUgXNkjz5WGXnstLxjgn943YX54Xy5WBe9zxndOPedMBW/gHGM+ 3LdlnPaOM8OGWSu0PZxXXuLIu+oWUcB8oUKaeIMa8Yv1Zb9WIPXe6m3AlAebkfDB 9yDFjcmWS5Fpc/qaXYqrxGMoVZc22GyhijdVn1jd7tK9TJAtGpoMQrQArfcQdJb3 qcifW5iHraTeE8iDSFIj94puv4XoE5u2GwRIx+qRs9mtHdu36GUj9GfVy6tEhsFA eyhpw8cpM9DrePMus9O0OecYiTQv4eXDPhzYhj+zsjipmIhza7dzedIg12l+gnaY TONnC3tXsOOl5cioJPaRgwl4jVKBrlg1xMIA937ncPiqKFoX//8nJq9LaCds7Vrq 33lj6jBuGweANjNxGsRC =qMXW -END PGP SIGNATURE- - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org
Re: Accessing ServletContext from WebSocket endpoint
I'm trying the example from Tyrus, hoping that it could work on tomcat https://tyrus.java.net/documentation/1.3/index/deployment.html this is the simplest code to put ServletContext in userproperties @WebListener public class MyWebSocket implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { final ServerContainer serverContainer = (ServerContainer) servletContextEvent.getServletContext() .getAttribute(javax.websocket.server.ServerContainer); try { ServerEndpointConfig c = ServerEndpointConfig.Builder.create(MyWebSocket.class, /endpoint).build(); c.getUserProperties().put(servletContext, servletContextEvent.getServletContext()); serverContainer.addEndpoint(c); } catch (DeploymentException e) { e.printStackTrace(); } } @OnOpen public void onOpen(Session session, EndpointConfig config) { try { session.getBasicRemote().sendText(hello + config.getUserProperties()); } catch (IOException e) { e.printStackTrace(); } } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { } } unfortunately I got this exception onOpen java.lang.NullPointerException at org.apache.tomcat.websocket.pojo.PojoEndpointBase.doOnOpen(PojoEndpointBase.java:56) at org.apache.tomcat.websocket.pojo.PojoEndpointServer.onOpen(PojoEndpointServer.java:70) at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.init(WsHttpUpgradeHandler.java:129) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:629) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:724) Thanks Enrico Il 07/12/2013 15:33, Christopher Schultz ha scritto: -BEGIN PGP SIGNED MESSAGE- Hash: SHA256 Johan, On 12/7/13, 4:30 AM, Johan Compagner wrote: On 7 December 2013 04:48, Christopher Schultz ch...@christopherschultz.netwrote: because i only see currently api to get the HttpSession and then through that the ServletContext, problem is that there is no http session.. Aah... if there is no session, getHttpSession doesn't automatically create one(). Boo. and can it create one? if a browser does a ws: request that will be first just a http request i guess that is then upgraded But in that first request can cookies be send over? Because if a websocket creates a http session then a jsessionid cookie must be set in the browser over the websocket request. And that jsession cookie must then be used by also normal http request a browser does to that server.. I'm no WebSocket expert, but the server has to first handle the request as HTTP, and then upgrade it to WebSocket. The client can establish a session first, then switch over to WebSocket and inherit the session. I'm not sure if a pure WebSocket request can create a session, since WebSocket is /not/ HTTP and therefore cookies are a bit meaningless. problem is that i don't want to create a session, i just want to ServletContext to read some files. Yup, I get it. So something like: EndpointConfig.getUserProperties().put(ServletContext,request.get Context()); That context can then just return an object which i need to cast and is then up to the container to provide. I would lobby to have the container put the ServletContext into the user properties -- just as you have above -- automatically during connection set-up. There's nothing stopping Tomcat from doing that right now, except that it would technically violate the spec and introduce a non-standard vendor extension. In this case, it's pretty clear that there is a quite desirable feature missing from the spec and I think it might be reasonable to violate it in this instance. I'd prefer to get Mark or Konstantin to weigh-in on such a step, because it might set a bad precedent for Tomcat. I'm certainly not going to commit that myself. :) - -chris -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.15 (Darwin) Comment: GPGTools - http://gpgtools.org Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBCAAGBQJSozG4AAoJEBzwKT+lPKRYwHUP/1/rTzHMuYnG0PydbKAffDOo 5D+/YABdkxvmAs49MhVJyAFs9QLZn3NNmuNLoLnxirkAx2lG1RHxOrnS2VdHWrgE g5WH5gEoMFyl52rl6QOiaXBFNDfBG7X3kqn8TzUWRMkoxZbwoN5GGG6Uhk3jWv9x rWw/Bos7DqmssfrT+Y8Uk9+TbegkP0s9r56FY9PUvVPFSqjALX9sFd7WpzEPS8up NwbAMJpiFydgIwXTmMy69kmTgcvYacfrcbyZuhQmV2PllfKDbNt4THxgop6TXlYp KrDu3YzINf0DSFUgXNkjz5WGXnstLxjgn943YX54Xy5WBe9zxndOPedMBW/gHGM+ 3LdlnPaOM8OGWSu0PZxXXuLIu+oWUcB8oUKaeIMa8Yv1Zb9WIPXe6m3AlAebkfDB 9yDFjcmWS5Fpc/qaXYqrxGMoVZc22GyhijdVn1jd7tK9TJAtGpoMQrQArfcQdJb3
Re: Accessing ServletContext from WebSocket endpoint
On 07/12/2013 14:33, Christopher Schultz wrote: In this case, it's pretty clear that there is a quite desirable feature missing from the spec and I think it might be reasonable to violate it in this instance. I'd prefer to get Mark or Konstantin to weigh-in on such a step, because it might set a bad precedent for Tomcat. The spec doesn't say the container can't put its own objects in to the session user properties collection :) We already have a custom property to enable users to control the blocking read/write timeout (another spec oversight). I'd have no objection to an org.apache.tomcat.websocket.SERVLET_CONTEXT property being added. If the WebSocket spec adds a property it will be in the javax.websocket namespace and we can always support both. They may opt to simply add a property on the session. The patch to do this looks to be pretty minimal. I'm certainly not going to commit that myself. :) Trunk and 7.0.x are CTR so you would be well within your rights to commit first. It is often useful to discuss more complex / invasive patches before the commit but I don't think there is much more to discuss here. Mark - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org
Re: Accessing ServletContext from WebSocket endpoint
I ask the same question yes, but i still don't see a way to really do that nicely through an EndpointConfig So if somebody has a nice example that gets the Servletcontext that i then can access in the websocket instance that would be nice This example should be something different then what is given here: http://stackoverflow.com/questions/17936440/accessing-httpsession-from-httpservletrequest-in-a-web-socket-socketendpoint because i only see currently api to get the HttpSession and then through that the ServletContext, problem is that there is no http session.. On 5 December 2013 21:18, Violeta Georgieva miles...@gmail.com wrote: Hi, 2013/12/5 Enrico Olivelli eolive...@gmail.com Hi, is there a standard way to access ServletContext from a WebSocket ServerEndpoint ? Recently there was such discussion: http://markmail.org/message/pqkzatjastefxvd6?q=Tomcat+8+Websockets+configuration+list:org%2Eapache%2Etomcat%2Euser/ Regards Violeta -- Johan Compagner Servoy
Re: Accessing ServletContext from WebSocket endpoint
Johan, On 12/6/13, 3:53 AM, Johan Compagner wrote: I ask the same question yes, but i still don't see a way to really do that nicely through an EndpointConfig EndpointConfig.getUserProperties().put(ServletContext, ((HttpSession)request.getHttpSession()).getServletContext()); ?? It's ugly, but, as someone said, it does require that you do your own plumbing. There may be a cleaner way to get the servlet context e.g. not having to create an HttpSession. It seems clear that HandshareRequest ought to have a getServletContext method as well as a getSession method. So if somebody has a nice example that gets the Servletcontext that i then can access in the websocket instance that would be nice This example should be something different then what is given here: http://stackoverflow.com/questions/17936440/accessing-httpsession-from-httpservletrequest-in-a-web-socket-socketendpoint because i only see currently api to get the HttpSession and then through that the ServletContext, problem is that there is no http session.. Aah... if there is no session, getHttpSession doesn't automatically create one(). Boo. Clearly this is an opportunity for the EG to step in and correct an oversight. -chris - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org
Re: Accessing ServletContext from WebSocket endpoint
On Sat, Dec 7, 2013 at 5:48 AM, Christopher Schultz ch...@christopherschultz.net wrote: Johan, On 12/6/13, 3:53 AM, Johan Compagner wrote: I ask the same question yes, but i still don't see a way to really do that nicely through an EndpointConfig EndpointConfig.getUserProperties().put(ServletContext, ((HttpSession)request.getHttpSession()).getServletContext()); ?? It's ugly, but, as someone said, it does require that you do your own plumbing. There may be a cleaner way to get the servlet context e.g. not having to create an HttpSession. It seems clear that HandshareRequest ought to have a getServletContext method as well as a getSession method. So if somebody has a nice example that gets the Servletcontext that i then can access in the websocket instance that would be nice This example should be something different then what is given here: http://stackoverflow.com/questions/17936440/accessing-httpsession-from-httpservletrequest-in-a-web-socket-socketendpoint because i only see currently api to get the HttpSession and then through that the ServletContext, problem is that there is no http session.. Aah... if there is no session, getHttpSession doesn't automatically create one(). Boo. Clearly this is an opportunity for the EG to step in and correct an oversight. Fully agree with Chis. Making jsr 356 a generic clearly does not meet current needs and use cases to the extend it should. Looking forward to Java API WebSocket 2.0 I guess logging feedback on JSR jira [1] will help improving the next release... [1] https://java.net/jira/browse/WEBSOCKET_SPEC -chris - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org
Accessing ServletContext from WebSocket endpoint
Hi, is there a standard way to access ServletContext from a WebSocket ServerEndpoint ? thank you Tomcat is great Enrico Olivelli - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org
Re: Accessing ServletContext from WebSocket endpoint
Hi, 2013/12/5 Enrico Olivelli eolive...@gmail.com Hi, is there a standard way to access ServletContext from a WebSocket ServerEndpoint ? Recently there was such discussion: http://markmail.org/message/pqkzatjastefxvd6?q=Tomcat+8+Websockets+configuration+list:org%2Eapache%2Etomcat%2Euser/ Regards Violeta