elserv (0.4.0+0.20011203cvs-17.1) direct (non packaging) changes

Summary

 ELSERV-MK  |    4 
 Makefile   |    2 
 elservd    |  277 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 es-demo.el |    2 
 4 files changed, 281 insertions(+), 4 deletions(-)

    
download this patch

Patch contents

--- elserv-0.4.0+0.20011203cvs.orig/es-demo.el
+++ elserv-0.4.0+0.20011203cvs/es-demo.el
@@ -287,7 +287,7 @@
 		  :content-type "text/html; charset=iso-2022-jp")
   (elserv-publish (elserv-find-process)
 		  (concat path "/data")
-		  :directory "/usr/local/www/data")
+		  :directory "/usr/share/doc/elserv")
   (elserv-publish (elserv-find-process) 
 		  (concat path "/logo.gif")
 		  :string
--- elserv-0.4.0+0.20011203cvs.orig/ELSERV-MK
+++ elserv-0.4.0+0.20011203cvs/ELSERV-MK
@@ -80,7 +80,7 @@
 
 (defun config-elserv (&optional silent)
   (let (prefix lisp-dir exec-dir)
-    (config-ruby)
+;    (config-ruby)
     (and (setq prefix (car command-line-args-left))
 	 (or (string-equal "NONE" prefix)
 	     (setq PREFIX prefix)))
@@ -93,7 +93,7 @@
 	 (or (string-equal "NONE" exec-dir)
 	     (setq EXEC_DIR exec-dir)))
     (setq command-line-args-left (cdr command-line-args-left)))
-  (config-icon)
+;  (config-icon)
   (load-file "ELSERV-CFG")
   (load-file "ELSERV-ELS")
   (unless silent
--- elserv-0.4.0+0.20011203cvs.orig/elservd
+++ elserv-0.4.0+0.20011203cvs/elservd
@@ -0,0 +1,277 @@
+#!/usr/bin/ruby
+# -*- ruby -*-
+# elservd - A daemon process for elserv
+# Yuuichi Teranishi <teranisi@gohome.org>
+
+require "socket"
+require "thread"
+require "timeout"
+require "monitor"
+
+if (ARGV.length != 5)
+  STDERR.print "error: wrong number of arguments ", ARGV.length, "\n"
+  exit(1)
+end
+
+CRLF = "\r\n"
+STDOUT.binmode
+
+# Arguments:
+# port-number {log|nolog} max-children max-keep-alive keep-alive-timeout
+
+ident = true if ARGV[1] == "log"
+max_children = ARGV[2].to_i if ARGV[2] != "0"
+max_keep_alive = ARGV[3].to_i if ARGV[3] != "0"
+keep_alive_timeout = ARGV[4].to_i if ARGV[4] != "0"
+keep_alive_timeout = 15 unless keep_alive_timeout
+
+session_hash = Hash.new (nil)
+
+class ElservClientSession
+  def initialize (socket, max_count = 0)
+    @socket = socket
+    @max_count = max_count
+    @serve_count = 0
+    @key = @socket.peeraddr[1].to_s
+    @keep_alive  = true
+    
+    @mutex = Monitor.new
+    @cond = @mutex.new_cond
+    @running = false
+    
+    @closed = false
+  end
+
+  def set_close! ()
+    @keep_alive = nil
+  end
+
+  def key
+    return @key
+  end
+
+  def peer_host
+    return @socket.peeraddr[2]
+  end
+
+  def peer_addr
+    return @socket.peeraddr[3]
+  end
+
+  def wait
+    @mutex.synchronize do
+      @cond.wait_while {@running}
+    end
+  end
+  
+  def start
+    @mutex.synchronize do
+      @running = true
+    end
+  end
+
+  def closed? ()
+    return @closed
+  end
+
+  def gets ()
+    return @socket.gets
+  end
+
+  def close ()
+    @socket.close
+    @closed = true
+  end
+
+  def serve_page (content)
+    # serve_page may close the socket.
+    @socket.write (content + "\r\n")
+    @serve_count += 1
+    if (@max_count != 0)
+      if (@serve_count >= @max_count)
+	@socket.close
+	@closed = true
+      end
+    end
+    if !@keep_alive
+      @socket.close
+      @closed = true
+    end
+    @mutex.synchronize do
+      @running = false
+      @cond.signal
+    end
+  end
+
+  def read (length)
+    return @socket.read (length)
+  end
+  
+  def read_chunked()
+    len = nil
+    total = 0
+    body = ""
+    while true do
+      line = @socket.gets
+      m = /[0-9a-fA-F]+/.match(line)
+      m or close # XXX
+      len = m[0].hex
+      break if len == 0
+      body << @socket.read(len)
+      @socket.read (2)   # CRLF
+    end
+    until @socket.gets.empty? do
+      ;
+    end
+    return body
+  end
+end
+
+#  emacs                         elservd
+#    <===  greeting:port   ===
+#     ===  connect         ===>
+#    <===  request,key     ===  
+#     ===  key:length,CRLF ===>
+#     ===  content,  CRLF  ===>
+#
+
+## Emacs thread
+Thread.start() do
+  emacs_daemon = TCPserver.open("localhost", 0)
+  ## Greeting.
+  STDOUT.print "elserv-port: ", emacs_daemon.addr[1], CRLF, CRLF
+  while TRUE
+    ## EMACS thread.
+    esock = emacs_daemon.accept
+    content = nil
+    sport = nil
+    while line = esock.gets # wait for the emacs response.
+      if line =~ /^stop/
+	# emacs sent 'stop'.
+	emacs_daemon.shutdown(2)
+	esock.close()
+      elsif line =~/(\d+)([:;])(\d+)/
+	# emacs sent port:bytes
+	content = esock.read ($3.to_i)
+	esock.read (2) # CRLF
+	session = session_hash[$1]
+	if session
+	  if ($2 == ";") # ';'=> close ':' => keep_alive
+	    session.set_close!
+	  end
+	  session.serve_page (content)
+	end
+      else # invalid. close connection
+	esock.close()
+      end
+      # end of EMACS thread
+    end
+  end
+end
+
+session_count = 0
+m = Mutex.new
+
+## MAIN thread
+gs = TCPserver.open(ARGV[0])
+while TRUE
+  s = gs.accept
+  ## end of MAIN thread
+  Thread.start() do
+    ## SESSION thread
+    sock = s # thread local
+    # identity check
+    user = ""
+    if ident
+      begin
+	isock = TCPSocket.open(sock.peeraddr[3], "auth")
+      rescue
+	isock = nil
+      end
+      if isock
+	isock.write (sock.addr[1].to_s + ","+ sock.peeraddr[1].to_s + "\r\n")
+	igot = isock.gets.split(/: */)
+	if igot
+	  user += "elserv-ident: "+ igot[3]
+	end
+	isock.close
+      end
+    end
+    # end of identity check
+    session = ElservClientSession.new (sock, (max_keep_alive or 0))
+    m.synchronize do
+      session_count += 1
+    end
+    # LOCK OUT!
+    if max_children and (session_count > max_children)
+      session.close
+    end    
+    first_request = true
+    while !session.closed?
+      req = ""
+      force_close = true
+      chunked = false
+      content_length = 0
+      if first_request
+	# first request.
+	while (got = session.gets) != CRLF
+	  if got =~ /^content-length: *(\d+)/i
+	    content_length = $1.to_i
+	  elsif got =~ /^connection: *keep-alive/i
+	    force_close = false
+	  elsif got =~ /^transfer-coding: *chunked/i
+	    chunked = true
+	  end
+	  req += got
+	end
+      else
+	# requests while keep-alive
+	begin
+	  timeout (keep_alive_timeout) do
+	    while (got = session.gets) != CRLF
+	      if got =~ /^content-length: *(\d+)/i
+		content_length = $1.to_i
+	      elsif got =~ /^connection: *keep-alive/i
+		force_close = false
+	      elsif got =~ /^transfer-encoding: *chunked/i
+		chunked = true
+	      end
+	      req += got
+	    end
+	  end
+	rescue TimeoutError
+	  req = ""
+	end
+      end
+      first_request = false
+      if req == ""
+	# bogus null request.
+	force_close = true
+	session.close
+      else
+	if chunked
+	  body = session.read_chunked
+	  body = [body].pack('m').chomp.gsub("\n",CRLF+" ")
+	  req += "elserv-content: " + body + CRLF
+	elsif content_length != 0
+	  body = session.read (content_length)
+	  body = [body].pack('m').chomp.gsub("\n",CRLF+" ")
+	  req += "elserv-content: " + body + CRLF
+	end
+	session_hash[session.key] = session
+	session.set_close! if force_close
+	session.start
+	STDOUT.print user,
+	  "elserv-key: ", session.key, CRLF,
+	  "elserv-client: ", session.peer_host, " ", session.peer_addr, CRLF,
+	  "elserv-request: ", req, CRLF
+	STDOUT.flush
+	session.wait
+      end
+    end # end of while !session.closed?
+    m.synchronize do
+      session_count -= 1
+    end
+    ## end of SESSION thread
+  end
+end
--- elserv-0.4.0+0.20011203cvs.orig/Makefile
+++ elserv-0.4.0+0.20011203cvs/Makefile
@@ -17,7 +17,7 @@
 EXEC_DIR = NONE
 ICON_DIR = NONE
 
-GOMI	= *.elc auto-autoloads.el custom-load.el elservd
+GOMI	= *.elc auto-autoloads.el custom-load.el
 
 elc:
 	$(EMACS) $(FLAGS) -f compile-elserv \