title: S4Hana(ERP) backend does not return localized error message due to additional ‘sap-language’ header is being added by the Cloud SDK
body: <p><em>Note: Application is built in CAP Java Stack along with DWC framework. Technical user is configurated in destination service for making an API call.</em></p>
  <p><strong>Flow :</strong></p>
  <ul>
  <li>API call gets initiated from UI.</li>
  <li>The application layer receives the
  request and respond with 204</li>
  <li>Then starts the async process
  explicitly via spring events and adds custom header as ‘sap-language’
  based on user's locale before making the call to S4 backend.</li>
  </ul>
  <pre><code>httpHeaders.put(DefaultErpHttpDestination.LOCALE_HEADER_NAME, dwcHeaderContainer.getHeader(HttpHeaders.ACCEPT_LANGUAGE)); 
  
  ModificationResponse&lt;PurchaseRequisition&gt; s4ReqResponse = 
  s4opRequistionService.createPurchaseRequisition(s4opRequistion).withHeaders(httpHeaders).executeRequest(destinationProvider.getDestination());          
  
  </code></pre>
  <p>However, Observed the underlying cloud SDK layer which 1st makes the call to destination service and retrieves the provided headers and then gets system current locale based on some constraint and adds a header again for ‘<strong>sap-language</strong>’ with the default system locale as 'en' which leads to problem in our case.</p>
  <p><strong>Calling stack trace :</strong></p>
  <pre><code>Thread [SimpleAsyncTaskExecutor-60] (Suspended) 
  CdsRequestHeaderFacade.tryGetRequestHeaders() line: 28  
  RequestHeaderAccessor.tryGetHeaderContainer() line: 89  
  DefaultLocaleFacade.getLocalesByHeaders() line: 48  
  DefaultLocaleFacade.getCurrentLocales() line: 36    
  DefaultLocaleFacade(LocaleFacade).getCurrentLocale() line: 27   
  LocaleAccessor.getCurrentLocale() line: 53  
  371621826.get() line: not available 
  Option$None&lt;T&gt;(Option&lt;T&gt;).getOrElse(Supplier&lt;? extends T&gt;) line: 336    
  DefaultErpHttpDestination(ErpHttpDestinationProperties).getLocale() line: 51    
  DefaultErpHttpDestination.getHeadersToAdd() line: 188   
  DefaultErpHttpDestination.getHeaders(URI) line: 169 
  HttpClientWrapper.wrapRequest(HttpUriRequest) line: 98  
  HttpClientWrapper.execute(HttpUriRequest) line: 116 
  HttpClientWrapper.execute(HttpUriRequest) line: 35  
  DefaultCsrfTokenRetriever.retrieveCsrfTokenResponseHeader(HttpClient, String, Map&lt;String,String&gt;) line: 91  
  DefaultCsrfTokenRetriever.retrieveCsrfToken(HttpClient, String, Map&lt;String,String&gt;) line: 54    
  ODataRequestCreate(ODataRequestGeneric).lambda$tryGetCsrfToken$5ab307ff$1(CsrfTokenRetriever, HttpClient) line: 266 
  659039215.apply() line: not available   
  Try&lt;T&gt;.of(CheckedFunction0&lt;? extends T&gt;) line: 75   
  ODataRequestCreate(ODataRequestGeneric).tryGetCsrfToken(HttpClient, CsrfTokenRetriever) line: 266   
  ODataRequestCreate(ODataRequestGeneric).tryExecuteWithCsrfToken(HttpClient, Supplier&lt;HttpResponse&gt;) line: 239   
  ODataRequestCreate.execute(HttpClient) line: 93 
  PurchaseRequisitionCreateFluentHelper(FluentHelperCreate&lt;FluentHelperT,EntityT&gt;).executeRequest(HttpDestinationProperties) line: 246    
  xxxxxx.copyPR(Map&lt;String,Object&gt;) line: 176 
  xxxxxx.s4AdapterResponseToxxxxxx(xxxxxx) line: 69   
  xxxxxx.onApplicationEvent(xxxxxx) line: 58  
  xxxxxxSpringListener.onApplicationEvent(ApplicationEvent) line: 1   
  SimpleApplicationEventMulticaster.doInvokeListener(ApplicationListener, ApplicationEvent)   
  SimpleApplicationEventMulticaster.invokeListener(ApplicationListener&lt;?&gt;, ApplicationEvent)
  SimpleApplicationEventMulticaster.lambda$multicastEvent$0(ApplicationListener, ApplicationEvent)    
  1824178544.run() line: not available    
  DwcContextTaskDecorator.lambda$decorate$0(Map, Runnable) line: 33   
  1126784716.run() line: not available    
  Thread.run() line: 829  
  
  </code></pre>
  <p><strong>Sample Http Out Going request and response looks like :</strong></p>
  <pre><code>http-outgoing-13 &gt;&gt; &quot;POST /sap/opu/odata/sap/API_PURCHASEREQ_PROCESS_SRV/A_PurchaseRequisitionHeader HTTP/1.1[\r][\n]&quot;
  http-outgoing-13 &gt;&gt; &quot;sap-language: de[\r][\n]&quot;
  http-outgoing-13 &gt;&gt; &quot;Accept: application/json[\r][\n]&quot;
  http-outgoing-13 &gt;&gt; &quot;RequestID: xxxxx[\r][\n]&quot;
  http-outgoing-13 &gt;&gt; &quot;RepeatabilityCreation: 2022-09-19T08:50:00.889315900Z[\r][\n]&quot;
  http-outgoing-13 &gt;&gt; &quot;X-CorrelationID: [\r][\n]&quot;
  http-outgoing-13 &gt;&gt; &quot;x-csrf-token: xxxxx==[\r][\n]&quot;
  http-outgoing-13 &gt;&gt; &quot;Content-Type: application/json[\r][\n]&quot;
  http-outgoing-13 &gt;&gt; &quot;Authorization: Basic XXXX[\r][\n]&quot;
  http-outgoing-13 &gt;&gt; &quot;sap-language: en[\r][\n]&quot;
  http-outgoing-13 &gt;&gt; &quot;Content-Length: 1383[\r][\n]&quot;
  http-outgoing-13 &gt;&gt; &quot;Host: XXXX[\r][\n]&quot;
  http-outgoing-13 &gt;&gt; &quot;Connection: Keep-Alive[\r][\n]&quot;
  http-outgoing-13 &gt;&gt; &quot;User-Agent: Apache-HttpClient/4.5.13 (Java/11.0.16)[\r][\n]&quot;
  http-outgoing-13 &gt;&gt; &quot;Cookie: XXX%3d; sap-usercontext=sap-language=en&amp;sap-client=xxx[\r][\n]&quot;
  http-outgoing-13 &gt;&gt; &quot;Accept-Encoding: gzip,deflate[\r][\n]&quot;
  http-outgoing-13 &gt;&gt; &quot;[\r][\n]&quot;
  http-outgoing-13 &gt;&gt; &quot;body_xxx&quot;
  http-outgoing-13 &lt;&lt; &quot;HTTP/1.1 400 Bad Request[\r][\n]&quot;
  http-outgoing-13 &lt;&lt; {&quot;error&quot;:{&quot;code&quot;:&quot;06/101&quot;,&quot;message&quot;:{&quot;lang&quot;:&quot;en&quot;,&quot;value&quot;:&quot;No master record exists for supplier EPRINT&quot;}&quot;}
  
  </code></pre>
  <p>If you notice, there are two '<strong>sap-language</strong>' header goes to backend as mentioned above and S4 backend layer considers the last header attribute and returns  the error message always in English. Our expectation is error messages should come based on user’s locale…</p>
  <p><strong>Following queries :</strong></p>
  <p><strong>Is there any way by which application layer can instruct to Cloud SDK like Not to append again 'sap-language' header and give preference to what is being passed by the custom header as ‘sap-language’ As ‘de’ in our case?</strong></p>
  <p><strong>Is it the bug from Cloud SDK?</strong></p>
  <p>Any recommendation or inputs to address this issue..</p>