groovy
  1. groovy
  2. GROOVY-5289

Using GroovyServlet deployed to Tomcat with a multi-level context causes 404 errors

    Details

    • Type: Bug Bug
    • Status: Closed Closed
    • Priority: Minor Minor
    • Resolution: Fixed
    • Affects Version/s: 1.8.3, 1.8.5
    • Fix Version/s: 2.0.6, 1.8.9
    • Component/s: Groovlet / GSP
    • Labels:
      None
    • Environment:
      Ubuntu Linux, Tomcat 7
    • Number of attachments :
      3

      Description

      When deploying an application which use the GroovyServlet to Tomcat with a simple context, there are no problems. However, when deploying the same application to the same Tomcat instance using a multi-level context a 404 error is returned.

      Attaching a sample application which demonstrates this behavior. Simply run "mvn package" to create a WAR from the project. Take the "groovyweb.war" file from the "target" directory and deploy it to a Tomcat server. This will work just fine. Now take the same WAR file, rename it to "apps#groovyweb.war" and deploy it to Tomcat. Now a 404 is presented and in the log, a message indicates that the groovy script cannot be found.

      ----------------

      Looking into this, it appears that the "#" in the name is causing the problem. In the "loadScriptName" method of GroovyScriptEngine, it is calling "conn.getURL().getPath()" on the URLConnection to the resource. Because there is a "#" character in the URL, this only returns the part of the URL up to the "#" character.

      GroovyScriptEngine.java
      public Class loadScriptByName(String scriptName) throws ResourceException, ScriptException {
          URLConnection conn = rc.getResourceConnection(scriptName);
          String path = conn.getURL().getPath();
          ScriptCacheEntry entry = scriptCache.get(path);
          Class clazz = null;
          if (entry != null) clazz = entry.scriptClass;
          try {
              if (isSourceNewer(entry)) {
                  try {
                      String encoding = conn.getContentEncoding() != null ? conn.getContentEncoding() : "UTF-8";
                      clazz = groovyLoader.parseClass(DefaultGroovyMethods.getText(conn.getInputStream(), encoding), path);
                  } catch (IOException e) {
                      throw new ResourceException(e);
                  }
              }
          } finally {
              forceClose(conn);
          }
          return clazz;
      }
      
      1. AbstractHttpServlet.java.patch
        2 kB
        Daniel Mikusa
      2. AbstractHttpServletTest.groovy.patch
        3 kB
        Daniel Mikusa
      3. groovyweb.tar.gz
        2 kB
        Daniel Mikusa

        Activity

        Daniel Mikusa made changes -
        Field Original Value New Value
        Attachment AbstractHttpServlet.java.patch [ 58877 ]
        Attachment AbstractHttpServletTest.groovy.patch [ 58878 ]
        blackdrag blackdrag made changes -
        Status Open [ 1 ] Resolved [ 5 ]
        Assignee blackdrag blackdrag [ blackdrag ]
        Fix Version/s 2.0.6 [ 18852 ]
        Fix Version/s 1.8.9 [ 18778 ]
        Resolution Fixed [ 1 ]
        Paul King made changes -
        Status Resolved [ 5 ] Closed [ 6 ]

          People

          • Assignee:
            blackdrag blackdrag
            Reporter:
            Daniel Mikusa
          • Votes:
            1 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: