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