Forum OpenACS Q&A: Response to Support for multibyte: .tcl ok .adp not
I have some patches which instead load the adp file into a Tcl string, using the encoding conversion of your choice (as specified by the mime type that you assign to .adp files in your server config file). It then calls ns_adp_parse with the -string option and passes that string. The patch also sets the appropriate output encoding so that AOLserver converts the file from UTF8 to the correct encoding when it returns it to the browser.
My patches are at http://www.ai.mit.edu/people/hqm/openacs
My .tcl config file is shown below. We are running Japanese OpenACS sites with OpenACS3.2.5 and shiftJIS encoding. Note that it is key to turn off the default mapping of .adp files to the adp parser, that I think the default OpenACS config file has. Instead, we use the big registered proc that passes everything under /* to ad_handle_abstract_url
The db's are created using the "createdb --encoding=unicode" flag
# # AOLserver/OpenNSD Sample Configuration File # # Improved with lots of comments and things you'll need for # running OpenACS. # # by Roberto Mello (rmello@fslc.usu.edu) # $Id: nsd.txt,v 1.6 2001/02/15 06:29:43 rmello Exp $ ns_log notice "nsd.tcl: starting to read config file..." # # If httpport is set to 80, you'll have to start AOLserver as root and pass the user # AOLserver will run as in the command line. (e.g. ./nsd -u nsadmin -g nsadmin -t ../nsd.tcl) # (assuming you're starting AOLserver from the {aolserverdir}/bin directory. set httpport 80 set httpsport 443 # # Make sure your /etc/hostname is setup right, with your full domain. If you want AOLserver # to listen to www.foobar.com instead of foobar.com then hard code the appropriate domain # in the line below (e.g. set hostname www.foobar.com). # set hostname [ns_info hostname] set address [ns_info address] # # You can name your server whatever you want, but you'll need a directory with that # name under {aolserverdir}/servers/ writable by you AOLserver user. # # For example: if your AOLserver is in /usr/local/aolserver and your server is "server1" # you will need a /usr/local/aolserver/servers/server1 directory. # set server "openacs325" set servername "openacs325" # # AOLserver's home and binary directories. Autoconfigurable. # set homedir [file dirname [ns_info config]] set bindir [file dirname [ns_info nsd]] # # Where are your pages going to live ? # set pageroot /web/${server}/www set directoryfile index.adp,index.tcl,index.html,index.htm # # nsssl: Only loads if keyfile.pem and certfile.pem exist. # If you are using SSL, make sure you have these dirs and files (refer # to the AOLserver docs) set sslkeyfile ${homedir}/servers/${server}/modules/nsssl/keyfile.pem set sslcertfile ${homedir}/servers/${server}/modules/nsssl/certfile.pem # # Global server parameters # ns_section "ns/parameters" ns_param home $homedir ns_param debug false ns_param mailhost localhost ns_param ServerLog ${homedir}/log/${server}-error.log # ns_param LogRoll on ns_param HackContentType 1 ns_param URLCharset shift_jis ns_param OutputCharset shift_jis ns_param HttpOpenCharset shift_jis # # Thread library (nsthread) parameters # ns_section "ns/threads" ns_param mutexmeter true ;# measure lock contention #ns_param stacksize [expr 128*1024] ;# Per-thread stack size for hungry C modules # # MIME types. # # Note: AOLserver already has an exhaustive list of MIME types, but in # case something is missing you can add it here. # ns_section "ns/mimetypes" ns_param default "*/*" ;# MIME type for unknown extension ns_param noextension "*/*" ;# MIME type for missing extension #ns_param ".xls" "application/vnd.ms-excel'' ns_param .html "text/html; charset=shift_jis" ns_param .tcl "text/html; charset=shift_jis" ns_param .adp "text/html; charset=shift_jis" # # Tcl Configuration # ns_section "ns/server/${server}/tcl" ns_param autoclose "on" ns_param debug "false" # This is where this server's private Tcl library is. All .tcl files in this directory # are parsed when AOLserver starts. The crucial procedures used in OpenACS are # defined through this library # ns_param library "/web/${server}/tcl" ############################################################ # # Server-level configuration # # There is only one server in AOLserver, but this is helpful when multiple # servers share the same configuration file. This file assumes that only # one server is in use so it is set at the top in the "server" Tcl variable # Other host-specific values are set up above as Tcl variables, too. # ns_section "ns/servers" ns_param $server $servername # # Server parameters # ns_section "ns/server/${server}" ns_param directoryfile $directoryfile ns_param pageroot $pageroot ns_param globalstats false ;# Enable built-in statistics ns_param urlstats false ;# Enable URL statistics ns_param maxurlstats 1000 ;# Max number of URL's to do stats on ns_param enabletclpages true ;# Parse tcl files in pageroot (dangerous) # # If you want to customize AOLserver's response to things like ``Internal Server Error'' # and other HTTP responses. OpenACS comes with some in the directory www/global. ns_param NotFoundResponse "/global/file-not-found.html" ns_param ServerBusyResponse "/global/busy.html" ns_param ServerInternalErrorResponse "/global/error.html" ns_param ForbiddenResponse "/global/forbidden.html" ns_param UnauthorizedResponse "/global/unauthorized.html" # Directory listings -- use an ADP or a Tcl proc to generate them. # #ns_param directoryadp $pageroot/dirlist.adp ;# Choose one or the other ns_param directoryproc _ns_dirlist ;# ...but not both! ns_param directorylisting fancy ;# Can be simple or fancy # for backport of ad_proc -- hqm ns_param acs_root_dir "/web/${server}" # # ADP (AOLserver Dynamic Page) configuration # #ns_section "ns/server/${server}/adp" # ns_param map "/*.adp" ;# Extensions to parse as ADP's #ns_param map "/*.html" ;# Any extension can be mapped # ns_param enableexpire false ;# Set "Expires: now" on all ADP's # ns_param enabledebug false ;# Allow Tclpro debugging with "?debug" # ADP special pages #ns_param errorpage ${pageroot}/errorpage.adp ;# Pretty-print ADP scripting errors # # ADP custom parsers -- see adp.c # ns_section "ns/server/${server}/adp/parsers" ns_param fancy ".adp" # # Socket driver module (HTTP) -- nssock # ns_section "ns/server/${server}/module/nssock" ns_param port $httpport ns_param hostname $hostname ns_param address $address # # Socket driver module (HTTPS) -- nsssl # # nsssl does not load unless sslkeyfile/sslcertfile exist (above). # ns_section "ns/server/${server}/module/nsssl" ns_param port $httpsport ns_param hostname $hostname ns_param address $address ns_param keyfile $sslkeyfile ns_param certfile $sslcertfile # # Database drivers # The database driver is specified here. PostgreSQL driver being loaded. # Make sure you have the driver compiled and put it in {aolserverdir}/bin # ns_section "ns/db/drivers" ns_param postgres ${bindir}/postgres.so ;# Load PostgreSQL driver # # Database Pools: This is how AOLserver ``talks'' to the RDBMS. You need three for # OpenACS: main, log, subquery. Make sure to replace ``yourdb'' and ``yourpassword'' # with the actual values for your db name and the password for it. # AOLserver can have different pools connecting to different databases and even different # different database servers. # ns_section "ns/db/pools" ns_param main "OpenACS Main Pool" ns_param log "OpenACS Log Pool" ns_param subquery "OpenACS Subquery Pool" ns_section "ns/db/pool/main" ns_param Driver postgres ns_param Connections 5 ;# 5 is a good number. Increase according to your needs ns_param DataSource localhost::openacs325 ;# Replace 'yourdb' with the name of your database in PG ns_param User nsadmin ;# User and password AOLserver will use to connect ns_param Password "nsadmin123" ns_param Verbose Off ;# Set it to On to see all queries. Good for debugging SQL. ns_param LogSQLErrors On ns_param ExtendedTableInfo On # ns_param MaxOpen 1000000000 ;# Max time to keep idle db connection open # ns_param MaxIdle 1000000000 ;# Max time to keep active db connection open ns_section "ns/db/pool/log" ns_param Driver postgres ns_param Connections 5 ns_param DataSource localhost::openacs325 ns_param User nsadmin ns_param Password "nsadmin123" ns_param Verbose On ns_param LogSQLErrors On ns_param ExtendedTableInfo On # ns_param MaxOpen 1000000000 # ns_param MaxIdle 1000000000 ns_section "ns/db/pool/subquery" ns_param Driver postgres ns_param Connections 2 ns_param DataSource localhost::openacs325 ns_param User nsadmin ns_param Password "nsadmin123" ns_param Verbose On ns_param LogSQLErrors On ns_param ExtendedTableInfo On # ns_param MaxOpen 1000000000 # ns_param MaxIdle 1000000000 ns_section "ns/server/${server}/db" ns_param Pools "*" ns_param DefaultPool "main" # # nscp: AOLserver Control Port - very useful for testing and evaluating. # Uncomment the sample password below and do a "telnet localhost 9999" # log in with "nsadmin", password "x", type "ns_crypt newpassword salt" # and paste the new encrypted string below. # # Sample User="nsadmin", password="x" set nscp_user "nsadmin:t2GqvvaiIUbF2:" # # Control port -- nscp # nscp does not load unless nscp_user is a valid user. # ns_section "ns/server/${server}/module/nscp" ns_param port 9999 ns_param address "127.0.0.1" ;# LOCALHOST IS RECOMMENDED ns_section "ns/server/${server}/module/nscp/users" ns_param user $nscp_user # # Access log -- nslog # ns_section "ns/server/${server}/module/nslog" ns_param rolllog true ;# Should we roll log? ns_param rollonsignal true ;# Roll log on SIGHUP ns_param rollhour 0 ;# Time to roll log ns_param maxbackup 5 ;# Max number to keep around when rolling # ns_param file ${homedir}/log/${server}.log ns_param EnableHostnameLookup Off ns_param LogCombined On ns_param LogRefer Off ns_param LogUserAgent Off # # nsjava - aolserver module that embeds a java virtual machine. Needed to # support webmail. See http://nsjava.sourceforge.net for further # details. # ns_section "ns/server/acs-pg/module/nsjava" ns_param EnableJava "off" ;# Set to on to enable nsjava. ns_param VerboseJvm "off" ;# Same as command line -debug. ns_param LogLevel "Notice" ns_param DestroyJvm "off" ;# Destroy jvm on shutdown. ns_param DisableJITCompiler "off" ns_param ClassPath "/usr/local/jdk/jdk118_v1/lib/classes.zip:/usr/local/aolserver/bin/nsjava.jar:/home/nsadmin/mirror/openacs325/www/webmail/java/activation.jar:/home/nsadmin/mirror/openacs325/www/webmail/java/mail.jar:/home/nsadmin/mirror/openacs325/www/webmail/java" # # CGI interface -- nscgi, if you have legacy stuff. Tcl or ADP files inside # AOLserver are vastly superior to CGIs. You don't actually need the Interps # if your script calls the appropriate interpreter itself. # ns_section "ns/server/${server}/module/nscgi" ns_param map "GET /cgi-bin /web/$server/cgi-bin" ns_param map "POST /cgi-bin /web/$server/cgi-bin" ns_param Interps CGIinterps ns_section "ns/interps/CGIinterps" ns_param .pl "/usr/bin/perl" ns_param .doit "/bin/bash" # # Modules to load # ns_section "ns/server/${server}/modules" ns_param nssock ${bindir}/nssock.so ns_param nslog ${bindir}/nslog.so ns_param nsxml ${bindir}/nsxml.so # ns_param nsperm ${bindir}/nsperm.so ns_param nscgi ${bindir}/nscgi.so # ns_param nsjava ${bindir}/libnsjava.so # ns_param ats Tcl # ## nsssl: loads only if requisite files already exist (see top of this # file). # if { [file exists $sslcertfile] && [file exists $sslkeyfile] } { ns_param nsssl ${bindir}/nsssle.so } else { ns_log warning "nsd.tcl: nsssl not loaded because key/cert files do not exist." } # nscp: loads only if nscp_user is set (see top of this file). if { $nscp_user != "" } { # ns_param nscp ${bindir}/nscp.so } else { ns_log warning "nsd.tcl: nscp not loaded because user/password is not set." } #ns_section "ns/server/${server}/ats" #ns_param ResourcePath ${homedir}/modules/tcl/ats/resources # # To Source OpenACS Config File. You need a "yourservername.tcl" file in the # OpenACS parameters dir. e.g.: say your server is "server1" then you'd need a # file named /web/server1/parameters/server1.tcl # (Hint: Rename ad.tcl to yourservername.tcl and edit it.) # source /web/${server}/parameters/${server}.tcl ns_log notice "nsd.tcl: finished reading config file." ns_log notice "HOMEDIR = $homedir"