The latest SNAPSHOTS now have the fix, you may need to add -U to your mvn
calls if you have recently updated SNAPSHOTs to get the very latest

Please test and confirm whether this resolves the issue

Rob


On 6/21/13 9:13 AM, "Rob Vesse" <[email protected]> wrote:

>Nice catch
>
>Yes I appear to have made an error, I never associated the created
>credentials provider with the HTTP Client
>
>Filed as JENA-475 (https://issues.apache.org/jira/browse/JENA-475)
>
>I will commit a fix ASAP and you should be able to pick up a
>2.10.2-SNAPSHOT build in a few hours with the fix, if you can test with
>the snapshot and report if this resolves the issue that would be great.
>
>You can verify whether the fix has gone into the snapshots by looking at
>https://builds.apache.org/job/Jena__Development_Test/changes and seeing if
>there is a build listed where the commit messages mention JENA-475
>
>Rob
>
>
>
>On 6/20/13 11:51 PM, "Arthur Vaïsse-Lesteven" <[email protected]>
>wrote:
>
>>Hi Rob, I'm in trouble with the basic authentication process ( I'm now
>>using ARQ 2.10.1 )
>>
>>
>>In one hand the Queries work like this :
>>when we calls one of the 4 method execX of a queryExecution, the
>>QueryEngineHTTP calls makeHttpQuery, and after few steps this code line
>>is executed : 
>>    httpConnection.setRequestProperty("Authorization", "Basic "+y) ;
>>where y contains userName:password 64Bits encrypted.
>>
>>This make the http request header contains the Key, Value couple :
>>"Authorization" "Basic username:password".
>>
>>I'm OK with this.
>>
>>In the other hand, the update seem to handle Basic Authentication in a
>>different way.
>>
>>I used this code :
>>
>>UpdateRequest update =
>> UpdateFactory.create(queryString);
>>UpdateProcessRemoteForm exec = (UpdateProcessRemoteForm)
>>UpdateExecutionFactory.createRemoteForm(update, service);
>>exec.setAuthentication("[email protected]", "savaillon".toCharArray());
>>
>>And I'm unable to retrieve the usename and the password.
>>Request contains following fields :
>>In headers : 
>>content-lenght : 273
>>content-type : application/x-www-form-urlencoded; charset=UTF-8
>>host : localhost:8080
>>conection : Keep-Alive
>>user-agent: Apache-HttpClient/4.2.3 (java 1.5)
>>In params : 
>>update : my update
>>No attribute.
>>
>>I tried to follow in the ARQ library the path of my username and
>>password, and finally they transited to the applyAuthentication in
>>HttpOp.
>>
>>This method create a CredentialsProvider and set the credentials username
>>and
>> password. But this method has a void return type, and I don't see any
>>communication point with the rest of the HttpOp code.
>>
>>Do I missed something ?
>>
>>VAÏSSE-LESTEVEN Arthur.
>>
>>
>>>I was using the 2.9.2 ARQ version. I'll update to 2.10.1.
>>>Thanks for your quick answer and for your work  Rob!
>>>
>>>VAÏSSE-LESTEVEN Arthur.
>>>
>>>
>>>>What version of ARQ are you using?
>>>>
>>>>I put changes in place which went into the 2.10.1 release which should
>>>>permit easy HTTP auth on SPARQL updates.  Both
>>>>UpdateExecutionFactory.createRemote() and
>>>>UpdateExecutionFactory.createRemoteForm() return an instance derived
>>>>from
>>>>UpdateProcessRemoteBase which has a setAuthentication() method
>>>>
>>>>If you are using a version of ARQ prior to 2.10.0 there is no common
>>>>base
>>>>class but both UpdateProcessRemote and UpdateProcessRemoteForm
>> would still
>>>>have a setHttpContext() method which allows you to pass in a
>>>>HttpContext
>>>>which can be used to pass in authentication settings using the
>>>>HttpClient
>>>>APIs.  Even with 2.10.1 you can still choose to use this method
>>>>particularly if you need to pass complex credentials.
>>>>
>>>>Rob
>>>>
>>>>
>>>>On 6/18/13 8:10 AM, "Arthur Vaïsse-Lesteven" <[email protected]>
>>>>wrote:
>>>>
>>>>>Hi,
>>>>>
>>>>>
>>>>>The remote execution of SPARQL queries offer the
>>>>>setBasicAuthentication
>>>>>fonctionality(1). I'm using it; and when I tried to use it with SPARQL
>>>>>Update it appears that SPARQL Update doesn't handle Authentication.
>>>>>I would like to know, do it exist any way to do the same thing in ARQ
>>>>>? I
>>>>>writted some code by extending 2 apache classes, but it would be
>> better
>>>>>to just use the API. Do you intend to not allow basicAuthentification
>>>>>?
>>>>>It is incompatible with http basic authentication ? There are only
>>>>>24hours per day and you don't had the time to do it yet ?
>>>>>
>>>>>Do this functionality is planed ?
>>>>>
>>>>>______________________________________________________________________
>>>>>_
>>>>>_
>>>>>
>>>>>(1) What i can write :
>>>>>
>>>>>[...]
>>>>>
>>>>>
>>>>>QueryEngineHTTP exec = (QueryEngineHTTP)
>>>>>QueryExecutionFactory.createServiceRequest(endpoint_URL, query);
>>>>>exec.setBasicAuthentication(user, password);
>>>>>
>>>>>exec.exec...
>>>>>
>>>>>[...]
>>>>>
>>>>>(2)What I want to write :
>>>>>
>>>>>[...]
>>>>>UpdateProcessRemote exec =
>> (UpdateProcessRemote)
>>>>>UpdateExecutionFactory.createRemote(update, endpoint_URL);
>>>>>exec.setBasicAuthentication(user, password);
>>>>>
>>>>>exec.excute();
>>>>>
>>>>>[...]
>>>>>
>>>>>
>>>>>
>>>>>I tried to custom the UpdateProcessRemote class to allow (2). This
>>>>>currently don't work on my computer, but it seem's to be due to a
>>>>>maven
>>>>>version conflict at level of HttpClient. This class must be compatible
>>>>>with current version of Jena.( I set my modifications in bold ).( also
>>>>>downlodable at : http://arthurvaisse.free.fr/classes/ )
>>>>>
>>>>>Thank you,
>>>>>VAÏSSE-LESTEVEN Arthur.
>>>>>
>>>>>
>>>>>______________________________________________________________________
>>>>>_
>>>>>_
>>>>>
>>>>>public class UpdateProcessRemote
>> implements UpdateProcessor{
>>>>>
>>>>>    private String user = null ;
>>>>>    private char[] password = null ;
>>>>>
>>>>>    private final UpdateRequest request ;
>>>>>    private final String endpoint ;
>>>>>
>>>>>    public UpdateProcessRemote(UpdateRequest request , String endpoint
>>>>>)
>>>>>    {
>>>>>        this.request = request ;
>>>>>        this.endpoint = endpoint ;
>>>>>
>>>>> }
>>>>>
>>>>>    @Override
>>>>>    public void setInitialBinding(QuerySolution binding)
>>>>>    {
>>>>>        throw new ARQException("Initial bindings
>> for a remote update
>>>>>execution request not supported") ;
>>>>>    }
>>>>>
>>>>>    @Override
>>>>>    public GraphStore getGraphStore()
>>>>>    {
>>>>>        return null ;
>>>>>    }
>>>>>
>>>>>    @Override
>>>>>    public void execute()
>>>>>    {
>>>>>        String reqStr = request.toString() ;
>>>>>      HttpOpCustom.execHttpPost(endpoint,
>>>>>WebContent.contentTypeSPARQLUpdate, reqStr, user, password);
>>>>>    }
>>>>>
>>>>>    //comes from QueryEngineHTTP.
>>>>>    public void
>> setBasicAuthentication(String user, char[] password)
>>>>>
>>>>> {
>>>>>        this.user = user ;
>>>>>        this.password = password ;
>>>>>    }
>>>>>______________________________________________________________________
>>>>>_
>>>>>_
>>>>>
>>>>>I added this functions to HttpOp to create my custom HttpOp :
>>>>>
>>>>>    //Just added credentials in parameters
>>>>>    public static void execHttpPost(String url, String contentType,
>>>>>String content, String user, char[] password)
>>>>>    {
>>>>>        execHttpPost(url, contentType, content, null, null, user,
>>>>>password) ;
>>>>>   
>> }
>>>>>
>>>>>
>>>>>    //Just added credentials in parameters
>>>>>    public static void execHttpPost(String url, String contentType,
>>>>>String content,
>>>>>            String acceptType, Map<String, HttpResponseHandler>
>>>>>handlers,
>>>>>            String user, char[] password)
>>>>>    {
>>>>>        StringEntity e = null ;
>>>>>        try
>>>>>        {
>>>>>            e = new StringEntity(content, "UTF-8") ;
>>>>>           
>> e.setContentType(contentType) ;
>>>>>            execHttpPost(url, e, acceptType, handlers, user, password)
>>>>>;
>>>>>        } catch (UnsupportedEncodingException e1)
>>>>>        {
>>>>>            throw new ARQInternalErrorException("Platform does not
>>>>>support required UTF-8") ;
>>>>>        } finally { closeEntity(e) ; }
>>>>>    }
>>>>>
>>>>>
>>>>>    public static void execHttpPost(String url,  HttpEntity provider,
>>>>>            String acceptType, Map<String, HttpResponseHandler>
>> handlers,
>>>>>            String user, char[] password)
>>>>>    {
>>>>>        try {
>>>>>            long id = counter.incrementAndGet() ;
>>>>>            String requestURI = determineBaseIRI(url) ;
>>>>>            String baseIRI = determineBaseIRI(requestURI) ;
>>>>>
>>>>>            HttpPost httppost = new HttpPost(requestURI);
>>>>>
>>>>>            if ( user != null || password !=
>> null){
>>>>>                if(user==null || password == null){
>>>>>                    log.warn("Only one of user/password is set") ;
>>>>>                }
>>>>>                //this code come from httpQuery
>>>>>                StringBuffer x = new StringBuffer() ;
>>>>>                byte b[] =
>>>>>x.append(user).append(":").append(password).toString().getBytes("UTF-8
>>>>>"
>>>>>)
>> ;
>>>>>                String y = Base64.encodeBase64String(b) ;
>>>>>                //this single code line is mine
>>>>>                httppost.addHeader("Authorization", "Basic "+y);
>>>>>            }
>>>>>            if ( log.isDebugEnabled() )
>>>>>                log.debug(format("[%d] %s %s",id
>>>>>,httppost.getMethod(),httppost.getURI().toString())) ;
>>>>>
>>>>>            if (
>> provider.getContentType() == null )
>>>>>                log.debug(format("[%d] No content type")) ;
>>>>>
>>>>>            // Execute
>>>>>            HttpClient httpclient = new DefaultHttpClient();
>>>>>            httppost.setEntity(provider) ;
>>>>>            HttpResponse response = httpclient.execute(httppost) ;
>>>>>            httpResponse(id, response, baseIRI, handlers) ;
>>>>>
>>>>>           
>> httpclient.getConnectionManager().shutdown();
>>>>>        } catch (IOException ex)
>>>>>        {
>>>>>            ex.printStackTrace(System.err) ;
>>>>>        }
>>>>>        finally { closeEntity(provider) ; }
>>>>>    }
>

Reply via email to