You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Rajesh (Jira)" <ji...@apache.org> on 2020/07/06 13:57:00 UTC

[jira] [Commented] (CXF-8281) Issue with attachment Chines file name

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

Rajesh commented on CXF-8281:
-----------------------------

Hi , We incorporated test cases but due to custom implementation unable to test all test cases  . Here is the details description about issue.

We are getting issue when we are getting attachment name  with "*Non English characters , Chines characters*" .  Here ,I'm testing with file name  with "sample№tes+t.pdf" , while receiving from interceptors in java its getting  as "sampletes t.pdf". Please find below screen shorts for debug  and code snippet for reference .


 !soapui.png! 
 !screenshot-1.png! 

 Code Snippet :

public class POAttachmentInterceptor extends  AbstractPhaseInterceptor<Message>  {
	
	public static final Logger logger = Logger.getLogger(POAttachmentInterceptor.class);
	public static final String ATTACHMENT_PART_HEADERS = POAttachmentInterceptor.class.getName() + ".headers";
    private static final List<String> TYPES = Collections.singletonList("multipart/related");
    private static final List<String> PART_TYPES = Collections.singletonList("application/octet-stream");
    public static final int DEFAULT_MAX_HEADER_SIZE = 
            SystemPropertyAction.getInteger("org.apache.cxf.attachment-max-header-size", 300);

    public POAttachmentInterceptor() {
    	
        super(Phase.PRE_STREAM);
        logger.info("AttachmentInInterceptor constructor called ");
        
    }

    public void handleMessage(Message message) {
        if (isGET(message)) {
            logger.info("AttachmentInInterceptor skipped in HTTP GET method");
            return;
        }
        if (message.getContent(InputStream.class) == null) {
            return;
        }

        String contentType = (String) message.get(Message.CONTENT_TYPE);
        if (AttachmentUtil.isTypeSupported(contentType, getSupportedTypes())) {
            try {
            	message.getAttachments();
               if ( null!= message.getAttachments() && !message.getAttachments().isEmpty()){
            	   customHandleMessage(message); 
               }
                  
            } catch (Exception e) {
                throw new Fault(e);
            }
        }
   }
 	     
   private void customHandleMessage(Message message) {
	    	
        try {
                List messList = new MessageContentsList();
            	messList.add(message.getContent(InputStream.class));
            	Iterator<Attachment> iter = message.getAttachments().iterator();
	            MimeMultipart mulitParts = null;
    	        while (iter.hasNext()){
      	        	Attachment attachmentIter = iter.next();
     	        	try {
     	        		//Type casting issue fix : 20/05/2019
     	        		Object obj =  attachmentIter.getDataHandler().getContent();
     	        		mulitParts = MimeMultipart.class.cast(obj);
    	        		BodyPart part = mulitParts.getBodyPart(0);
    	        		int partCount = mulitParts.getCount();
						logger.info( "part fileName : "+part.getFileName() );
						logger.info( "partCount : "+ partCount );
						
					}catch(ClassCastException cEx){ 
						return;
					}catch (MessagingException e) {
						logger.error("MessagingException in POAttachmentInterceptor:" + e.getMessage());
					}
                }
    	        if ( null!= mulitParts ){
	    	        List<Attachment> attachmentList = new ArrayList<>();
	    	        for ( int partIndex=0; partIndex< mulitParts.getCount(); partIndex++){
	         		   
	    	        	attachmentList.add(createAttachment( mulitParts.getBodyPart(partIndex)) );   
	      	        }
	    	        message.setAttachments(attachmentList);
    	        }
                
        }catch (MessagingException me) {
                throw new Fault(me);
        }catch (IOException e) {
                throw new Fault(e);
        }
   }
	
   private Attachment createAttachment(BodyPart part){
	    DataHandler dh = null;
	    Object o;
	    try {
	    	    logger.info("part.getContentType()******"+ part.getContentType());
	    	    String ct = "application/octet-stream";
	    	    String name = part.getFileName();
	    	    o = part.getDataHandler().getInputStream();
			    if (ct.indexOf("text/xml") != -1 || ct.indexOf("application/xop+xml")!=-1){
			        dh = (DataHandler) o;
			        ct = dh.getContentType();
			      	dh = new DataHandler(createDataSource((Source)dh.getContent(), ct));
			    }else if (ct.indexOf("application/octet-stream") != -1 || ct.indexOf("application/pdf") != -1){
			    	ByteDataSource dataSource = new ByteDataSource((byte[]) o.toString().getBytes(StandardCharsets.UTF_8), ct);
			    	dataSource.setName(name);
			    	dh = new DataHandler(dataSource);
			    }else if ( ct.indexOf("text/plain; charset=\'UTF-8\'") != -1 ){
			    	ByteDataSource dataSource = new ByteDataSource(((String)o).getBytes(StandardCharsets.UTF_8), ct);
			    	dataSource.setName(name);
			    	dh = new DataHandler(dataSource);
			    }
			    else if ( ct.indexOf("application/xop+xml; charset=\'UTF-8\'") != -1 ){
			    	ByteDataSource dataSource = new ByteDataSource(((String)o).getBytes(StandardCharsets.UTF_8), ct);
			    	dataSource.setName(name);
			    	dh = new DataHandler(dataSource);
			    }
			    else {
			    	logger.info("Unknow content type********************");
			    	dh = new DataHandler( ( part.getDataHandler()), ct);
			    }	   
			    AttachmentImpl costructedAttachment= new AttachmentImpl(name);
			    costructedAttachment.setDataHandler(dh);
			    costructedAttachment.setHeader("Content-Type", ct);
			    costructedAttachment.setHeader("Content-ID", "<" + name + ">");
			    
			    return costructedAttachment;
			    
		}catch (MessagingException  | IOException e) {
			logger.error( e.getMessage());
			logger.error( e.getCause());
		}
	    
	    return null;
   }
   
