oh think i misunderstood, in fact you want the input value so potentially
the load balancer value, not always the ajp info right?

so i hope my fix will help

*Romain Manni-Bucau*
*Twitter: @rmannibucau <https://twitter.com/rmannibucau>*
*Blog: **http://rmannibucau.wordpress.com/*<http://rmannibucau.wordpress.com/>
*LinkedIn: **http://fr.linkedin.com/in/rmannibucau*
*Github: https://github.com/rmannibucau*



2013/2/7 Chet Hosey <[email protected]>

> AJP isn't generally exposed to the client at all.
>
> A typical configuration might include a web server such httpd or IIS
> listening on a public IP on port 80, and several Tomcat instances running
> AJP on private IP addresses. The web server is configured to route certain
> requests (like /appname/*) to a running Tomcat instance via AJP. If
> sessions are clustered, or the conversations are stateless, an
> administrator shut down an individual Tomcat instance without impacting
> external users.
>
> So a REST request would be made over HTTP (or HTTPS) to the web server,
> and routed to one of the Tomcat instances over AJP. There's nothing special
> about REST that makes AJP inappropriate; it's just a way of connecting a
> web server to Tomcat. But please consider an HTTP load balancer running on
> port 80, and sending requests to internal Tomcat instances running on ports
> 8080, 8081, etc. The client will send requests to port 80. But none of
> Tomcat servers' connectors will be bound to the same port. It would similar
> to AJP, in that the public port doesn't match the Tomcat connectors' listen
> ports. And all communication would be over HTTP.
>
> Even with requests over AJP, for example, a REST method can get an
> injected HttpServletRequest object. My test code demonstrates that. This is
> why I believe that the right behavior for UriInfo would be to match the
> behavior of the HttpServletRequest object. It generally works
> out-of-the-box, and there are already ways for an administrator to override
> the values returned by HttpServletRequest without having to alter the
> application.
>
> I'll try the latest snapshot, and put the AJP connector first as you
> advise. Please consider, though, that the correct public host / port may
> never match a connector's configuration, and that it may be better for
> UriInfo to get these values from an HttpServletRequest than to check the
> connectors.
>
> Thanks!
>
> On Feb 7, 2013, at 8:14 AM, Romain Manni-Bucau <[email protected]>
> wrote:
>
> > updated as possible as it was this feature
> >
> > can you try with the next snapshot please?
> >
> > where i doubt is when using ajp protocol you don't really respect REST
> > specification which relies on http only.
> >
> > *Romain Manni-Bucau*
> > *Twitter: @rmannibucau <https://twitter.com/rmannibucau>*
> > *Blog: **http://rmannibucau.wordpress.com/*<
> http://rmannibucau.wordpress.com/>
> > *LinkedIn: **http://fr.linkedin.com/in/rmannibucau*
> > *Github: https://github.com/rmannibucau*
> >
> >
> >
> > 2013/2/7 Romain Manni-Bucau <[email protected]>
> >
> >> Hmm, the point is it needs to select the connector to use for deployment
> >> (to compute the base address)...not sure of a clever way here
> >>
> >> Can you try to define ajp connector first in server.xml please?
> >> Le 7 févr. 2013 08:24, "Chet Hosey" <[email protected]> a écrit :
> >>
> >> To say that it's "deployed on HTTP" is inaccurate. It's deployed on
> >>> Tomcat, which TomEE is built around, and which provides more than one
> type
> >>> of connector.
> >>>
> >>> It's common to use httpd in front of Tomcat to serve static content,
> >>> balance between multiple workers, etc. It's reasonable that AJP support
> >>> might not be ready yet or might have been overlooked.
> >>>
> >>> The statements on the project's website suggest that the goal is to add
> >>> features to Tomcat without sacrificing functionality:
> >>>
> >>> - Goal: "Simple, Get more from Tomcat without giving anything up."
> >>> - Focuses: "Don't mess with Tomcat"
> >>> - TomEE doesn't "include Tomcat in some truncated and stripped-down
> form"
> >>> - With TomEE, there's "no picking and choosing individual parts of
> Tomcat
> >>> and building a 'new' server leveraging Tomcat."
> >>>
> >>> With such strong language, it would be surprising if the project didn't
> >>> plan to support AJP connections as it does HTTP.
> >>>
> >>> Might this be addressed in a future release? Can you suggest ways to
> >>> contribute?
> >>>
> >>>
> >>> On Feb 6, 2013, at 5:40 PM, Romain Manni-Bucau <[email protected]>
> >>> wrote:
> >>>
> >>>> because the REST service is deployed on HTTP not AJP
> >>>>
> >>>> *Romain Manni-Bucau*
> >>>> *Twitter: @rmannibucau <https://twitter.com/rmannibucau>*
> >>>> *Blog: **http://rmannibucau.wordpress.com/*<
> >>> http://rmannibucau.wordpress.com/>
> >>>> *LinkedIn: **http://fr.linkedin.com/in/rmannibucau*
> >>>> *Github: https://github.com/rmannibucau*
> >>>>
> >>>>
> >>>>
> >>>> 2013/2/6 Chet Hosey <[email protected]>
> >>>>
> >>>>>
> >>>>> That was my expectation too. But it just isn't working that way for
> me
> >>>>> with AJP.
> >>>>>
> >>>>> Apache httpd is listening on port 8888 and forwarding application
> >>> requests
> >>>>> (/rs-test/*) to TomEE via AJP. TomEE is listening on ports 8080 for
> >>> HTTP
> >>>>> and 8009 for AJP requests. If the UriInfo matched the request info,
> >>> then
> >>>>> the port number given should be 8080 when loading an app from TomEE
> >>>>> directly, and 8888 when using httpd to load the app via AJP.
> >>>>>
> >>>>> When I request http://servername:8080/rs-**test/<
> >>> http://servername:8080/rs-test/>to get content directly from TomEE via
> >>> HTTP, the UriInfo methods match the
> >>>>> request info, which also matches the server.xml host name and HTTP
> >>>>> connector port (8080). But when I request
> http://servername:8888/rs-**
> >>>>> test/ <http://servername:8888/rs-test/> to get content from TomEE
> over
> >>>>> AJP, UriInfo still lists the HTTP connector port (8080) instead of
> the
> >>>>> request port (8888). The HttpServletRequest and HttpHeaders objects
> do
> >>>>> return the request port, but UriInfo does not.
> >>>>>
> >>>>> What I tried:
> >>>>>
> >>>>> 1. Set up the environment
> >>>>>       1. export TESTDIR=/tmp/test
> >>>>>       2. mkdir -p $TESTDIR
> >>>>>       3. export JDK_HOME=/opt/java/jdk1.7.0_11
> >>>>>       4. export PATH=$JDK_HOME/bin:$PATH
> >>>>> 2. Download, build, and install Apache httpd
> >>>>>       1. Download and unpack httpd-2.2.23.tar.bz2
> >>>>>       2. cd httpd-2.2.23
> >>>>>       3. ./configure --prefix=$TESTDIR/httpd
> >>>>>       4. make && make install
> >>>>> 3. Download, build, and install mod_jk
> >>>>>       1. Download and unpack tomcat-connectors-1.2.37-src.**tar.gz
> >>>>>       2. cd tomcat-connectors-1.2.37-src/**native
> >>>>>       3. ./configure --with-apxs=$TESTDIR/httpd/**bin/apxs
> >>>>>       4. make && cp apache-2.0/mod_jk.so $TESTDIR/httpd/modules/
> >>>>> 4. Download and unpack apache-tomee-1.5.1-jaxrs.tar.**gz
> >>>>> 5. Configure Apache httpd
> >>>>>       1. Edit $TESTDIR/httpd/conf/httpd.conf
> >>>>>             1. Change Listen setting to port 8888 on public IP
> >>>>>             2. Append the following to load and configure mod_jk:
> >>>>>
> >>>>>          LoadModule jk_module modules/mod_jk.so
> >>>>>          JkWorkersFile $TESTDIR/httpd/conf/workers.**properties
> >>>>>          JkShmFile $TESTDIR/httpd/logs/mod_jk.shm
> >>>>>          JkLogFile $TESTDIR/httpd/logs/mod_jk.log
> >>>>>          JkLogLevel info
> >>>>>          JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
> >>>>>          JkMount /rs-test/* worker1
> >>>>>
> >>>>>       2. Create $TESTDIR/httpd/conf/workers.**properties with the
> >>>>>          following content:
> >>>>>
> >>>>>          worker.list=worker1
> >>>>>          worker.worker1.type=ajp13
> >>>>>          worker.worker1.host=localhost
> >>>>>          worker.worker1.port=8009
> >>>>>
> >>>>> 6. Configure TomEE and create test app
> >>>>>       1. Edit conf/server.xml:
> >>>>>             1. Add jvmRoute="worker1" to engine configuration
> >>>>>             2. Change Engine "defaultHost" and Host "name" values to
> >>>>>                external host name
> >>>>>       2. Create test application
> >>>>>             1. Create webapps/rs-test/WEB-INF/**classes/test
> >>> directory.
> >>>>>             2. Create
> >>> webapps/rs-test/WEB-INF/**classes/test/TestRS.java
> >>>>> with
> >>>>>                the following content:
> >>>>>
> >>>>>          package test;
> >>>>>          import java.net.URI;
> >>>>>          import javax.servlet.http.**HttpServletRequest;
> >>>>>          import javax.ws.rs.*;
> >>>>>          import javax.ws.rs.core.*;
> >>>>>          @Path("")
> >>>>>          public class TestRS {
> >>>>>
> >>>>>              @GET
> >>>>>              @Produces({MediaType.TEXT_**PLAIN})
> >>>>>              public String defaultPage(@Context UriInfo uriInfo,
> >>>>>                    @Context HttpHeaders hh, @Context
> >>>>>          HttpServletRequest httpServletRequest) {
> >>>>>                 String response =
> >>>>>                    "uriInfo.getAbsolutePath(): "
> >>>>>                       + uriInfo.getAbsolutePath() + "\n"
> >>>>>                    + "uriInfo.getBaseUri(): "
> >>>>>                       + uriInfo.getBaseUri() + "\n"
> >>>>>                    + "uriInfo.getRequestUri(): "
> >>>>>                       + uriInfo.getRequestUri() + "\n"
> >>>>>                    + "httpServletRequest.**getLocalAddr(): "
> >>>>>                       + httpServletRequest.**getLocalAddr() + "\n"
> >>>>>                    + "httpServletRequest.**getLocalName(): "
> >>>>>                       + httpServletRequest.**getLocalName() + "\n"
> >>>>>                    + "httpServletRequest.**getLocalPort(): "
> >>>>>                       + httpServletRequest.**getLocalPort() + "\n"
> >>>>>                    + "httpServletRequest.**getServerName(): "
> >>>>>                       + httpServletRequest.**getServerName() + "\n"
> >>>>>                    + "httpServletRequest.**getServerPort(): "
> >>>>>                       + httpServletRequest.**getServerPort() +
> "\n\n";
> >>>>>                 for (String header :
> >>> hh.getRequestHeaders().keySet(**))
> >>>>> {
> >>>>>                    response += header + ":\n";
> >>>>>                    for (String value :
> >>>>>          hh.getRequestHeaders().get(**header)) {
> >>>>>                       response += "\t" + value + "\n";
> >>>>>                    }
> >>>>>                 }
> >>>>>                 return response;
> >>>>>              }
> >>>>>          }
> >>>>>
> >>>>>         3. Compile test class with javac -classpath
> >>>>>            lib/javaee-api-6.0-4-tomcat.**jar:lib/servlet-api.jar
> >>>>>            webapps/rs-test/WEB-INF/**classes/test/TestRS.java
> >>>>>
> >>>>> 7. Start services
> >>>>>       1. Run apache-tomee-jaxrs-1.5.1/bin/**startup.sh to start TomEE
> >>>>>       2. Run httpd/bin/apachectl start to start httpd.
> >>>>>
> >>>>>
> >>>>>
> >>>>> On Wed, Feb 6, 2013 at 1:17 AM, Romain Manni-Bucau <
> >>> [email protected]<mailto:
> >>>>> [email protected]>**> wrote:
> >>>>>
> >>>>>  UriInfo matches the http request info...
> >>>>>  Le 6 févr. 2013 07:16, "Chet Hosey" <[email protected]
> >>>>>  <mailto:[email protected]>> a écrit :
> >>>>>
> >>>>>
> >>>>>> After building httpd 2.2.23 and mod_jk 1.2.37, I configured an
> >>>>>  AJP proxy
> >>>>>> for the TomEE test instance and set the jvmRoute in server.xml to
> >>>>>  match the
> >>>>>> worker name from workers.properties.
> >>>>>>
> >>>>>> A request through httpd shows httpd's port number for the
> >>>>>> httpServletRequest methods, but still shows the TomEE HTTP
> >>>>>  connector port
> >>>>>> in the URIs returned by the uriInfo methods.
> >>>>>>
> >>>>>> Doing string replacements seems fairly inelegant but I suppose
> >>>>>  it's an
> >>>>>> option for custom apps. It would be surprising to learn that the
> >>>>>  only other
> >>>>>> option is to configure the TomEE instances' HTTP connectors on
> >>>>>  the same
> >>>>>> port as the httpd server, since each TomEE instance would then need
> a
> >>>>>> dedicated IP.
> >>>>>>
> >>>>>> I've filed TOMEE-757 in JIRA, as it's hard to imagine that this
> >>>>>  behavior is
> >>>>>> intended.
> >>>>>>
> >>>>>>
> >>>>>> On Tue, Feb 5, 2013 at 9:17 AM, Chet Hosey <[email protected]
> >>>>>  <mailto:[email protected]>> wrote:
> >>>>>>
> >>>>>>> Ahh, that's a good thought. It was the default value of
> >>>>>  "localhost".
> >>>>>> After
> >>>>>>> changing the "name" attribute on the Host entry and updating the
> >>>>>>> defaultHost on the Engine, I'm getting the expected host name
> >>>>>  in the
> >>>>>>> response.
> >>>>>>>
> >>>>>>> This leads me to wonder what happens when using AJP. I'm
> >>>>>  picturing a
> >>>>>> setup
> >>>>>>> where httpd runs on port 80 and proxies to multiple TomEE
> >>>>>  instances via
> >>>>>>> AJP. If the HTTP connector port is still used by the UriInfo
> >>>>>  methods,
> >>>>>> then
> >>>>>>> TomEE would require special access (root or authbind) to bind
> >>>>>  to port 80
> >>>>>> to
> >>>>>>> work around this behavior. And it wouldn't be possible to run
> >>>>>  multiple
> >>>>>>> TomEE instances on the same IP, since they'd all have to bind
> >>>>>  to port 80
> >>>>>> to
> >>>>>>> ensure URI correctness.
> >>>>>>>
> >>>>>>> I'll have to experiment to find out. If I get the chance to do
> >>>>>  so, I'll
> >>>>>>> report results back.
> >>>>>>>
> >>>>>>> Thanks!
> >>>>>>>
> >>>>>>>
> >>>>>>> On Tue, Feb 5, 2013 at 1:16 AM, Romain Manni-Bucau <
> >>>>>> [email protected] <mailto:[email protected]>**>wrote:
> >>>>>
> >>>>>>>
> >>>>>>>> Hi,
> >>>>>>>>
> >>>>>>>> What's your host in the server.xml?
> >>>>>>>> Le 5 févr. 2013 06:30, "Chet Hosey" <[email protected]
> >>>>>  <mailto:[email protected]>> a écrit :
> >>>>>
> >>>>>>>>
> >>>>>>>>> I've been using apache-tomee-1.5.1-jaxrs as a platform for
> >>>>>  learning
> >>>>>>>> JAX-RS
> >>>>>>>>> and have run into some confusion about UriInfo determines
> >>>>>  the base
> >>>>>> URI.
> >>>>>>>> In
> >>>>>>>>> my testing the URIs returned by UriInfo include the correct port
> >>>>>> number.
> >>>>>>>>> But the host name is always "localhost", even when I'm
> >>>>>  accessing TomEE
> >>>>>>>> from
> >>>>>>>>> a remote machine.
> >>>>>>>>>
> >>>>>>>>> It's possible that UriInfo is meant to build identifiers,
> >>>>>  and not
> >>>>>>>> locators.
> >>>>>>>>> This would explain why it's not called UrlInfo. But the
> >>>>>  design of
> >>>>>>>>> UriBuilder suggests that one should be able to call
> >>>>>>>>>
> >>>>>>>>>  uriInfo.getBaseUriBuilder()
> >>>>>>>>>        .path(User.class, "getUserInfo")
> >>>>>>>>>        .path(userId).build();
> >>>>>>>>>
> >>>>>>>>> and use the result as a hyperlink in a JAX-RS response.
> >>>>>>>>>
> >>>>>>>>> Having used mod_jk with JBoss, I know that it can override
> >>>>>  the values
> >>>>>>>>> returned by HttpServletRequest methods with parameters like
> >>>>>>>> JK_LOCAL_NAME.
> >>>>>>>>> But since this is just a sandbox I'm accessing Tomcat directly,
> >>>>>> without
> >>>>>>>> an
> >>>>>>>>> Apache httpd proxy. But this led me to wonder what
> >>>>>>>>> httpServletRequest.**getlocalName() would return. So I created
> >>>>>  a test
> >>>>>>>> method
> >>>>>>>>> to find out, using the following signature:
> >>>>>>>>>
> >>>>>>>>>  @GET
> >>>>>>>>>  @Produces({MediaType.TEXT_**PLAIN})
> >>>>>>>>>  public String defaultPage(@Context UriInfo uriInfo,
> >>>>>>>>>        @Context HttpHeaders hh,
> >>>>>>>>>        @Context HttpServletRequest httpServletRequest) {
> >>>>>>>>>
> >>>>>>>>> The output surprised me. The HttpServletRequest methods use the
> >>>>>> correct
> >>>>>>>>> host name and IP address, and the "Host" header uses the public
> >>>>>> address.
> >>>>>>>>> The UriInfo methods get the port correct, but they still use
> >>>>>>>> "localhost" as
> >>>>>>>>> the host name.
> >>>>>>>>>
> >>>>>>>>>  uriInfo.getAbsolutePath():
> >>>>>>>>> http://localhost:8081/sample-**app-1.0-SNAPSHOT/<
> >>> http://localhost:8081/sample-app-1.0-SNAPSHOT/>
> >>>>>>>>>  uriInfo.getBaseUri():
> >>>>>> http://localhost:8081/sample-**app-1.0-SNAPSHOT<
> >>> http://localhost:8081/sample-app-1.0-SNAPSHOT>
> >>>>>>>>>  uriInfo.getRequestUri():
> >>>>>>>> http://localhost:8081/sample-**app-1.0-SNAPSHOT/<
> >>> http://localhost:8081/sample-app-1.0-SNAPSHOT/>
> >>>>>>>>>  httpServletRequest.**getLocalAddr(): 1.2.3.4
> >>>>>>>>>  httpServletRequest.**getLocalName(): www.example.com
> >>>>>  <http://www.example.com>
> >>>>>>>>>  httpServletRequest.**getLocalPort(): 8081
> >>>>>>>>>  httpServletRequest.**getServerName(): www.example.com
> >>>>>  <http://www.example.com>
> >>>>>>>>>  httpServletRequest.**getServerPort(): 8081
> >>>>>>>>>
> >>>>>>>>>  host:
> >>>>>>>>> www.example.com:8081 <http://www.example.com:8081>
> >>>>>
> >>>>>>>>>
> >>>>>>>>> Is there a way to use TomEE's embedded CXF REST
> >>>>>  implementation to
> >>>>>>>> generate
> >>>>>>>>> URIs that can be used by external clients to locate other
> >>>>>  resources
> >>>>>>>> within
> >>>>>>>>> the same application? Or am I making bad assumptions about
> >>>>>  the purpose
> >>>>>>>> of
> >>>>>>>>> the UriInfo methods that return UriBuilders?
> >>>>>>>>>
> >>>>>>>>> -- Chet
> >>>>>>>>>
> >>>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>
> >>>
>
>

Reply via email to