Discussion:
[basex-talk] oXygen XML, content negotiation and #1220
Omar Siam
2017-07-04 11:17:46 UTC
Permalink
Hi list!

I like my oXygen editor to request raw XML data from my RESTxq endpoints
to test XSL stylesheets. When I do this with RESTxq paths that have
different %rest:produces it fails with the BASX0003 multiple functions
error.

Turns out oXygen sends application/xml, */* as Accept header without any
quality.

I understand that as documented in
https://github.com/BaseXdb/basex/issues/1220 this is known not to work.

My/our workaround is to branch in a single XQuery function using sth. like:
if (some $a in tokenize(request:header("ACCEPT"), ',') satisfies $a =
('text/xml', 'application/xml')) then $xml else $xhtml

I hope this is still on the agenda for 8.7.

Best regards

Omar Siam
Christian Grün
2017-07-04 17:36:58 UTC
Permalink
Hi Omar,

Thanks for the reminder. Yes, we still plan to improve support for
quality factors in our RESTXQ implementation. We’ll probably need to
find out how this has been resolved in JAX-RS, and define an
equivalent solution for RESTXQ. I have updated the initial comment in
Issue 1220 [1].

I am also passing this on to Adam Retter, the initiator of RESTXQ:
Adam, did you think about adding support for quality factors in the
RESTXQ implementation of eXist-db?

And, Omar, I assume you would like to have chosen the function that
matches the first content types given in the Accept header?

Thanks everyone,
Christian

[1] https://github.com/BaseXdb/basex/issues/1220
Post by Omar Siam
Hi list!
I like my oXygen editor to request raw XML data from my RESTxq endpoints to
test XSL stylesheets. When I do this with RESTxq paths that have different
%rest:produces it fails with the BASX0003 multiple functions error.
Turns out oXygen sends application/xml, */* as Accept header without any
quality.
I understand that as documented in
https://github.com/BaseXdb/basex/issues/1220 this is known not to work.
if (some $a in tokenize(request:header("ACCEPT"), ',') satisfies $a =
('text/xml', 'application/xml')) then $xml else $xhtml
I hope this is still on the agenda for 8.7.
Best regards
Omar Siam
Omar Siam
2017-07-05 08:46:46 UTC
Permalink
Hi Christian,

Thanks for the answer. There is one thing I want to point out: My
problem is not the quality measure. I have problems because my client
lacks them. It sends 'application/xml,*/*' which is interpreted as: any
function that either satisfies application/xml or any other mime type.
Of course any othe mime type alone weill select more than one function
if there is more than one function specified for a path only
differentiated by mime/type in %rest:produces. The BaseX answer to this
is a BASX0003 error and therefore no meaningful result.

Although it is correct to assume */* does not really select any funtion
in particular I find that bahavior not helpful. I should be able to
specify what should be executed on */*.

Furthermore when some mime type is specified alongside */* I think that
*/* should be ignored and that mime type used instead.

Another solution would be to automatically assign a mime type more to
the left in the list a slightly higher quality measure so the problem of
a equal mime types can be solved. I even think there is some standard
about processing the Accept header in this manner but I may be wrong.

Best Regars

