Uploaded image for project: 'mod_python'
  1. mod_python
  2. MODPYTHON-132

Expose ap_construct_url() in request object.

    Details

    • Type: Improvement
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 3.3.x
    • Fix Version/s: 3.3.1
    • Component/s: core
    • Labels:
      None

      Description

      Apache provides the function ap_construct_url(). Its purpose is:

      char *ap_construct_url (pool *p, const char *uri, const request_rec *r)

      This function builds a fully qualified URI string from the path specified
      by uri, using the information stored in the request record r to determine
      the server name and port. The port number is not included in the string
      if it is the same as the default port 80.

      For example, imagine that the current request is directed to the virtual
      server www.modperl.com at port 80. Then the following call will return
      the string http://www.modperl.com/ index.html:

      char *url = ap_construct_url(r->pool, "/index.html", r);

      This may be a solution to issue previously discussed about how to create a full URL for purpose of doing a redirect.

      Even if not perfect, should be exposed as req.construct_url(). After all, the Apache folks are more likely to get this correct and maintain it, better than we can do our own version in Python.

        Activity

        Hide
        grahamd Graham Dumpleton added a comment -

        This ap_construct_url() method held so much promise as far as solving the redirection issue. Unfortunately, it seems to get it wrong occasionally.

        req.the_request = GET /~grahamd/authenhandler/?invalidate HTTP/1.1

        req.headers_in["host"] = localhost:8080
        req.connection.local_addr = ('127.0.0.1', 8080)

        For whatever reason though in this one case, it spat out:

        http://localhost/~grahamd/authenhandler/login.html

        What happened to my port number?

        I think it is tied up with fact that request was against a directory and it was doing odd things based on DirectoryIndex value. Ie., Apache was trying multiple alternatives and after first somehow decided to not bother including port properly.

        But then, I was trying to use mod_python.util.redirect() in an authenhandler and it looks like the redirect function may actually be buggy. Specifically, mod_python.util.redirect() returns apache.OK when it should actually be returning apache.DONE as it forms a complete response. Because it wasn't returning apache.DONE, Apache kept trying to match files in DirectoryIndex when it should have given up after the first because a redirect response was being returned.

        Will have to do some testing and will have to post a distinct issue if it should be changed.

        Show
        grahamd Graham Dumpleton added a comment - This ap_construct_url() method held so much promise as far as solving the redirection issue. Unfortunately, it seems to get it wrong occasionally. req.the_request = GET /~grahamd/authenhandler/?invalidate HTTP/1.1 req.headers_in ["host"] = localhost:8080 req.connection.local_addr = ('127.0.0.1', 8080) For whatever reason though in this one case, it spat out: http://localhost/~grahamd/authenhandler/login.html What happened to my port number? I think it is tied up with fact that request was against a directory and it was doing odd things based on DirectoryIndex value. Ie., Apache was trying multiple alternatives and after first somehow decided to not bother including port properly. But then, I was trying to use mod_python.util.redirect() in an authenhandler and it looks like the redirect function may actually be buggy. Specifically, mod_python.util.redirect() returns apache.OK when it should actually be returning apache.DONE as it forms a complete response. Because it wasn't returning apache.DONE, Apache kept trying to match files in DirectoryIndex when it should have given up after the first because a redirect response was being returned. Will have to do some testing and will have to post a distinct issue if it should be changed.

          People

          • Assignee:
            grahamd Graham Dumpleton
            Reporter:
            grahamd Graham Dumpleton
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development