php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #57542 php5servlet support for java 1.5 or 1.6
Submitted: 2007-02-22 04:30 UTC Modified: 2007-03-06 17:45 UTC
From: camille dot gauthier at neuf dot fr Assigned: wiesemann (profile)
Status: Not a bug Package: PECL bug system (PECL)
PHP Version: 5.2.1 OS: windows
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: camille dot gauthier at neuf dot fr
New email:
PHP Version: OS:

 

 [2007-02-22 04:30 UTC] camille dot gauthier at neuf dot fr
Description:
------------
the last version of servlet.java in php5servlet.jar is not java5/6 compatible; it is linked to the fact that servlet.java uses enum (new reserved java word) for a local variable name; to fix that issue, it is sufficient to replace enum by en for example; i have recompiled it, rebuilt php5servlet.jar with it and now php over tomcat works fine. the complete new code for servlet.java is pasted below:

/*
   +----------------------------------------------------------------------+
   | PHP Version 4                                                        |
   +----------------------------------------------------------------------+
   | Copyright (c) 1997-2006 The PHP Group                                |
   +----------------------------------------------------------------------+
   | This source file is subject to version 3.01 of the PHP license,      |
   | that is bundled with this package in the file LICENSE, and is        |
   | available through the world-wide-web at the following url:           |
   | http://www.php.net/license/3_01.txt                                  |
   | If you did not receive a copy of the PHP license and are unable to   |
   | obtain it through the world-wide-web, please send a note to          |
   | license@php.net so we can mail you a copy immediately.               |
   +----------------------------------------------------------------------+
   | Author: Sam Ruby (rubys@us.ibm.com)                                  |
   +----------------------------------------------------------------------+
*/

/* $Id: servlet.java,v 1.19.8.1.8.1 2006/01/01 13:47:02 sniper Exp $ */

package net.php;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.Enumeration;
import javax.servlet.*;
import javax.servlet.http.*;

import java.lang.reflect.Method;

public class servlet extends HttpServlet {
  char slash = System.getProperty("file.separator").charAt(0);

  HttpServletRequest  request;
  HttpServletResponse response;
  ServletInputStream  stream;

  static int startup_count = 0;

  protected boolean display_source_mode = false;
  private Method addHeader;

  // Native methods

  public native void startup();
  public native long define(String name);
  public native void send(String  requestMethod,
                          String  queryString,
                          String  pathInfo,
                          String  pathTranslated,
                          String  contentType,
                          int     contentLength,
                          String  authUser,
                          boolean display_source_mode
                         );
  public native void shutdown();

  // SAPI Callbacks

  public String readPost(int bytes) {
    String result;

    if (!request.getMethod().equals("POST")) {
      result = request.getQueryString();
    } else { 
      Enumeration enum = request.getParameterNames();
      String concat = "";
      result = "";

      while (enum.hasMoreElements()) {
        String name  = (String)enum.nextElement();
        String value = request.getParameter(name);

        try {
          result += concat + name + "=" + URLEncoder.encode(value, "UTF-8");
        }

        catch (Exception e) {
          e.printStackTrace(System.err);
        }

        concat = "&";
      }
    }

    if (result == null) return "";

    return result; 
  }

  public String readCookies() {
     reflect.setResult(define("request"),  request);
     reflect.setResult(define("response"), response);
     reflect.setResult(define("PHP_SELF"), request.getRequestURI());

     return request.getHeader("cookie");
  }

  public void header(String data) {
    // try to send the header using the most specific servlet API
    // as possible (some servlet engines will add a content type
    // header unless the setContentType method is called).
    try {
      if (data.startsWith("Content-type: ")) {
        response.setContentType(data.substring(data.indexOf(" ") + 1));
      }

      else if (data.startsWith("Location: ")) {
        response.sendRedirect(data.substring(data.indexOf(" ") + 1));
      } else if (data.startsWith("HTTP/1")) {
      	return; // this one is added from servlet container (Tomcat 4.1), we have to check for others
      }

      else {
        int colon = data.indexOf(": ");

        if (colon > 0) {
          try {
            addHeader.invoke(response, new Object[]
              { data.substring(0, colon), data.substring(colon + 2) } );
          }

          catch (Exception e) {
            e.printStackTrace(System.err);
          }
        }

        else {
          write(data);
        }
      }
    }

    catch (IOException e) {
      e.printStackTrace(System.err);
    }
  }

  public void write(String data) {
    try {
      response.getWriter().print(data);
    }

    catch (IOException e) {
      e.printStackTrace(System.err);
    }
  }

  // Servlet interface

  public void init(ServletConfig config)
  throws ServletException {
    super.init(config);

    // first time in, initialize native code
    if (0 == startup_count++) {
      reflect.loadLibrary("servlet");
      startup();
    }

    // try to find the addHeader method (added in the servlet API 2.2)
    // otherwise settle for the setHeader method

    try {
      Class c = Class.forName("javax.servlet.http.HttpServletResponse");
      Method method[] = c.getDeclaredMethods();

      for (int i = 0; i < method.length; i++) {
        if (method[i].getName().equals("addHeader")) {
          addHeader = method[i];
          break;
        }

        if (method[i].getName().equals("setHeader")) {
          addHeader = method[i];
        }
      }
    }

    catch (Exception e) {
      e.printStackTrace(System.err);
    }
  }

  public void service(HttpServletRequest request, HttpServletResponse response, String contextPath)
  throws ServletException {
    this.request  = request;
    this.response = response;

    send(request.getMethod(),
         request.getQueryString(),
         request.getRequestURI(),
         contextPath,
         request.getContentType(),
         request.getContentLength(),
         request.getRemoteUser(),
         display_source_mode
        );

    try {
      if (stream != null) stream.close();
    }

    catch (IOException e) {
      throw new ServletException(e.toString());
    }
  }

  public void service(HttpServletRequest request, HttpServletResponse response)
  throws ServletException {
    String servletPath = request.getServletPath();
    String contextPath = getServletContext().getRealPath(servletPath);

    service(request, response, contextPath);
  }

  public void destroy() {
    if (0 == --startup_count) shutdown();
    super.destroy();
  }
}



Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2007-03-06 17:45 UTC] wiesemann@php.net
This is not a bug -- neither in PEAR nor in the Bug system of pear.php.net. Maybe this should be reported to bugs.php.net ...
 [2007-04-20 02:26 UTC] biplab_babu at rediffmail dot com
i want to run php5 by using tomcat6 pls.. help me .
how i will get php5servlet.jar file
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Fri Dec 27 05:01:27 2024 UTC