[Zope-dev] VirtualHostFolder Product (similar to Site objects)

Adam Feuer adamf@pobox.com
Tue, 21 Sep 1999 20:23:26 -0700


--96YOpH+ONegL0A3E
Content-Type: text/plain; charset=us-ascii

folks,

  ok, enclosed is that VirtualHostFolder product i mentioned-- 0.0.1,
a *very* preliminary release. it does mapping Virtual Hosting by Site
Name and/or IP address.

  this code is also available on my home page at:

http://www.pobox.com/~adamf/VHF-0.0.1-with-patchfile.tar.gz


  please treat this as an experiment-- it's got some severe kludges in
it, and i haven't tested it very well. and i'm pretty new to Zope. so
there. :-)

  if this can be used as a basis for Zope's Virtual Hosting features,
great. if it just ends up as an example of how *not* to do Virtual
Hosting, that's cool too.

  a couple of notes: the tar.gz file has two files in it, the
VirtualHostFolder-0.0.1 product, and a patchfile. you install the
product as usual, the patchfile needs to be applied to zope to enable
the product to work. instructions for applying the patchfile are in
the product's README.txt file.

  this product has some severe limitations-- it stores the persistent
map of {SiteNames/IPaddresses : path_prefixes} in its own private ZODB
database in the Zope data_dir (usually var/). i want to put this
storage object in the Zope database, but i haven't figured out how
yet. if someone knows how, let me know, or just have at it!

  the file Mapper.py (in lib/python/ZPublisher) is new, and it is just
a registration facility to allow Publish to find the path remapper
functions. this has limitations too; the order in which the path remap
functions operate on the paths can't be specified or changed.

  and there are probably other no-nos that i don't know about. check
out the code to see what's going on.


cheers
adam

ps. this Product is dedicated to paul everitt and amos latteier, who
both gave inspiring talks about Zope that i went to recently. thanks!
:-)

--
Adam Feuer
adamf@pobox.com
 

--96YOpH+ONegL0A3E
Content-Type: application/x-tar-gz
Content-Disposition: attachment; filename="VHF-0.0.1-with-patchfile.tar.gz"
Content-Transfer-Encoding: base64

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
9Iv+N+j/AK4iGAkAUAAA

--96YOpH+ONegL0A3E--