[pve-devel] r5056 - pve-common/trunk
svn-commits at proxmox.com
svn-commits at proxmox.com
Thu Aug 26 08:52:37 CEST 2010
Author: dietmar
Date: 2010-08-26 06:52:37 +0000 (Thu, 26 Aug 2010)
New Revision: 5056
Modified:
pve-common/trunk/ChangeLog
pve-common/trunk/README.dev
pve-common/trunk/RESTHandler.pm
Log:
* README.dev: update docu about find_handler()
* RESTHandler.pm (find_handler): use '$path' instead of strange
'$stack' parameter.
Modified: pve-common/trunk/ChangeLog
===================================================================
--- pve-common/trunk/ChangeLog 2010-08-25 13:37:21 UTC (rev 5055)
+++ pve-common/trunk/ChangeLog 2010-08-26 06:52:37 UTC (rev 5056)
@@ -1,3 +1,10 @@
+2010-08-26 Proxmox Support Team <support at proxmox.com>
+
+ * README.dev: update docu about find_handler()
+
+ * RESTHandler.pm (find_handler): use '$path' instead of strange
+ '$stack' parameter.
+
2010-08-25 Proxmox Support Team <support at proxmox.com>
* Exception.pm (raise_param_exc): allow to specify usage information.
Modified: pve-common/trunk/README.dev
===================================================================
--- pve-common/trunk/README.dev 2010-08-25 13:37:21 UTC (rev 5055)
+++ pve-common/trunk/README.dev 2010-08-26 06:52:37 UTC (rev 5056)
@@ -97,8 +97,46 @@
Note:: This uses Getopt::Long to parse parameters.
-The 'path' property is used by the HTTP servers to setup the URL.
+There is a second way to map names to methods - using the 'path'
+property. And you can register subclasses. That way you can set up a
+filesystem like hierarchy to access methods.
+Here is an example:
+----------------------------
+package C1;
+
+__PACKAGE__->register_method ({
+ subclass => "C2",
+ path => 'sub2',
+});
+
+
+__PACKAGE__->register_method ({
+ name => 'list1',
+ path => 'index',
+ method => 'GET',
+ ...
+});
+
+package C2;
+
+__PACKAGE__->register_method ({
+ name => 'list2',
+ path => 'index',
+ method => 'GET',
+ ...
+});
+-------------------------------
+
+The utily method find_handler (in PVE::RESTHandler) can be use to do
+'path' related method lookups.
+
+C1->find_handler('GET', "/index") => C1::list1
+C1->find_handler('GET', "/sub2/index") => C2::list2
+
+The HTTP server use the URL (a path) to find the corresponding method.
+
+
References
==========
[1] RESTful Web Services
Modified: pve-common/trunk/RESTHandler.pm
===================================================================
--- pve-common/trunk/RESTHandler.pm 2010-08-25 13:37:21 UTC (rev 5055)
+++ pve-common/trunk/RESTHandler.pm 2010-08-26 06:52:37 UTC (rev 5056)
@@ -133,7 +133,7 @@
}
}
-sub find_handler {
+sub __find_handler_full {
my ($class, $method, $stack, $uri_param) = @_;
my $info;
@@ -163,10 +163,18 @@
$stack = [ join ('/', @$stack) ] if scalar(@$stack) > 1;
}
- return $subh->find_handler($method, $stack, $uri_param);
+ return $subh->__find_handler_full($method, $stack, $uri_param);
}
return ($class, $info);
+};
+
+sub find_handler {
+ my ($class, $method, $path, $uri_param) = @_;
+
+ my $stack = [ grep { length($_) > 0 } split('\/+' , $path)]; # skip empty fragments
+
+ return $class->__find_handler_full($method, $stack, $uri_param);
}
sub handle {
More information about the pve-devel
mailing list