Changeset 5010 in josm


Ignore:
Timestamp:
Feb 20, 2012 11:36:37 PM (16 months ago)
Author:
bastiK
Message:

fixed #7434 - remotecontrol: URLs with "&" and "?" character don't work

Location:
trunk/src/org/openstreetmap/josm/io/remotecontrol/handler
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandler.java

    r4861 r5010  
    5555 
    5656    @Override 
    57     public void parseArgs() { 
    58         StringTokenizer st = new StringTokenizer(request, "&?"); 
     57    protected void parseArgs() { 
    5958        HashMap<String, String> args = new HashMap<String, String>(); 
    60         // skip first element which is the command 
    61         if(st.hasMoreTokens()) { 
    62             st.nextToken(); 
    63         } 
    64         while (st.hasMoreTokens()) { 
    65             String param = st.nextToken(); 
    66             int eq = param.indexOf("="); 
    67             if (eq > -1) 
    68             { 
    69                 String key = param.substring(0, eq); 
    70                 /* "url=" terminates normal parameters 
    71                  * and will be handled separately 
    72                  */ 
    73                 if("url".equals(key)) { 
    74                     break; 
     59        if (request.indexOf('?') != -1) { 
     60            String query = request.substring(request.indexOf('?') + 1); 
     61            if (query.indexOf("url=") == 0) { 
     62                args.put("url", decodeURL(query.substring(4))); 
     63            } else { 
     64                int urlIdx = query.indexOf("&url="); 
     65                if (urlIdx != -1) { 
     66                    String url = query.substring(urlIdx + 1); 
     67                    args.put("url", decodeURL(query.substring(urlIdx + 5))); 
     68                    query = query.substring(0, urlIdx); 
     69                } else { 
     70                    if (query.indexOf('#') != -1) { 
     71                        query = query.substring(0, query.indexOf('#')); 
     72                    } 
    7573                } 
    76  
    77                 String value = param.substring(eq + 1); 
    78                 // urldecode all normal values 
    79                 try { 
    80                     value = URLDecoder.decode(value, "UTF-8"); 
    81                 } catch (UnsupportedEncodingException e) { 
    82                     // TODO Auto-generated catch block 
    83                     e.printStackTrace(); 
    84                 } 
    85                 args.put(key, 
    86                         value); 
    87             } 
    88         } 
    89         // url as second or later parameter 
    90         int urlpos = request.indexOf("&url="); 
    91         // url as first (and only) parameter 
    92         if(urlpos < 0) { 
    93             urlpos = request.indexOf("?url="); 
    94         } 
    95         // url found? 
    96         if(urlpos >= 0) { 
    97             // URL value 
    98             String value = request.substring(urlpos + 5); 
    99             // allow skipping URL decoding with urldecode=false 
    100             String urldecode = args.get("urldecode"); 
    101             if((urldecode == null) || (Boolean.valueOf(urldecode) == true)) 
    102             { 
    103                 try { 
    104                     value = URLDecoder.decode(value, "UTF-8"); 
    105                 } catch (UnsupportedEncodingException e) { 
    106                     // TODO Auto-generated catch block 
    107                     e.printStackTrace(); 
     74                String[] params = query.split("&", -1); 
     75                for (String param : params) { 
     76                    int eq = param.indexOf('='); 
     77                    if (eq != -1) { 
     78                        args.put(param.substring(0, eq), param.substring(eq + 1)); 
     79                    } 
    10880                } 
    10981            } 
    110             args.put("url", value); 
    11182        } 
    11283        this.args = args; 
    11384    } 
     85 
     86    private String decodeURL(String url) { 
     87        try { 
     88            return URLDecoder.decode(url, "UTF-8"); 
     89        } catch (UnsupportedEncodingException e) { 
     90            throw new RuntimeException(); 
     91        } 
     92    } 
    11493} 
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java

    r4834 r5010  
    44import static org.openstreetmap.josm.tools.I18n.tr; 
    55 
     6import java.io.UnsupportedEncodingException; 
    67import java.net.URLDecoder; 
     8import java.util.HashMap; 
    79 
    810import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask; 
     
    2325        try { 
    2426            DownloadTask osmTask = new DownloadOsmTask(); 
    25             osmTask.loadUrl(false, URLDecoder.decode(args.get("url"), "UTF-8"), null); 
     27            osmTask.loadUrl(false, args.get("url"), null); 
    2628        } catch (Exception ex) { 
    2729            System.out.println("RemoteControl: Error parsing import remote control request:"); 
     
    4951                "RemoteControl: import forbidden by preferences"); 
    5052    } 
     53 
     54    @Override 
     55    protected void parseArgs() { 
     56        HashMap<String, String> args = new HashMap<String, String>(); 
     57        if (request.indexOf('?') != -1) { 
     58            String query = request.substring(request.indexOf('?') + 1); 
     59            if (query.indexOf("url=") == 0) { 
     60                args.put("url", decodeURL(query.substring(4))); 
     61            } else { 
     62                int urlIdx = query.indexOf("&url="); 
     63                if (urlIdx != -1) { 
     64                    String url = query.substring(urlIdx + 1); 
     65                    args.put("url", decodeURL(query.substring(urlIdx + 5))); 
     66                    query = query.substring(0, urlIdx); 
     67                } else { 
     68                    if (query.indexOf('#') != -1) { 
     69                        query = query.substring(0, query.indexOf('#')); 
     70                    } 
     71                } 
     72                String[] params = query.split("&", -1); 
     73                for (String param : params) { 
     74                    int eq = param.indexOf('='); 
     75                    if (eq != -1) { 
     76                        args.put(param.substring(0, eq), param.substring(eq + 1)); 
     77                    } 
     78                } 
     79            } 
     80        } 
     81        this.args = args; 
     82    } 
     83 
     84    private String decodeURL(String url) { 
     85        try { 
     86            return URLDecoder.decode(url, "UTF-8"); 
     87        } catch (UnsupportedEncodingException e) { 
     88            throw new RuntimeException(); 
     89        } 
     90    } 
    5191} 
Note: See TracChangeset for help on using the changeset viewer.