| Summary: | [FileUpload] FileUploadProcessor cannot parse request | ||
|---|---|---|---|
| Product: | [RT] RAP | Reporter: | Austin Riddle <austin.riddle> |
| Component: | RWT | Assignee: | Project Inbox <rap-inbox> |
| Status: | RESOLVED FIXED | QA Contact: | |
| Severity: | normal | ||
| Priority: | P1 | ||
| Version: | 1.5 | ||
| Target Milestone: | 1.5 M1 | ||
| Hardware: | PC | ||
| OS: | Windows 7 | ||
| Whiteboard: | |||
|
Description
Austin Riddle
Upon upload an exception is thrown as a result of the call on FileUploadProcessor:73 osgi> 2011-07-20 11:35:10.297:WARN::ERROR: /rap;jsessionid=112234gkxvsn01rnho1c8ym5un java.lang.NullPointerException at org.eclipse.rwt.internal.uicallback.UICallBackManager.setHasRunnables(UICallBackManager.java:87) at org.eclipse.swt.widgets.Synchronizer$1.run(Synchronizer.java:83) at org.eclipse.rwt.internal.lifecycle.FakeContextUtil.runNonUIThreadWithFakeContext(FakeContextUtil.java:58) at org.eclipse.rwt.lifecycle.UICallBack.runNonUIThreadWithFakeContext(UICallBack.java:51) at org.eclipse.swt.widgets.Synchronizer.addLast(Synchronizer.java:81) at org.eclipse.swt.widgets.Synchronizer.asyncExec(Synchronizer.java:116) at org.eclipse.swt.widgets.Display.asyncExec(Display.java:1020) at org.eclipse.swt.internal.widgets.UploadPanel.uploadFailed(UploadPanel.java:280) at org.eclipse.rap.rwt.supplemental.fileupload.internal.FileUploadListenerList.notifyUploadFailed(FileUploadListenerList.java:56) at org.eclipse.rap.rwt.supplemental.fileupload.FileUploadEvent.dispatchFailed(FileUploadEvent.java:77) at org.eclipse.rap.rwt.supplemental.fileupload.internal.FileUploadTracker$InternalFileUploadEvent.dispatchAsFailed(FileUploadTracker.java:98) at org.eclipse.rap.rwt.supplemental.fileupload.internal.FileUploadTracker.handleFailed(FileUploadTracker.java:58) at org.eclipse.rap.rwt.supplemental.fileupload.internal.FileUploadProcessor.handleFileUpload(FileUploadProcessor.java:62) at org.eclipse.rap.rwt.supplemental.fileupload.internal.FileUploadServiceHandler.service(FileUploadServiceHandler.java:54) at org.eclipse.rwt.internal.service.ServiceManager$HandlerDispatcher.service(ServiceManager.java:32) at org.eclipse.rwt.internal.engine.RWTDelegate.doPost(RWTDelegate.java:44) at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) at org.eclipse.rap.rwt.osgi.internal.CutOffContextPathWrapper.service(CutOffContextPathWrapper.java:103) at org.eclipse.equinox.http.servlet.internal.ServletRegistration.service(ServletRegistration.java:61) at org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:126) at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:60) at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) at org.eclipse.equinox.http.jetty.internal.HttpServerManager$InternalHttpServiceServlet.service(HttpServerManager.java:317) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:326) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:939) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) After tracing into the Apache fileupload code it seems that a null pointer is thrown when an attempt to skip the preamble of the request is made. This occurs in FileUploadBase:844. Some additional info: - in v14_Maintenance branch the type of the request was org.eclipse.equinox.http.servlet.internal.HttpServletRequestAdaptor - in HEAD it is org.eclipse.rap.rwt.osgi.internal.CutOffContextPathWrapper$RequestWrapper (In reply to comment #2) This is the NPE: java.lang.NullPointerException at org.eclipse.rwt.internal.uicallback.UICallBackManager.setHasRunnables(UICallBackManager.java:87) at org.eclipse.swt.widgets.Synchronizer$1.run(Synchronizer.java:83) at org.eclipse.rwt.internal.lifecycle.FakeContextUtil.runNonUIThreadWithFakeContext(FakeContextUtil.java:58) at org.eclipse.rwt.lifecycle.UICallBack.runNonUIThreadWithFakeContext(UICallBack.java:51) at org.eclipse.swt.widgets.Synchronizer.addLast(Synchronizer.java:81) at org.eclipse.swt.widgets.Synchronizer.asyncExec(Synchronizer.java:116) at org.eclipse.swt.widgets.Display.asyncExec(Display.java:1020) at org.eclipse.swt.internal.widgets.UploadPanel.uploadProgress(UploadPanel.java:241) at org.eclipse.rap.rwt.supplemental.fileupload.internal.FileUploadListenerList.notifyUploadProgress(FileUploadListenerList.java:40) at org.eclipse.rap.rwt.supplemental.fileupload.FileUploadEvent.dispatchProgress(FileUploadEvent.java:69) at org.eclipse.rap.rwt.supplemental.fileupload.internal.FileUploadTracker$InternalFileUploadEvent.dispatchAsProgress(FileUploadTracker.java:90) at org.eclipse.rap.rwt.supplemental.fileupload.internal.FileUploadTracker.handleProgress(FileUploadTracker.java:50) at org.eclipse.rap.rwt.supplemental.fileupload.internal.FileUploadProcessor$1.update(FileUploadProcessor.java:111) at org.apache.commons.fileupload.MultipartStream$ProgressNotifier.notifyListener(MultipartStream.java:135) at org.apache.commons.fileupload.MultipartStream$ProgressNotifier.noteBytesRead(MultipartStream.java:124) at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:967) at org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:887) at java.io.InputStream.read(InputStream.java:85) at org.apache.commons.fileupload.util.Streams.copy(Streams.java:94) at org.apache.commons.fileupload.util.Streams.copy(Streams.java:64) at org.apache.commons.fileupload.MultipartStream.readBodyData(MultipartStream.java:593) at org.apache.commons.fileupload.MultipartStream.discardBodyData(MultipartStream.java:619) at org.apache.commons.fileupload.MultipartStream.skipPreamble(MultipartStream.java:638) at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.findNextItem(FileUploadBase.java:844) at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:825) at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:323) at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:341) at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126) at org.eclipse.rap.rwt.supplemental.fileupload.internal.FileUploadProcessor.readUploadedFileItem(FileUploadProcessor.java:74) at org.eclipse.rap.rwt.supplemental.fileupload.internal.FileUploadProcessor.handleFileUpload(FileUploadProcessor.java:43) at org.eclipse.rap.rwt.supplemental.fileupload.internal.FileUploadServiceHandler.service(FileUploadServiceHandler.java:54) at org.eclipse.rwt.internal.service.ServiceManager$HandlerDispatcher.service(ServiceManager.java:32) at org.eclipse.rwt.internal.engine.RWTDelegate.doPost(RWTDelegate.java:44) at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) at org.eclipse.rap.rwt.osgi.internal.CutOffContextPathWrapper.service(CutOffContextPathWrapper.java:103) at org.eclipse.equinox.http.servlet.internal.ServletRegistration.service(ServletRegistration.java:61) at org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:126) at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:60) at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) at org.eclipse.equinox.http.jetty.internal.HttpServerManager$InternalHttpServiceServlet.service(HttpServerManager.java:317) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:326) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:939) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) The cause of this issue was the UICallBackHandler which relied on the existence of a state info, while service handler requests don't get a state info attached. Fixed by adding a null check to UICallBackManager#setHasRunnables. Changes are in CVS HEAD. Moreover, I opened bug 352954 to add a state info to all requests, not only ui requests. |