Omar
Post by Christian Grün
Hi Omar,
Thanks for the reminder. Yes, we still plan to improve support for
quality factors in our RESTXQ implementation. We’ll probably need to
find out how this has been resolved in JAX-RS, and define an
equivalent solution for RESTXQ. I have updated the initial comment in
Issue 1220 [1].
Adam, did you think about adding support for quality factors in the
RESTXQ implementation of eXist-db?
And, Omar, I assume you would like to have chosen the function that
matches the first content types given in the Accept header?
Thanks everyone,
Christian
[1] https://github.com/BaseXdb/basex/issues/1220
Post by Omar Siam
Hi list!
I like my oXygen editor to request raw XML data from my RESTxq endpoints to
test XSL stylesheets. When I do this with RESTxq paths that have different
%rest:produces it fails with the BASX0003 multiple functions error.
Turns out oXygen sends application/xml, */* as Accept header without any
quality.
I understand that as documented in
https://github.com/BaseXdb/basex/issues/1220 this is known not to work.
if (some $a in tokenize(request:header("ACCEPT"), ',') satisfies $a =
('text/xml', 'application/xml')) then $xml else $xhtml
I hope this is still on the agenda for 8.7.
Best regards
Omar Siam
Christian Grün
2017-07-09 15:10:55 UTC
Permalink
Hi Omar,
Thanks for the answer. There is one thing I want to point out: My problem is
not the quality measure. I have problems because my client lacks them.
Right, that’s what I understood. If quality factors are given, a
function should be chosen, but in your case,
BaseX doesn’t seem to be able to give preference to one of the two
given content types.

For more details, I’ll definitely have to check how content type
negotiation works in JAX-RS [1]. In nearly all cases, it was a good
choice to adopt the rules that had been specified in this API. If it
turns out that the given case is implementation-defined, it may be a
good decision to prefer the first given content type.

Cheers,
Christian

[1] https://jcp.org/en/jsr/detail?id=339
sends 'application/xml,*/*' which is interpreted as: any function that
either satisfies application/xml or any other mime type. Of course any othe
mime type alone weill select more than one function if there is more than
one function specified for a path only differentiated by mime/type in
%rest:produces. The BaseX answer to this is a BASX0003 error and therefore
no meaningful result.
Although it is correct to assume */* does not really select any funtion in
particular I find that bahavior not helpful. I should be able to specify
what should be executed on */*.
Furthermore when some mime type is specified alongside */* I think that */*
should be ignored and that mime type used instead.
Another solution would be to automatically assign a mime type more to the
left in the list a slightly higher quality measure so the problem of a equal
mime types can be solved. I even think there is some standard about
processing the Accept header in this manner but I may be wrong.
Best Regars
Omar
Post by Christian Grün
Hi Omar,
Thanks for the reminder. Yes, we still plan to improve support for
quality factors in our RESTXQ implementation. We’ll probably need to
find out how this has been resolved in JAX-RS, and define an
equivalent solution for RESTXQ. I have updated the initial comment in
Issue 1220 [1].
Adam, did you think about adding support for quality factors in the
RESTXQ implementation of eXist-db?
And, Omar, I assume you would like to have chosen the function that
matches the first content types given in the Accept header?
Thanks everyone,
Christian
[1] https://github.com/BaseXdb/basex/issues/1220
Post by Omar Siam
Hi list!
I like my oXygen editor to request raw XML data from my RESTxq endpoints to
test XSL stylesheets. When I do this with RESTxq paths that have different
%rest:produces it fails with the BASX0003 multiple functions error.
Turns out oXygen sends application/xml, */* as Accept header without any
quality.
I understand that as documented in
https://github.com/BaseXdb/basex/issues/1220 this is known not to work.
if (some $a in tokenize(request:header("ACCEPT"), ',') satisfies $a =
('text/xml', 'application/xml')) then $xml else $xhtml
I hope this is still on the agenda for 8.7.
Best regards
Omar Siam
Emmanuel Chateau
2017-07-09 15:23:14 UTC
Permalink
Hallo Christian,

As you know I’m really interested by this issue.

On this topic, I was wondering if it could be possible to implement something to deal with path extensions in RESTXQ.
It would then be possible to perform later transparent content negotiation in the function.

For exemple :
```xquery

declare
%restxq:path('/path/{$path}')
function works() {
' '
}

declare
%restxq:path('/path/{$path}.json')
function works() {
' '
}

(: basex shouldn’t consider it like a duplicated path :)

```
And a way to get the file extension in the path as a parameter. I’m not sure that it is already possible with regex in path.

```xquery
declare
%restxq:path('/path/{$path}')
function works() {
' '
(: something to get the file extension back in a variable to do reason :)
}

```

Best regards,
Emmanuel
Post by Christian Grün
Hi Omar,
Thanks for the answer. There is one thing I want to point out: My problem is
not the quality measure. I have problems because my client lacks them.
Right, that’s what I understood. If quality factors are given, a
function should be chosen, but in your case,
BaseX doesn’t seem to be able to give preference to one of the two
given content types.
For more details, I’ll definitely have to check how content type
negotiation works in JAX-RS [1]. In nearly all cases, it was a good
choice to adopt the rules that had been specified in this API. If it
turns out that the given case is implementation-defined, it may be a
good decision to prefer the first given content type.
Cheers,
Christian
[1] https://jcp.org/en/jsr/detail?id=339
sends 'application/xml,*/*' which is interpreted as: any function that
either satisfies application/xml or any other mime type. Of course any othe
mime type alone weill select more than one function if there is more than
one function specified for a path only differentiated by mime/type in
%rest:produces. The BaseX answer to this is a BASX0003 error and therefore
no meaningful result.
Although it is correct to assume */* does not really select any funtion in
particular I find that bahavior not helpful. I should be able to specify
what should be executed on */*.
Furthermore when some mime type is specified alongside */* I think that */*
should be ignored and that mime type used instead.
Another solution would be to automatically assign a mime type more to the
left in the list a slightly higher quality measure so the problem of a equal
mime types can be solved. I even think there is some standard about
processing the Accept header in this manner but I may be wrong.
Best Regars
Omar
Post by Christian Grün
Hi Omar,
Thanks for the reminder. Yes, we still plan to improve support for
quality factors in our RESTXQ implementation. We’ll probably need to
find out how this has been resolved in JAX-RS, and define an
equivalent solution for RESTXQ. I have updated the initial comment in
Issue 1220 [1].
Adam, did you think about adding support for quality factors in the
RESTXQ implementation of eXist-db?
And, Omar, I assume you would like to have chosen the function that
matches the first content types given in the Accept header?
Thanks everyone,
Christian
[1] https://github.com/BaseXdb/basex/issues/1220
Post by Omar Siam
Hi list!
I like my oXygen editor to request raw XML data from my RESTxq endpoints to
test XSL stylesheets. When I do this with RESTxq paths that have different
%rest:produces it fails with the BASX0003 multiple functions error.
Turns out oXygen sends application/xml, */* as Accept header without any
quality.
I understand that as documented in
https://github.com/BaseXdb/basex/issues/1220 this is known not to work.
if (some $a in tokenize(request:header("ACCEPT"), ',') satisfies $a =
('text/xml', 'application/xml')) then $xml else $xhtml
I hope this is still on the agenda for 8.7.
Best regards
Omar Siam
Christian Grün
2017-07-09 15:39:59 UTC
Permalink
Hi Emmanuel,

Thanks for you mail. Indeed I believe that the path extensions are already
covered by the regex syntax [1]; did you already try it out?

Cheers,
Christian

[1] http://docs.basex.org/wiki/RESTXQ#Paths



Am 09.07.2017 17:23 schrieb "Emmanuel Chateau" <***@laposte.net>:

Hallo Christian,

As you know I’m really interested by this issue.

On this topic, I was wondering if it could be possible to implement
something to deal with path extensions in RESTXQ.
It would then be possible to perform later transparent content negotiation
in the function.

For exemple :
```xquery

declare
%restxq:path('/path/{$path}')
function works() {
' '
}

declare
%restxq:path('/path/{$path}.json')
function works() {
' '
}

(: basex shouldn’t consider it like a duplicated path :)

```
And a way to get the file extension in the path as a parameter. I’m not
sure that it is already possible with regex in path.

```xquery
declare
%restxq:path('/path/{$path}')
function works() {
' '
(: something to get the file extension back in a variable to do reason :)
}

```

Best regards,
Emmanuel
Post by Christian Grün
Hi Omar,
Thanks for the answer. There is one thing I want to point out: My problem is
not the quality measure. I have problems because my client lacks them.
Right, that’s what I understood. If quality factors are given, a
function should be chosen, but in your case,
BaseX doesn’t seem to be able to give preference to one of the two
given content types.
For more details, I’ll definitely have to check how content type
negotiation works in JAX-RS [1]. In nearly all cases, it was a good
choice to adopt the rules that had been specified in this API. If it
turns out that the given case is implementation-defined, it may be a
good decision to prefer the first given content type.
Cheers,
Christian
[1] https://jcp.org/en/jsr/detail?id=339
sends 'application/xml,*/*' which is interpreted as: any function that
either satisfies application/xml or any other mime type. Of course any othe
mime type alone weill select more than one function if there is more than
one function specified for a path only differentiated by mime/type in
%rest:produces. The BaseX answer to this is a BASX0003 error and therefore
no meaningful result.
Although it is correct to assume */* does not really select any funtion in
particular I find that bahavior not helpful. I should be able to specify
what should be executed on */*.
Furthermore when some mime type is specified alongside */* I think that */*
should be ignored and that mime type used instead.
Another solution would be to automatically assign a mime type more to the
left in the list a slightly higher quality measure so the problem of a equal
mime types can be solved. I even think there is some standard about
processing the Accept header in this manner but I may be wrong.
Best Regars
Omar
Post by Christian Grün
Hi Omar,
Thanks for the reminder. Yes, we still plan to improve support for
quality factors in our RESTXQ implementation. We’ll probably need to
find out how this has been resolved in JAX-RS, and define an
equivalent solution for RESTXQ. I have updated the initial comment in
Issue 1220 [1].
Adam, did you think about adding support for quality factors in the
RESTXQ implementation of eXist-db?
And, Omar, I assume you would like to have chosen the function that
matches the first content types given in the Accept header?
Thanks everyone,
Christian
[1] https://github.com/BaseXdb/basex/issues/1220
Post by Omar Siam
Hi list!
I like my oXygen editor to request raw XML data from my RESTxq endpoints
to
test XSL stylesheets. When I do this with RESTxq paths that have different
%rest:produces it fails with the BASX0003 multiple functions error.
Turns out oXygen sends application/xml, */* as Accept header without any
quality.
I understand that as documented in
https://github.com/BaseXdb/basex/issues/1220 this is known not to work.
if (some $a in tokenize(request:header("ACCEPT"), ',') satisfies $a =
('text/xml', 'application/xml')) then $xml else $xhtml
I hope this is still on the agenda for 8.7.
Best regards
Omar Siam
Emmanuel Chateau
2017-07-09 15:49:12 UTC
Permalink
I thought it could be done with it, but I didn’t managed with it. It’s because I didn’t figure out the parameter bring back the whole string and not only the matching part of the regex.

Thanks for your message because I tried again, and it works very fine. Marvelous !

I’ll try to give a working exemple in the doc.

Best regards,
Emmanuel
Post by Christian Grün
Hi Emmanuel,
Thanks for you mail. Indeed I believe that the path extensions are already covered by the regex syntax [1]; did you already try it out?
Cheers,
Christian
[1] http://docs.basex.org/wiki/RESTXQ#Paths <http://docs.basex.org/wiki/RESTXQ#Paths>
Hallo Christian,
As you know I’m really interested by this issue.
On this topic, I was wondering if it could be possible to implement something to deal with path extensions in RESTXQ.
It would then be possible to perform later transparent content negotiation in the function.
```xquery
declare
%restxq:path('/path/{$path}')
function works() {
' '
}
declare
%restxq:path('/path/{$path}.json')
function works() {
' '
}
(: basex shouldn’t consider it like a duplicated path :)
```
And a way to get the file extension in the path as a parameter. I’m not sure that it is already possible with regex in path.
```xquery
declare
%restxq:path('/path/{$path}')
function works() {
' '
(: something to get the file extension back in a variable to do reason :)
}
```
Best regards,
Emmanuel
Post by Christian Grün
Hi Omar,
Thanks for the answer. There is one thing I want to point out: My problem is
not the quality measure. I have problems because my client lacks them.
Right, that’s what I understood. If quality factors are given, a
function should be chosen, but in your case,
BaseX doesn’t seem to be able to give preference to one of the two
given content types.
For more details, I’ll definitely have to check how content type
negotiation works in JAX-RS [1]. In nearly all cases, it was a good
choice to adopt the rules that had been specified in this API. If it
turns out that the given case is implementation-defined, it may be a
good decision to prefer the first given content type.
Cheers,
Christian
[1] https://jcp.org/en/jsr/detail?id=339 <https://jcp.org/en/jsr/detail?id=339>
sends 'application/xml,*/*' which is interpreted as: any function that
either satisfies application/xml or any other mime type. Of course any othe
mime type alone weill select more than one function if there is more than
one function specified for a path only differentiated by mime/type in
%rest:produces. The BaseX answer to this is a BASX0003 error and therefore
no meaningful result.
Although it is correct to assume */* does not really select any funtion in
particular I find that bahavior not helpful. I should be able to specify
what should be executed on */*.
Furthermore when some mime type is specified alongside */* I think that */*
should be ignored and that mime type used instead.
Another solution would be to automatically assign a mime type more to the
left in the list a slightly higher quality measure so the problem of a equal
mime types can be solved. I even think there is some standard about
processing the Accept header in this manner but I may be wrong.
Best Regars
Omar
Post by Christian Grün
Hi Omar,
Thanks for the reminder. Yes, we still plan to improve support for
quality factors in our RESTXQ implementation. We’ll probably need to
find out how this has been resolved in JAX-RS, and define an
equivalent solution for RESTXQ. I have updated the initial comment in
Issue 1220 [1].
Adam, did you think about adding support for quality factors in the
RESTXQ implementation of eXist-db?
And, Omar, I assume you would like to have chosen the function that
matches the first content types given in the Accept header?
Thanks everyone,
Christian
[1] https://github.com/BaseXdb/basex/issues/1220 <https://github.com/BaseXdb/basex/issues/1220>
Post by Omar Siam
Hi list!
I like my oXygen editor to request raw XML data from my RESTxq endpoints to
test XSL stylesheets. When I do this with RESTxq paths that have different
%rest:produces it fails with the BASX0003 multiple functions error.
Turns out oXygen sends application/xml, */* as Accept header without any
quality.
I understand that as documented in
https://github.com/BaseXdb/basex/issues/1220 <https://github.com/BaseXdb/basex/issues/1220> this is known not to work.
if (some $a in tokenize(request:header("ACCEPT"), ',') satisfies $a =
('text/xml', 'application/xml')) then $xml else $xhtml
I hope this is still on the agenda for 8.7.
Best regards
Omar Siam
Loading...