This is more of a tcl question than aolserver but its coming up in my
server so I'll start here. Is there a way to make exec not do
translations on the returned data? Here's my exact situation. I have a
proc to handle php files by spawning the standalone "php" program
(this it low-volume so I'm not overly worried about how inefficient this
setup is). This is my proc:
proc runPhp {file} {
set body [ns_conn content]
array set cgienv {
SERVER_SOFTWARE AOLserver/4.0
SERVER_NAME www.example.com
GATEWAY_INTERFACE CGI/0.1
SERVER_PROTOCOL HTTP/1.0
SERVER_PORT 80
REDIRECT_STATUS 200
}
set cgienv(CONTENT_LENGTH) [string length $body]
set cgienv(CONTENT_TYPE) [ns_set get [ns_conn headers] Content-Type]
set cgienv(REQUEST_METHOD) [ns_conn method]
set cgienv(REMOTE_ADDR) [ns_conn peeraddr]
set cgienv(QUERY_STRING) [ns_conn query]
set cgienv(SCRIPT_NAME) [ns_conn url]
set cgienv(SCRIPT_FILENAME) $file
foreach {hl v} [ns_set array [ns_conn headers]] {
set cgienv(HTTP_[string map {- _} [string toupper $hl]]) $v
}
set sli [interp create]
interp eval $sli array set env [list [array get cgienv]]
interp eval $sli [list set body $body]
interp eval $sli [list set file $file]
# binary workaround
interp eval $sli {set pf [open "|php $file" r+]}
interp eval $sli {fconfigure $pf -translation binary}
interp eval $sli {puts $pf $body}
interp eval $sli {flush $pf}
set result [interp eval $sli {read $pf}]
interp eval $sli {close $pf}
# set result [interp eval $sli exec php $file << \$body]
interp delete $sli
set lines [split $result "\n"]
if {[string match "Status:*" [lindex $lines 0]]} {
regsub {^Status:\s*} [lindex $lines 0] "" status
set lines [lrange $lines 1 end]
} else {
set status "200 OK"
}
ns_write "HTTP/1.0 $status \n"
ns_write [join $lines "\n"]
}
using [open "|php" r+] works ok, but it makes me nervous about getting
stuck in a deadlock, where the php program is waiting for eof but never
getting it since that won't happen until it closes the filehandle at
which time it is gone. [exec php << $body] is much cleaner and works,
except for the things that want to return binary content like images,
and those get mangled by tcl's default line-ending handling.
So - is there any way to make exec use binary translation (i.e., no
translation) in what it returns?
-J
--
AOLserver - http://www.aolserver.com/
To Remove yourself from this list, simply send an email to <[EMAIL PROTECTED]>
with the
body of "SIGNOFF AOLSERVER" in the email message. You can leave the Subject:
field of your email blank.