Index: /trunk/src/org/openstreetmap/josm/io/imagery/WMSGrabber.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/imagery/WMSGrabber.java	(revision 4227)
+++ /trunk/src/org/openstreetmap/josm/io/imagery/WMSGrabber.java	(revision 4228)
@@ -19,5 +19,8 @@
 import java.text.NumberFormat;
 import java.util.ArrayList;
+import java.util.Map.Entry;
 import java.util.Locale;
+import java.util.Map;
+import java.util.HashMap;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -44,4 +47,5 @@
     protected String baseURL;
     private final boolean urlWithPatterns;
+    private Map<String, String> props = new HashMap<String, String>();
 
     public WMSGrabber(MapView mv, WMSLayer layer) {
@@ -50,4 +54,17 @@
         /* URL containing placeholders? */
         urlWithPatterns = ImageryInfo.isUrlWithPatterns(baseURL);
+        if(layer.getInfo().getCookies() != null && !layer.getInfo().getCookies().equals("")) {
+            props.put("Cookie", layer.getInfo().getCookies());
+        }
+        props.put("User-Agent", Main.pref.get("imagery.wms.user_agent", Version.getInstance().getAgentString()));
+        Pattern pattern = Pattern.compile("\\{header\\(([^,]+),([^}]+)\\)\\}");
+        StringBuffer output = new StringBuffer();
+        Matcher matcher = pattern.matcher(this.baseURL);
+        while (matcher.find()) {
+            props.put(matcher.group(1),matcher.group(2));
+            matcher.appendReplacement(output, "");
+        }
+        matcher.appendTail(output);
+        this.baseURL = output.toString();
     }
 
@@ -211,8 +228,7 @@
 
         HttpURLConnection conn = (HttpURLConnection) url.openConnection();
-        if(layer.getInfo().getCookies() != null && !layer.getInfo().getCookies().equals("")) {
-            conn.setRequestProperty("Cookie", layer.getInfo().getCookies());
-        }
-        conn.setRequestProperty("User-Agent", Main.pref.get("imagery.wms.user_agent", Version.getInstance().getAgentString()));
+        for(Entry<String, String> e : props.entrySet()) {
+            conn.setRequestProperty(e.getKey(), e.getValue());
+        }
         conn.setConnectTimeout(Main.pref.getInteger("socket.timeout.connect",15) * 1000);
         conn.setReadTimeout(Main.pref.getInteger("socket.timeout.read", 30) * 1000);
