diff --git a/classes/pluginhost.php b/classes/pluginhost.php
index 4d5b3252c34fa6a177221e854314227b528e1cfd..4cc85f0449a14c9e2355cac350b5a451bd75f072 100755
--- a/classes/pluginhost.php
+++ b/classes/pluginhost.php
@@ -491,4 +491,34 @@ class PluginHost {
 	function get_owner_uid() {
 		return $this->owner_uid;
 	}
+
+	// handled by classes/pluginhandler.php, requires valid session
+	function get_method_url($sender, $method, $params)  {
+		return get_self_url_prefix() . "/backend.php?" .
+			http_build_query(
+				array_merge(
+					[
+						"op" => "pluginhandler",
+						"plugin" => strtolower(get_class($sender)),
+						"pmethod" => $method
+					],
+					$params));
+	}
+
+	// WARNING: endpoint in public.php, exposed to unauthenticated users
+	function get_public_method_url($sender, $method, $params)  {
+		if ($sender->is_public_method($method)) {
+			return get_self_url_prefix() . "/public.php?" .
+				http_build_query(
+					array_merge(
+						[
+							"op" => "pluginhandler",
+							"plugin" => strtolower(get_class($sender)),
+							"pmethod" => $method
+						],
+						$params));
+		} else {
+			user_error("get_public_method_url: requested method '$method' of '" . get_class($sender) . "' is private.");
+		}
+	}
 }
diff --git a/plugins/af_proxy_http/init.php b/plugins/af_proxy_http/init.php
index 421e04d1f7f44892ec176dbd0ebe389f73c250a1..80100160d1b5f3f60691da539e7e19adaa6279a1 100644
--- a/plugins/af_proxy_http/init.php
+++ b/plugins/af_proxy_http/init.php
@@ -141,8 +141,7 @@ class Af_Proxy_Http extends Plugin {
 						}
 					}
 
-					return get_self_url_prefix() . "/public.php?op=pluginhandler&plugin=af_proxy_http&pmethod=imgproxy&url=" .
-						urlencode($url);
+					return $this->host->get_public_method_url($this, "imgproxy", ["url" => $url]);
 				}
 			}
 		}