   static String getHeader(Map<String, List<String>> headers, String h) {
       return getHeaderValue(headers.get(h));
   }   
   
   static String getHeader(Map<String, List<String>> headers, String h, String delim) {
       return getHeaderValue(headers.get(h), delim);
   }
   
   static String getHeaderValue(List<String> v) {
	   
       if (v != null && !v.isEmpty()) {
           return v.get(0);
       }
       return null;
   }
   static String getHeaderValue(List<String> v, String delim) {
	   if (v != null && !v.isEmpty()) {
           StringBuilder b = new StringBuilder();
           for (String s : v) {
               if (b.length() > 0) {
                   b.append(delim);
               }
               b.append(s);
           }
           return b.toString();
       }
       return null;
   }   

 	
   private DataSource createDataSource(Source o, String ct) {
	    DataSource ds = null;
        if (o instanceof StreamSource) {
            StreamSource src = (StreamSource)o;
            try {
                if (src.getInputStream() != null) {
                    try (ByteArrayOutputStream bos = new ByteArrayOutputStream(2048)) {
                        IOUtils.copy(src.getInputStream(), bos, 1024);
                        ds = new ByteDataSource(bos.toByteArray(), ct);
                    }
                } else {
                    ds = new ByteDataSource(IOUtils.toString(src.getReader()).getBytes(StandardCharsets.UTF_8),
                                                 ct);
                }
            } catch (IOException e) {
                throw new Fault(e);
            }
        } else {
            ByteArrayOutputStream bwriter = new ByteArrayOutputStream();
            XMLStreamWriter writer = null;
            try {
                writer = StaxUtils.createXMLStreamWriter(bwriter);
                StaxUtils.copy(o, writer);
                writer.flush();
                ds = new ByteDataSource(bwriter.toByteArray(), ct);
            } catch (XMLStreamException e1) {
                throw new Fault(e1);
            } finally {
                StaxUtils.close(writer);
            }
        }
        return ds;
    }

    protected List<String> getSupportedTypes() {
        return TYPES;
    }
    
    protected List<String> getPartSupportedTypes() {
        return PART_TYPES;
    }

	

}




> Issue with  attachment Chines file name
> ---------------------------------------
>
>                 Key: CXF-8281
>                 URL: https://issues.apache.org/jira/browse/CXF-8281
>             Project: CXF
>          Issue Type: Bug
>          Components: Bus, JAX-WS Runtime, WS-* Components
>    Affects Versions: 3.2.4
>            Reporter: Rajesh
>            Priority: Major
>         Attachments: screenshot-1.png, soapui.png
>
>
> 0
> I'm using apache CXF for exposing the webservice. While reading chinese file name from upstream (SOAP UI in local), unable to read exact chinese characters. It's giving file name as '°U'°U123.pdf . I have tried with all encodings but no luck. For other English name attachments no issues, able to read properly.
> {quote}From soap ui i'm sending UTF-8 encoding , while reading in java I have used same.
>  byte[] b = attachmentName.getBytes(StandardCharsets.UTF_8); 
> String attachName = new String(b, StandardCharsets.UTF_8.name());
> `Below is my interceptor code.
> {quote}
> public void handleMessage(SoapMessage message) throws Fault {
>             logger.info("Handle Message for attachments ");
>             BindingOperationInfo bop = message.getExchange().getBindingOperationInfo();   
>             if (bop == null) {
>                 return;
>             }
>             logger.info("binding info "+bop.getBinding());
>             if (bop.isUnwrapped()) {
>                 bop = bop.getWrappedOperation();
>             }
>             if (null == message.getAttachments() || message.getAttachments().isEmpty() ){
>                 return;
>             }
>             Iterator<Attachment> iter = message.getAttachments().iterator();
>             Collection<Attachment> attchments = message.getAttachments();
>             logger.info("message get attachments size   : "+attchments.size());
>              int attachmentCount=0;
>              Map<String, DataHandler> attachmentMap=   AttachmentUtil.getDHMap(attchments);
>              logger.info("Map<String, DataHandler> "+attachmentMap.size());
>             try{
>                 while (iter.hasNext()){
>                     Attachment attachment = iter.next();
>                     attachmentCount++;
>                     }
>                     }
>                     }



--
This message was sent by Atlassian Jira
(v8.3.4#803005)