Intercepteur CXF – transforme le corps de la requête en pièce jointe

J’ai un problème avec le fait que certains clients qui s’intègrent à mon API ne sont pas conformes aux normes (bien sûr :)).

Ainsi, certains des clients au lieu d’append une pièce jointe envoient le contenu du fichier dans le corps de la requête (avec des en-têtes incorrects). Et cela provoque une exception de CXF (ne peut pas trouver de limite).

J’ai implémenté un InInterceptor pour vérifier le contenu. D’abord, je modifie déjà le type de contenu, sinon CXF renvoie une erreur 415.

Comment puis-je maintenant transformer le corps de la requête en texte brut en pièce jointe?

@Override public void handleMessage(Message message) throws Fault { Map map = (Map)message.get(Message.PROTOCOL_HEADERS); if(url != null && url.indexOf("uploadFile") > 0) { //TODO && !Content-type = multipart/form-data message.remove(Message.CONTENT_TYPE); message.put(Message.CONTENT_TYPE, "multipart/form-data"); map.put("content-type", Collections.singletonList("multipart/form-data")); message.put(Message.PROTOCOL_HEADERS, map); } InputStream is = message.getContent(InputStream.class); SsortingngWriter writer = new SsortingngWriter(); try { IOUtils.copy(is, writer, "UTF-8"); is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Ssortingng requestBody = writer.toSsortingng(); System.out.println(requestBody); } 

Ce que j’ai remarqué, c’est que si la demande est correcte (fichier attaché), la demande d’entrée ressemble à ceci (notez les chaînes de limite):

 --g-fcgqFfRThi-YWVLasSjj8mvL2PJecFQq Content-Disposition: form-data; name="upload__31e8f749_142e740a2c1__7fff_00000040.tmp"; filename="upload__31e8f749_142e740a2c1__7fff_00000040.tmp" Content-Type: application/octet-stream; charset=ISO-8859-1 Content-Transfer-Encoding: binary FILE CONTENT --g-fcgqFfRThi-YWVLasSjj8mvL2PJecFQq-- 

Et si ce n’est pas correct (texte en clair dans le corps de la requête), le stream d’entrée est juste ceci:

 FILE CONTENT 

Et cela provoque alors la “exception de limite non trouvée”. Bien sûr, je reçois maintenant l’exception “Stream closed” dans ce code, mais c’est juste parce que je suis en mode pour trouver une solution.