Uploaded image for project: 'Tapestry'
  1. Tapestry
  2. TAPESTRY-580

Form, PageLink, DirectLink, etc. should support a scheme parameter for controlling the scheme of the generated URL

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 4.0
    • 4.0
    • Framework
    • None

    Description

      This might have made it into 4.0-beta-4 if it had been submitted as a JIRA issue. Submitting patches onto the mailing list just doesn't work ... nobody can keep up with the mailing list! Please add this to JIRA.

      On 8/10/05, Jeremy <jkassis@jkassis.com> wrote:
      >
      >
      >
      > I'm submitting a patch to enable HTTP / HTTPS protocol switching that
      > comes on the heels of a couple of days of research. Hope you dig it!
      > Here's the background on why and what I did:
      >
      >
      >
      > First, I tried to get the container do it. Unfortunately, Tomcat is
      > good about getting you into HTTPS using a <security-constraint>, but not out.
      > There's no way to specify that a resource / page must be accessed
      > with HTTP.
      > So, I setup redirects in Tapestry. I added a property to my BasePage
      > (BasePage.secure) that indicates whether or not the page should be
      > accessed with HTTPS. Then in the BasePage.pageValidate method, I throw
      > a redirect to switch the protocol from http > https OR https > http as
      > necessary. This works, but if a listener method in PAGE-A (set for
      > http access) uses the RequestCycle to activate PAGE-B (set for http
      > access), then the pageValidate method of PAGE-B throws a redirect to
      > switch back to HTTP, the browser makes a request for PAGE-A again
      > using http, and the app's caught in an infinite redirect loop.
      > So, I setup the BasePage.pageValidate to just allow access when https
      > is used. But now the app has the same problem it had when I had
      > redirects working in tomcat: it can't get back to http.
      > So, I created a new ILinkRenderer that grabs the page name from its
      > underlying ILink, uses a PageSpecificationResolver to grab the page
      > specification, check for the declaration of BasePage.secure, and call
      > getAbsoluteUrl of the underlying ILink as necessary to output an HTTP
      > or HTTPS link. It works pretty well. But it doesn't work for Forms,
      > only for AbstractLinkComponent and its descendents. And it's hard to
      > grab the page name from the ILink at this point in rendering ? after
      > the LinkFactoryImpl applies ServiceEncoders that mess everything up.
      > At this point I decided to stop hacking around the issue and patch the
      > source. I gave EngineServiceLink two new parameters: _scheme and
      > _port. When a client calls EngineServiceLink.getUrl(),
      > EngineServiceLink checks its _scheme and _port properties. If _scheme
      > is not specified or the same as the scheme used to make the current
      > request, getUrl() does exactly what it did
      > before: it returns a relative url. If _scheme is specified and not
      > equal to the scheme used to make the current request, getUrl() returns
      > an absolute URL with the specified scheme and port through its getAbsoluteUrl method.
      > Then I set up my engine services to check for the BasePage.secure
      > property (what the custom ILinkRenderer did before) and override the
      > default scheme and port for the link.
      > Of course, I updated all the references to
      > LinkFactoryImpl.constructUrl in the default engine services and tests.
      >
      >
      >
      > Here's the patch:
      >
      >
      >
      >
      >
      >
      >
      >
      >
      >
      > ---------------------------------------------------------------------
      > To unsubscribe, e-mail:
      > tapestry-dev-unsubscribe@jakarta.apache.org
      > For additional commands, e-mail:
      > tapestry-dev-help@jakarta.apache.org
      >
      >
      >


      Howard M. Lewis Ship
      Independent J2EE / Open-Source Java Consultant Creator, Jakarta Tapestry Creator, Jakarta HiveMind

      Professional Tapestry training, mentoring, support and project work. http://howardlewisship.com

      Attachments

        1. patch.txt
          22 kB
          Jeremy F. Kassis
        2. patch.txt
          41 kB
          Jeremy F. Kassis

        Activity

          People

            hlship Howard Lewis Ship
            jkassis Jeremy F. Kassis
            Votes:
            2 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: