Yes, Jena bug, possibly related to the -1 length.
Recorded as:
https://issues.apache.org/jira/browse/JENA-1776
-1 is because Jena streams the content for a GSP PUT operation. It does
not know the length at the start of request. To get the length you have
to produce the content then send the request - which is not streaming.
A "feature" of HTTP.
So I'm guessing that the connection is not handled like the default (no
auth) version in some way but I don't know why.
RDFConnectionRemote has a builder and connectPW is just this:
public static RDFConnection connectPW(String URL, String user, String
password) {
BasicCredentialsProvider credsProvider =
new BasicCredentialsProvider();
Credentials credentials =
new UsernamePasswordCredentials(user, password);
credsProvider.setCredentials(AuthScope.ANY, credentials);
HttpClient client = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider)
.build();
return RDFConnectionRemote.create()
.destination(URL)
.httpClient(client)
.build();
}
so it is a matter for setting up the HttpClient correctly (setting it up
so it is closed after each use? This is the compromise HTTP requires -
stream once, or buffer and send length with connection reuse).
The normal, no auth default is
HttpOp.createPoolingHttpClientBuilder
Andy
FYI: I'm away, no development machine (if I even have internet access,
and that's not certain), for a week or so.
On 31/10/2019 14:45, Sebastian Trueg wrote:
So... a Jena bug then? Do you have an idea if there is something I can
configure in the HttpClient as a workaround?
On 31.10.19 15:18, Andy Seaborne wrote:
I can make it happen sporadically using Fuseki main (so no shiro, not a
webapp environment). It happens maybe one in four test runs.
It looks like a client-side problem - it creates the HTTP connection
each time and maybe something is cached in HttpClient. A hash-map-ism
would explain the "sporadically". If so, the # triples effect maybe
causing the timing to get changed a little.
Andy
On 31/10/2019 13:27, Sebastian Trueg wrote:
Interestingly it does not. Only going down to a really small number of
triples does work.
And to make sure I did implement manual HTTP DELETE+PUT via OkHttp which
works without problems on the same Fuseki instance.
Regards,
Sebastian
On 31.10.19 14:14, Andy Seaborne wrote:
Thanks.
Presumably it works if you create the RDFConnection once and reuse the
java object?
Andy
On 31/10/2019 12:10, Sebastian Trueg wrote:
Hi Andy,
- Fuseki started via "fuseki-server".
- shiro config attached
- "pdm-data-model" dataset created via attached config
- Simple test app attached which takes the fuseki dataset url as
parameter.
Hope this helps.
Regards,
Sebastian
On 31.10.19 11:55, Andy Seaborne wrote:
Sebastian,
Do you have a complete, minimal example, including the Fuseki setup
for
the user/password. Which Fuseki variant? war? full-jar? main?
Andy
PS Don't forget teh javadoc on connectPW : it's "basic auth"
On 31/10/2019 10:30, Sebastian Trueg wrote:
Hi everyone,
trying to use RDFConnection with Jena 3.13.1 to put a Model into a
remote Fuseki instance I encountered very strange behavior. First
off,
let me show my very simple code:
try(RDFConnection conn
= RDFConnectionFactory.connectPW(datasetUrl, "admin",
"admin")) {
conn.put(graphUri, model);
}
This works fine on its own and for very small models in general.
But as
soon as I repeat the exact same snippet of code, ie. run the same try
block twice I get a SocketException (Broken pipe) on the first
call to
RDFConnection::put.
So, to sum up:
- Single put works fine.
- A subsequent call to put will result in the first one already
throwing
an exception!
- Using a model with less than 100 triples results in both put
operations to succeed.
- In all this the Fuseki instance keeps on working.
Any ideas?
Regards,
Sebastian