@@ -3851,28 +3851,24 @@ private <U extends OkHttpResultIterator> U postIteratedResourceImpl(
38513851 requestBldr = addTransactionScopedCookies (requestBldr , transaction );
38523852 requestBldr = addTelemetryAgentId (requestBldr );
38533853 requestBldr = addTrailerHeadersIfNecessary (requestBldr , path );
3854+ requestBldr = setErrorFormatIfNecessary (requestBldr , path );
38543855
3855- Consumer <Boolean > resendableConsumer = new Consumer <Boolean >() {
3856- public void accept (Boolean resendable ) {
3856+ Consumer <Boolean > resendableConsumer = resendable -> {
38573857 if (!isResendable ) {
38583858 checkFirstRequest ();
38593859 throw new ResourceNotResendableException (
38603860 "Cannot retry request for " + path );
38613861 }
3862- }
3863- };
3864- Function <Request .Builder , Response > doPostFunction = new Function <Request .Builder , Response >() {
3865- public Response apply (Request .Builder funcBuilder ) {
3866- return doPost (reqlog , funcBuilder .header (HEADER_ACCEPT , multipartMixedWithBoundary ()),
3867- inputBase .sendContent ());
3868- }
38693862 };
3870- Response response = sendRequestWithRetry (requestBldr , (transaction == null ), doPostFunction , resendableConsumer );
3871- int status = response .code ();
38723863
3873- checkStatus (response , status , "apply" , "resource" , path ,
3874- ResponseStatus .OK_OR_CREATED_OR_NO_CONTENT );
3864+ Function <Request .Builder , Response > doPostFunction = requestBuilder -> doPost (
3865+ reqlog ,
3866+ requestBuilder .header (HEADER_ACCEPT , multipartMixedWithBoundary ()),
3867+ inputBase .sendContent ()
3868+ );
38753869
3870+ Response response = sendRequestWithRetry (requestBldr , (transaction == null ), doPostFunction , resendableConsumer );
3871+ checkStatus (response , response .code (), "apply" , "resource" , path , ResponseStatus .OK_OR_CREATED_OR_NO_CONTENT );
38763872 return makeResults (constructor , reqlog , "apply" , "resource" , response );
38773873 }
38783874
@@ -4198,6 +4194,18 @@ private Request.Builder addTrailerHeadersIfNecessary(Request.Builder requestBldr
41984194 return requestBldr ;
41994195 }
42004196
4197+ private Request .Builder setErrorFormatIfNecessary (Request .Builder requestBuilder , String path ) {
4198+ // Slightly dirty hack; per https://docs.marklogic.com/guide/rest-dev/intro#id_34966, the X-Error-Accept header
4199+ // should be used to specify the error format. A REST API server defaults to 'json', though the App-Services app
4200+ // server defaults to 'compatible'. If the error format is 'compatible', a block of HTML is sent back which
4201+ // causes an error that prevents the user from seeing the actual error from the server. So for all eval calls,
4202+ // X-Error-Accept is used to request any errors back as JSON so that they can be handled correctly.
4203+ if ("eval" .equals (path )) {
4204+ requestBuilder .addHeader (HEADER_ERROR_FORMAT , "application/json" );
4205+ }
4206+ return requestBuilder ;
4207+ }
4208+
42014209 private <W extends AbstractWriteHandle > boolean addParts (
42024210 MultipartBody .Builder multiPart , RequestLogger reqlog , W [] input )
42034211 {
0 commit comments