Thanks Paul! That did the trick. I too found it a bit annoying that one
couldn't retrieve and modify the context.
=Ron=
Paul Sandoz wrote:
> Hi Ronald,
>
> I think the problem is because the HttpServerFactory.create is
> creating a context as follows:
>
> final HttpServer server = (scheme.equalsIgnoreCase("http")) ?
> HttpServer.create(new InetSocketAddress(port), 0) :
> HttpsServer.create(new InetSocketAddress(port), 0);
>
> server.createContext(path, handler);
> return server;
>
> But that context is not accessible. You are then creating a new context:
>
> HttpContext context = server.createContext("/", handler);
>
> and this is confusing the HTTP server.
>
> Try doing the following:
>
> server.removeContext("/");
> HttpContext context = server.createContext("/", handler);
>
> Frustratingly there is no way to obtain an existing context from the
> server.
>
> Perhaps i can add methods to
>
> HttpServer HttpServerFactory(String uri):
> HttpServer HttpServerFactory(URI uri):
>
> to return a server configured for a URI but with no contexts created.
> Then you can create one or more contexts yourself and configure them.
>
> Note that i need to fix the Jersey HttpHandler to support the JAX-RS
> SecurityContext with the information from the HttpExchange so that you
> can access the Principle instance. Perhaps i should also allow
> injection of HttpExchange...
>
> Paul.
>
> Ronald J Mann wrote:
>> Hi!
>>
>> I'm trying to build a simple management interface over http that
>> requires basic authentication. As we are trying to make this as
>> lightweight as possible, I'm using com.sun.net.httpserver.HttpServer.
>> I want to supply my own credential check, so I've created a class to
>> extend the BasicAuthenticator and have overriden the
>> checkCredentials() method to supply the necessary verification.
>>
>> I start my server thus:
>>
>> HttpHandler handler =
>> ContainerFactory.createContainer(HttpHandler.class);
>> server = HttpServerFactory.create("http://localhost:" + port +
>> "/", handler);
>> HttpContext context = server.createContext("/", handler);
>> context.setAuthenticator(new CWSAuthenticator(agent.getRootName()));
>> server.start();
>>
>> One of my resouces looks like this:
>> @Path( "/info")
>> public class InfoResource {
>> @GET @ProduceMime("application/json")
>> public String getInfo() {
>> try {
>> Info info = new CWSInfo();
>> info.setCount(agent.getCount());
>> etc...
>> return info.toJson();
>> } catch (Exception ex) {
>> ex.printStackTrace();
>> throw new NotFoundException("Could not retrieve the
>> Info Document requested. ");
>> }
>> }
>>
>> With this code, when I try to retrieve the document, I never get to
>> my authenticator code, but my info document is returned correctly. If
>> I alter the creation argument for the HttpContext from "/" to "/info"
>> in the server creation above, I authenticate properly but I get a 404
>> error as the doc is not found, presumably the resource was never
>> called. I'm assuming that somehow the contexts are conflicting (or
>> overriding eacthother) whcih would explain this behavior.
>>
>> Clearly I'm missing something here, does anyone have any suggestions
>> as to I could supply my own authentication mechanism?
>> Thanks!
>>
>> =Ron=
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
>> For additional commands, e-mail: users-help_at_jersey.dev.java.net
>>
>