W3C home > Mailing lists > Public > www-talk@w3.org > November to December 1995

Re: Your Comments on NaviPress...

From: Daniel W. Connolly <connolly@beach.w3.org>
Date: Tue, 26 Dec 1995 23:08:22 -0500
Message-Id: <m0tUnA6-0002USC@beach.w3.org>
To: jnewton@laurel.com (Jim Newton)
Cc: www-talk@w3.org
In message <30e0acb7.13494414@mailhub.aimnet.com>, Jim Newton writes:
>Hello...
>
>I read your message about NaviPress and that you were able to "hack"
>up a server to accomodate NaviPress?  Do you mean that you are able to
>use the "Save" command to re-save documents to the server?

Yup.

>Just curious...NaviPress seems REALLY cool except that I can't save
>back to my server.

Here's the script I run as an editing server. You'll have to salt
to taste, of course. It requires python 1.3[1]


Dan

[1] http://www.python.org/

#!/usr/local/bin/python
#$Id: EditServer.py,v 1.2 1995/12/27 04:05:31 connolly Exp $

import os,string, stat, time

import SimpleHTTPServer
import SocketServer

Handler = SimpleHTTPServer.SimpleHTTPRequestHandler

class RootedHandler(Handler):
    # Hides URL space in local file system
    # Adds "Welcome" files, or index files
    # Restricts access to specified domains

    authorized_domains = ["w3.org"]

    index_files = ['Overview.html', 'index.html']

    root = '/afs/w3.org'

    server_version = "EditHTTP-connolly/0.1"


    def do_GET(self):
	"""Serve a GET request."""

	if not self.check_auth('GET'): return
	try:
	    self.get()
	except HTTPError:
	    import sys
	    code, msg = sys.exc_value
	    self.send_error(code, msg)

    def get(self):

	path = self.translate_path(self.path)

	if os.path.isdir(path):
	    raise HTTPError, (403, "Directory listing not supported")
	    return None
	try:
	    f = open(path)
	except IOError:
	    raise HTTPError, (404, "File not found")

	self.send_response(200)
	self.send_header("Content-type", self.guess_type(path))
	self.about(path)
	self.end_headers()

	print "@@", self.headers.headers
	self.copyfile(f, self.wfile)
	f.close()

    def do_HEAD(self):
	"""Serve a HEAD request."""

	if not self.check_auth('HEAD'): return
	try:
	    self.head()
	except HTTPError:
	    import sys
	    code, msg = sys.exc_value
	    self.send_error(code, msg)

    def head(self):
	path = self.translate_path(self.path)
	if os.path.exists(path):
	    self.send_response(200)
	    self.send_header("Content-type", self.guess_type(path))
	    self.about(path)
	    self.end_headers()


    def date_header(self, fieldname, t):
	year, month, day, hh, mm, ss, wd, y, z = time.gmtime(t)
	self.wfile.write("%s: %s, %02d %3s %4d %02d:%02d:%02d GMT\r\n" %
			 (fieldname,
			  self.weekdayname[wd],
			  day, self.monthname[month], year,
			  hh, mm, ss))

    def about(self, path, file = None):
	try:
	    mtime = os.stat(path)[stat.ST_MTIME]
	    self.date_header("Last-Modified", mtime)
	except IOError:
	    pass

    def translate_path(self, path, find_welcome=1):
	path = path[1:]
	path = os.path.join(self.root, path)

	if find_welcome and os.path.isdir(path) and path[-1] == '/':
	    for f in self.index_files:
		p = os.path.join(path, f)
		if path[-1] == '/' and os.path.isfile(p):
		    path = p
		    break
	else:
	    if not os.path.exists(path):
		    for ext in self.extensions_map.keys():
			    if os.path.exists(path + ext):
				    path = path + ext
				    break


	print "@@ translated path: ", path

	return path

    def check_auth(self, method, path='/'):
	c = self.address_string() # get hostname of client
	for d in self.authorized_domains:
	    if c[-len(d):] == d:
		return 1

	self.send_error(403, "Host %s unauthorized" % c)
	return 0


class ProxyHandler(RootedHandler):
	# Handles proxy requests by serving local files.

	proxy_for = ["http://www.w3.org"]

	def translate_path(self, path, find_welcome=1):
		for p in self.proxy_for:
			if path[:len(p)] == p:
				path = path[len(p):]
		return RootedHandler.translate_path(self, path, find_welcome)



HTTPError = 'EditServer.HTTPError'

class EditRequestHandler(ProxyHandler):

    def content_length(self):
	l = self.headers.getheader('content-length')
	if l:
	    try:
		return string.atoi(l)
	    except:
		pass
	raise HTTPError, (400, "Bad Content-Length: " + `l`)

    def do_PUT(self):
	if not self.check_auth('PUT'): return ## change to exception
	try:
	    self.put()
	except HTTPError:
	    import sys
	    code, msg = sys.exc_value
	    self.send_error(code, msg)

    def put(self):

	P = os.path
	self.headers.getheader('Content-Type')
	path = self.translate_path(self.path)
	
	print "@@", self.headers.headers

	l = self.content_length()

	try:
	    sv = open(path, "w")
	    sv.write(self.rfile.read(l))
	    sv.close
	except IOError:
	    self.send_error(500, "Error writing file: " + `sys.exc_type` + `sys.exc_value`)
	    return

	self.send_response(200)
	self.send_header("Content-Type", "text/html")
	self.end_headers()

	#@@ send form for change-comments; Do checkin
	self.wfile.write("<!doctype html><p>done!")


def main(argv):
    SimpleHTTPServer.test(EditRequestHandler, SocketServer.TCPServer)

if __name__ == '__main__':
    import sys
    main(sys.argv)
Received on Tuesday, 26 December 1995 23:08:40 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Wednesday, 27 October 2010 18:14:18 GMT