FormEncodingProvider writes the application/x-www-form-urlencoded params 
incorrectly when multiple params with the same name are present
----------------------------------------------------------------------------------------------------------------------------------------

                 Key: CXF-2242
                 URL: https://issues.apache.org/jira/browse/CXF-2242
             Project: CXF
          Issue Type: Bug
          Components: REST
    Affects Versions: 2.2.1
            Reporter: Nacho G. Mac Dowell


Hi, there is a problem with FormEncodingProvider when writing the url-encoded 
string. It is checking an incorrect iterator.

    public void writeTo(MultivaluedMap<String, String> map, Class<?> c, Type t, 
Annotation[] anns, 
                        MediaType mt, MultivaluedMap<String, Object> headers, 
OutputStream os) 
        throws IOException, WebApplicationException {
        boolean encoded = AnnotationUtils.getAnnotation(anns, Encoded.class) != 
null;
        for (Iterator<Map.Entry<String, List<String>>> it = 
map.entrySet().iterator(); it.hasNext();) {
            Map.Entry<String, List<String>> entry = it.next();
            for (String value : entry.getValue()) {
                os.write(entry.getKey().getBytes("UTF-8"));
                os.write('=');
                String data = encoded ? value : HttpUtils.urlEncode(value); 
                os.write(data.getBytes("UTF-8"));
                if (it.hasNext()) {
                    os.write('&');
                }
            }
        }
    }

it.hasNext() should be checking the entry iterator and not the map iterator. 
The consequence is that & is never appended if, for example, there is only one 
parameter


Fixed version would be:

    public void writeTo(MultivaluedMap<String, String> map, Class<?> c, Type t, 
Annotation[] anns, 
                        MediaType mt, MultivaluedMap<String, Object> headers, 
OutputStream os) 
        throws IOException, WebApplicationException {
        boolean encoded = AnnotationUtils.getAnnotation(anns, Encoded.class) != 
null;
        for (Iterator<Map.Entry<String, List<String>>> it = 
map.entrySet().iterator(); it.hasNext();) {
            Map.Entry<String, List<String>> entry = it.next();
            for (Iterator<String> entryIterator = entry.getValue().iterator(); 
entryIterator.hasNext();) {
                String value = entryIterator.next();
                                os.write(entry.getKey().getBytes("UTF-8"));
                os.write('=');
                String data = encoded ? value : HttpUtils.urlEncode(value); 
                os.write(data.getBytes("UTF-8"));
                if (entryIterator.hasNext()) {
                    os.write('&');
                }
            }
        }
    }

I don't have time just now to provide test cases but a careful look should do.

best regards


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to