directory-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Shawn McKinney (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (FC-258) Updating the way FortResponse is served
Date Mon, 19 Nov 2018 21:26:00 GMT

    [ https://issues.apache.org/jira/browse/FC-258?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16692299#comment-16692299
] 

Shawn McKinney commented on FC-258:
-----------------------------------

OK, just now testing these changes in the FC-247 branch of enmasse.  When the fortress client
goes through enmasse it's getting HTTP 500 errors on certain test cases.

 

Reason being when fortress itself using REST incorrectly and has to process these HTTP status
codes.  Here's where HTTP post occurs,

 

    public String post( String userId, String password, String szInput, String function
) throws RestException
    {
        LOG.debug( "post uri=[{}], function=[{}], request=[{}]", uri, function, szInput
);
        String szResponse = null;
        HttpPost post = new HttpPost( uri + function);
        post.addHeader( "Accept", "text/xml" );
        setMethodHeaders( post );
        try
        {
            HttpEntity entity = new StringEntity( szInput, ContentType.TEXT_XML
);
            post.setEntity( entity );
            org.apache.http.client.HttpClient httpclient = HttpClientBuilder.create().useSystemProperties()
                .setDefaultCredentialsProvider(getCredentialProvider(userId,
password)).build();
            HttpResponse response = httpclient.execute( post );
            String error;

            switch ( response.getStatusLine().getStatusCode() )
            {
                case HTTP_OK :
                    szResponse = IOUtils.toString( response.getEntity().getContent(),
"UTF-8" );
                    LOG.debug( "post uri=[{}], function=[{}], response=[{}]",
uri, function, szResponse );
                    break;
                case HTTP_401_UNAUTHORIZED :
                    error = generateErrorMessage( uri, function, "401 function
unauthorized on host" );
                    LOG.error( error );
                    throw new RestException( GlobalErrIds.REST_UNAUTHORIZED_ERR,
error );
                case HTTP_403_FORBIDDEN :
                    error = generateErrorMessage( uri, function, "403 function
forbidden on host" );
                    LOG.error( error );
                    throw new RestException( GlobalErrIds.REST_FORBIDDEN_ERR,
error );
                case HTTP_404_NOT_FOUND :
                    error = generateErrorMessage( uri, function, "404 not
found from host" );
                    LOG.error( error );
                    throw new RestException( GlobalErrIds.REST_NOT_FOUND_ERR,
error );
                default :
                    error = generateErrorMessage( uri, function, "error
received from host: " + response.getStatusLine().getStatusCode() );
                    LOG.error( error );
                    throw new RestException( GlobalErrIds.REST_UNKNOWN_ERR,
error );
            }
        }

> Updating the way FortResponse is served
> ---------------------------------------
>
>                 Key: FC-258
>                 URL: https://issues.apache.org/jira/browse/FC-258
>             Project: FORTRESS
>          Issue Type: Bug
>            Reporter: Kiran Ayyagari
>            Priority: Major
>
> The FortResponse instance created as a result of operation exception is still sent to
the client with a HTTP status code of "200 OK" forcing clients to rely on the {{errorCode}}
field to figure out the actual status of the operation.
> For example when the below request is sent to a stock Fortress REST service
> {code}
> curl -POST http://localhost:7070/fortress-rest/userAdd --header "Content-Type: application/json"
--header "Accept: application/json" --header "Authorization: Basic dGVzdDpwYXNzd29yZA==" -v
-d '{ "entity": { "fqcn": "org.apache.directory.fortress.core.model.User", "userId": "test1",
"ou": "non-existing-ou" }, "contextId": "HOME" }'
> {code}
> the below success response is received though the request was failed due to a validation
error which ideally should have been responded with a "400 bad request" error.
> {code}
> *   Trying ::1...
> * TCP_NODELAY set
> * Connected to localhost (::1) port 7070 (#0)
> > POST /fortress-rest/userAdd HTTP/1.1
> > Host: localhost:7070
> > User-Agent: curl/7.54.0
> > Content-Type: application/json
> > Accept: application/json
> > Authorization: Basic dGVzdDpwYXNzd29yZA==
> > Content-Length: 138
> > 
> * upload completely sent off: 138 out of 138 bytes
> < HTTP/1.1 200 
> < Date: Fri, 16 Nov 2018 15:05:04 GMT
> < Content-Type: application/json
> < Transfer-Encoding: chunked
> < 
> * Connection #0 to host localhost left intact
> {"errorCode":1035,"isAuthorized":null,"errorMessage":"validate detected invalid orgUnit
name [non-existing-ou] adding user with userId [test1]","entity":null,"entities":null,"values":null,"valueSet":null,"session":null}
> {code}
> I propose to add a new {{httpStatusCode}} field to FortResponse class which can be set
appropriately and modify/add the CXF interceptor to change the outgoing response's status
accordingly.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Mime
View raw message