add possibility to serve non-Scheme files
This commit is contained in:
		
							parent
							
								
									4899ff0453
								
							
						
					
					
						commit
						f9f854ef85
					
				| 
						 | 
				
			
			@ -121,6 +121,7 @@
 | 
			
		|||
	thread-fluids			;FORK-THREAD
 | 
			
		||||
	sxml-to-html			;SXML->HTML
 | 
			
		||||
	scsh				;regexp et al.
 | 
			
		||||
;	httpd-file-directory-handlers	;send-file-response
 | 
			
		||||
	scheme
 | 
			
		||||
	)
 | 
			
		||||
  (files servlet-handler))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -107,39 +107,52 @@
 | 
			
		|||
				  (format #f "Bad path: ~s" path)))))
 | 
			
		||||
 | 
			
		||||
(define (launch-new-instance path-string servlet-path req)
 | 
			
		||||
  (if (file-not-exists? (absolute-file-name path-string servlet-path))
 | 
			
		||||
      (make-http-error-response http-status/not-found req path-string)
 | 
			
		||||
      (begin
 | 
			
		||||
	(obtain-lock *instance-table-lock*)
 | 
			
		||||
	;; no access to instance table until new instance-id is saved
 | 
			
		||||
	(let ((instance-id (generate-new-table-id *instance-table*))
 | 
			
		||||
	      (memo (make-memo)))
 | 
			
		||||
	  (table-set! *instance-table* instance-id
 | 
			
		||||
		      (make-instance path-string    ; used to make
 | 
			
		||||
						  ; redirections to origin
 | 
			
		||||
				     memo
 | 
			
		||||
				     (make-integer-table) ; continuation table
 | 
			
		||||
				     (make-lock)          ; continuation table lock
 | 
			
		||||
				     (make-thread-safe-counter))) ; continuation counter
 | 
			
		||||
	  (release-lock *instance-table-lock*)
 | 
			
		||||
	  (register-session! instance-id 'no-return)
 | 
			
		||||
	  (let ((servlet (with-fatal-error-handler*
 | 
			
		||||
			 (lambda (condition decline)
 | 
			
		||||
			   (delete-instance! instance-id)
 | 
			
		||||
			   (decline)) 
 | 
			
		||||
			 (lambda () 
 | 
			
		||||
			   (get-servlet-rt-structure path-string servlet-path)))))
 | 
			
		||||
	    (fork-thread (instance-surveillance instance-id
 | 
			
		||||
						(+ (time)
 | 
			
		||||
						   (options-instance-lifetime))
 | 
			
		||||
						memo))
 | 
			
		||||
	    (reset
 | 
			
		||||
	     (begin
 | 
			
		||||
	       (with-cwd
 | 
			
		||||
		servlet-path
 | 
			
		||||
		(with-names-from-rt-structure 
 | 
			
		||||
		 servlet servlet-interface 
 | 
			
		||||
		 (main req))))))))))
 | 
			
		||||
  (cond 
 | 
			
		||||
   ((file-not-exists? (absolute-file-name path-string servlet-path))
 | 
			
		||||
    (make-http-error-response http-status/not-found req path-string))
 | 
			
		||||
   ((string=? (file-name-extension path-string) ".scm")
 | 
			
		||||
    (obtain-lock *instance-table-lock*)
 | 
			
		||||
    ;; no access to instance table until new instance-id is saved
 | 
			
		||||
    (let ((instance-id (generate-new-table-id *instance-table*))
 | 
			
		||||
	  (memo (make-memo)))
 | 
			
		||||
      (table-set! *instance-table* instance-id
 | 
			
		||||
		  (make-instance path-string    ; used to make
 | 
			
		||||
					; redirections to origin
 | 
			
		||||
				 memo
 | 
			
		||||
				 (make-integer-table) ; continuation table
 | 
			
		||||
				 (make-lock)          ; continuation table lock
 | 
			
		||||
				 (make-thread-safe-counter))) ; continuation counter
 | 
			
		||||
      (release-lock *instance-table-lock*)
 | 
			
		||||
      (register-session! instance-id 'no-return)
 | 
			
		||||
      (let ((servlet 
 | 
			
		||||
	     (with-fatal-error-handler
 | 
			
		||||
	      (lambda (condition decline)
 | 
			
		||||
		(delete-instance! instance-id)
 | 
			
		||||
		(decline)) 
 | 
			
		||||
	      (get-servlet-rt-structure path-string servlet-path))))
 | 
			
		||||
	(fork-thread (instance-surveillance instance-id
 | 
			
		||||
					    (+ (time)
 | 
			
		||||
					       (options-instance-lifetime))
 | 
			
		||||
					    memo))
 | 
			
		||||
	(reset
 | 
			
		||||
	 (begin
 | 
			
		||||
	   (with-cwd
 | 
			
		||||
	       servlet-path
 | 
			
		||||
	       (with-names-from-rt-structure 
 | 
			
		||||
		servlet servlet-interface 
 | 
			
		||||
		(main req))))))))
 | 
			
		||||
   (else				; We'll serve every non-scm file.
 | 
			
		||||
    ;; We need access to SEND-FILE-RESPONSE of
 | 
			
		||||
    ;; HTTPD-FILE-DIR-HANDLERS. In the official SUnet release, we
 | 
			
		||||
    ;; don't have it, so we disable this feature here.
 | 
			
		||||
;    (let ((full-file-name (absolute-file-name path-string servlet-path)))
 | 
			
		||||
;      (send-file-response full-file-name
 | 
			
		||||
;			  (file-info full-file-name)
 | 
			
		||||
;			  req))
 | 
			
		||||
    (make-http-error-response http-status/forbidden req
 | 
			
		||||
			      "Can't serve other than Scheme files."
 | 
			
		||||
			      path-string))
 | 
			
		||||
   ))
 | 
			
		||||
 | 
			
		||||
(define (instance-surveillance instance-id time-to-die memo)
 | 
			
		||||
  (lambda ()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue