AI
Animation
CGI
Compression
Console
Database
Debug
Dialects
Dialogs
Editor
Email
Encryption
Extension
External Library
File
File Handling
Files
Financial
FTP
Game
Games
Graphics
GUI
HTML
HTTP
Internet
LDC
Markup
Math
Module
Network
Networking
None
Other - Net
Parse
Patch
Printing
Protocol
Rebol
Scheme
Scientific
SDK
Security
Shell
Sound
SQL
TCP
Testing
Text
Text Processing
UI
User Interface
Util
Utility
VID
Visualization
Web
Win API
X-File
XML
REBOL [
	Title: "FastCGI Broker"
	File: %fcgi-broker.r
	Date: 15-Dec-2005
	Author: "Pascal Hurni"
	Version: 1.0.1
	Library: [
		level: 'intermediate
		platform: 'windows
		type: [module tool]
		domain: [cgi http html extension win-api]
		tested-under: [w2k core 2.5.6 view 1.3.1 view 1.3.2]
		support: http://mortimer.devcave.net/projects/rebfcgi
		license: 'bsd
		see-also: http://mortimer.devcave.net
	]
	Purpose: {Rebol script broker for a hooked rebol interpreter launched as a FastCGI application.
		This is the root script which runs others scripts on request of the FastCGI peer.
	
		This enables REBOL/Core or REBOL/View to act as a FastCGI application without the need
		for REBOL/Command.
	
		This script only works on Windows with a patched REBOL interpreter.
		Details available at http://mortimer.devcave.net/projects/rebfcgi
	}
]

fcgi-broker: context [
	;-- buffer for the command
	command: make string! 8192

	;-- magic value to indicate 'end of command'
	magic: to-binary {^~ReBfCgI}

	;-- alias for the input stream
	stdin: system/ports/input

	;-- Function that waits for the next request
	wait-for-command: func [port [port!] /local result][
		;-- commands are line oriented
		set-modes stdin [lines: true]
	
		;-- Read stdin until we find the magic marker (this is to skip previous stdin data not read)
		while [not error? result: try [command: copy first port]][
			if command: find/tail command magic [
				return command
			]
		]
		;-- Loop broken by an error, is it an EOF ?
		if not-equal? 315 get in disarm result 'code [
			;-- No, show it
			probe result
		]

		none
	]

	;-- The broker itself
	run: has [result][
		;-- Keep original words
		quit': :quit
		halt': :halt
	
		;-- Quit and Halt executed in the script, should simply abort the do block
		quit: halt: func [[throw]][return none]

		;-- Wait and get next FCGI command
		while [command: wait-for-command stdin][
			;-- Execute the command which will set up the system/options/cgi
			do command

			;-- Launch the script (DO DOES is for encapsulating the try block in a function so that QUIT and HALT can simply RETURN)
			if do does [error? set/any 'result try [do to-rebol-file system/options/cgi/path-translated]][
				;-- Output error to web server
				print rejoin ["Content-Type: text/plain^/^/
" mold disarm result "
"] ] ;-- Put the 'End of command' marker in the output stream write-io system/ports/output magic length? magic ;-- This tries to force a thread scheduling, so that the FcgiHandler can catch the magic marker (it has a higher priority) wait 0.01 ] ;-- No more commands, end. quit: :quit' halt: :halt' ] ] ;-- Do it! fcgi-broker/run
Copyright © 2018 Rebol Software Foundation