Hi,
as a workaround, you can still override the
TunnelService#createInboundFilter(Context) method in order to return an
instance your own subclass of TunnelFilter. especially, you can override
the "beforeHandle" method:
@Override
public int beforeHandle(Request request, Response response)
if (getTunnelService().isExtensionsTunnel()) {
processExtensions(request);
}
return super.beforeHandle(request, response) ;
}
where processExtensions could be as follow:
Method method = request.getMethod();
if (tunnelService.isPreferencesTunnel()) {
final Reference resourceRef = request.getResourceRef();
if (resourceRef.hasExtensions()) {
final ClientInfo clientInfo = request.getClientInfo();
boolean encodingFound = false;
boolean characterSetFound = false;
boolean mediaTypeFound = false;
boolean languageFound = false;
String extensions = resourceRef.getExtensions();
// Discover extensions from right to left and stop at the
first
// unknown extension. Only one extension per type of
metadata is
// also allowed: i.e. one language, one media type, one
// encoding, one character set.
while (true) {
final int lastIndexOfPoint =
extensions.lastIndexOf('.');
final String extension = extensions
.substring(lastIndexOfPoint + 1);
final Metadata metadata = getMetadata(extension);
if (!mediaTypeFound && (metadata instanceof MediaType))
{
updateMetadata(clientInfo, metadata);
mediaTypeFound = true;
} else if (!languageFound && (metadata instanceof
Language)) {
updateMetadata(clientInfo, metadata);
languageFound = true;
} else if (!characterSetFound
&& (metadata instanceof CharacterSet)) {
updateMetadata(clientInfo, metadata);
characterSetFound = true;
} else if (!encodingFound && (metadata instanceof
Encoding)) {
updateMetadata(clientInfo, metadata);
encodingFound = true;
} else {
// extension do not match -> break loop
break;
}
if (lastIndexOfPoint > 0) {
extensions = extensions.substring(0,
lastIndexOfPoint);
} else {
// no more extensions -> break loop
extensions = "";
break;
}
}
// Update the extensions if necessary
if (encodingFound || characterSetFound || mediaTypeFound
|| languageFound) {
resourceRef.setExtensions(extensions);
extensionsModified = true;
}
}
Best regards,
Thierry Boileau
Hello Lee,
>
> Sorry I misunderstood your question. You're right, the current
> implementation filter the extensions only for GET and HEAD requests... That
> sounds quite restrictive as content negotiation happens also for the other
> kind of requests.
> I've opened an issue for that :
> https://github.com/restlet/restlet-framework-java/issues/582
>
> Best regards,
> Thierry Boileau
>
>
>
> Thanks for the response. I have no trouble getting the right format by
>> setting the Accept header appropriately.
>>
>> Instead, I'm asking about setExtensionsTunnel. If I enable this, I don't
>> have to set the Accept header, I can just set a file extension at the end
>> of the URL path. Works great with @Get, but not with @Post.
>>
>> ------------------------------------------------------
>>
>> http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2958714
>>
>
>
------------------------------------------------------
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2958793