Websh foi originalmente desenvolvido pela Netcetera AG, Suíça e foi contribuído para a Apache Software Foundation em 2001.
A versão mais recente é Websh 3.6.0b5 (14/09/2009)
Infelizmente, o Apache “descontinuou o suporte e desenvolvimento do Websh por falta de recursos”.
Tcl é uma boa linguagem de programação no sentido de que representa o programa como uma lista de comandos, o que é semelhante à nossa linguagem natural.
Tcl também é poderoso com muitos conceitos de programação "sofisticados" disponíveis desde muito cedo.
A ideia de usar Tcl para programação web é natural. Websh é um desses esforços.
Websh pode ser usado de uma das 4 maneiras abaixo:
Embora o Websh tenha sido originalmente projetado para web, descobri que também é útil usá-lo em outro lugar.
O conceito chave aqui é "comando", assim como aquele em Tool Command Language (Tcl).
Um script Olá mundo Websh se parece com o abaixo. web::command
e web::dispatch
são os dois comandos principais.
web::command hello {
web::put " hello "
}
web::command world {
web::put " world "
}
web::dispatch
Websh é uma extensão Tcl pura. O processo de construção é semelhante com
cd src/unix
autoconf
./configure
--with-tclinclude=/usr/include/tcl
--with-httpdinclude=/usr/include/apache2
--enable-threads
make
make test
make apachetest
make install
Make criará três alvos: websh3.6., que é o aplicativo Websh autônomo (ligado dinamicamente ao Tcl e libwebsh3.6..so) e libwebsh3.6..so, que é um objeto compartilhado compatível com TEA (Tcl Extension Architecture). que pode ser carregado dinamicamente de dentro do Tcl usando [load libwebsh3.6..so]. Ambos fornecem o pacote Tcl websh. O terceiro alvo é mod_websh3.6..so (também vinculado dinamicamente ao Tcl e libwebsh3.6..so), que é o módulo Websh Apache.
Os aplicativos Websh podem ser executados no modo CGI ou por meio de mod_websh
.
LoadModule websh_module /path/to/mod_websh.so
< IfModule websh_module>
WebshConfig /path/to/websh.conf
AddHandler websh .wsh
IfModule >
Com mod_websh, o interpretador Tcl pode ser reutilizado entre cada solicitação.
Esse recurso pode aumentar muito o tempo de resposta do script da web.
set classid [web::interpclasscfg]
web::interpclasscfg $classid maxrequests 100 ; # handle at most 100 request
web::interpclasscfg $classid maxttl 600 ; # live at most 600 seconds
web::interpclasscfg $classid maxidletime 180 ; # idle at most 180 seconds
Como o interpretador pode ser reutilizado, precisamos de configuração uma vez no início e limpeza no final.
# ----------------------------------------------------#
# web::initializer will execute in listed order #
# ----------------------------------------------------#
web::initializer {
web::logdest add user.-debug file -unbuffered /tmp/test.log
web::logfilter add *.-debug
web::log info " initializing interp "
}
# ----------------------------------------------------#
# web::finalizer will be executed in reverse order #
# ----------------------------------------------------#
web::finalizer {
web::log info " start shutting down interp "
}
web::finalizer {
web::log info " just before shutting down interp "
}
# ----------------------------------------------------#
# web::command will be dispatched from web::dispatch #
# ----------------------------------------------------#
web::command default {
web::put " hello "
web::putx /path/to/page.html
}
web::dispatch