eclipse-basyx / basyx-java-server-sdk

MIT License
49 stars 42 forks source link

Invoking /shells?cursor=x returns 500 #322

Open otto-ifak opened 1 week ago

otto-ifak commented 1 week ago

I am using the docker setup from the examples folder. When I invoke

http://localhost:8081/shells?cursor=x

the server responds with error code 500.

The following exception is logged:

aas-env-1        | 2024-06-19T15:01:57.925Z ERROR 1 --- [nio-8081-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.StringIndexOutOfBoundsException: begin 0, end 3, length 2] with root cause
aas-env-1        | 
aas-env-1        | java.lang.StringIndexOutOfBoundsException: begin 0, end 3, length 2
aas-env-1        |      at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4606) ~[na:na]
aas-env-1        |      at java.base/java.lang.String.substring(String.java:2709) ~[na:na]
aas-env-1        |      at org.eclipse.digitaltwin.basyx.http.Base64UrlEncoder.decode(Base64UrlEncoder.java:60) ~[basyx.http-2.0.0-SNAPSHOT.jar!/:2.0.0-SNAPSHOT]
aas-env-1        |      at org.eclipse.digitaltwin.basyx.http.pagination.Base64UrlEncodedCursor.getDecodedCursor(Base64UrlEncodedCursor.java:45) ~[basyx.http-2.0.0-SNAPSHOT.jar!/:2.0.0-SNAPSHOT]
aas-env-1        |      at org.eclipse.digitaltwin.basyx.aasrepository.http.AasRepositoryApiHTTPController.getAllAssetAdministrationShells(AasRepositoryApiHTTPController.java:117) ~[basyx.aasrepository-http-2.0.0-SNAPSHOT.jar!/:2.0.0-SNAPSHOT]
aas-env-1        |      at jdk.internal.reflect.GeneratedMethodAccessor345.invoke(Unknown Source) ~[na:na]
aas-env-1        |      at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
aas-env-1        |      at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
aas-env-1        |      at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) ~[spring-aop-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:751) ~[spring-aop-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:141) ~[spring-context-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:751) ~[spring-aop-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) ~[spring-aop-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.eclipse.digitaltwin.basyx.aasrepository.http.AasRepositoryApiHTTPController$$SpringCGLIB$$0.getAllAssetAdministrationShells(<generated>) ~[basyx.aasrepository-http-2.0.0-SNAPSHOT.jar!/:2.0.0-SNAPSHOT]
aas-env-1        |      at jdk.internal.reflect.GeneratedMethodAccessor345.invoke(Unknown Source) ~[na:na]
aas-env-1        |      at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
aas-env-1        |      at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
aas-env-1        |      at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884) ~[spring-webmvc-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) ~[spring-webmvc-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1081) ~[spring-webmvc-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974) ~[spring-webmvc-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011) ~[spring-webmvc-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.0.12.jar!/:6.0.12]
aas-env-1        |      at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.0.12.jar!/:6.0.12]
aas-env-1        |      at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.eclipse.digitaltwin.basyx.http.HttpBaSyxHeader.doFilterInternal(HttpBaSyxHeader.java:53) ~[basyx.http-2.0.0-SNAPSHOT.jar!/:2.0.0-SNAPSHOT]
aas-env-1        |      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:109) ~[spring-web-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.12.jar!/:6.0.12]
aas-env-1        |      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:894) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1740) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-10.1.13.jar!/:na]
aas-env-1        |      at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na]
aaronzi commented 1 week ago

Hello Björn,

maybe I am missing something but why are you using x as a cursor? That would normally be a base64Url encoded cursor that is way longer than just one character.

To test this I requested the first shell and set the limit to 1. This returns a result and a server-generated cursor. I used the returned cursor to do another request looking like this:

http://localhost:8081/shells?cursor=aHR0cHM6Ly9hY3BsdC5vcmcvVGVzdF9Bc3NldEFkbWluaXN0cmF0aW9uU2hlbGw

This worked perfectly fine without returning an internal server error. I would agree that returning an internal server error is not the best behaviour but other than that I think this is working. Please correct me if I'm wrong.

otto-ifak commented 1 week ago

Hi Aaron, yes I am using the endpoint intentionally wrong. I was expecting the server to handle invalid cursors. However, it seems not to handle this appropriately as it returns an error code 500 (internal server error).