/usr/share/tcltk/xotcl1.6.7-actiweb/HttpPlace.xotcl is in xotcl 1.6.7-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 | # $Id: HttpPlace.xotcl,v 1.6 2006/09/27 08:12:40 neumann Exp $
package provide xotcl::actiweb::httpPlace 0.8
package require xotcl::trace
package require xotcl::actiweb::invoker
package require xotcl::actiweb::webObject
package require xotcl::comm::httpd
package require xotcl::scriptCreation::scriptCreator
package require xotcl::store::persistence
package require xotcl::pattern::singleton
package require xotcl::registry::registry
package require xotcl::actiweb::agentManagement
package require xotcl::rdf::tripleRecreator
package require XOTcl
namespace eval ::xotcl::actiweb::httpPlace {
namespace import ::xotcl::*
Singleton Place -superclass Invoker -parameter {
{exportedObjs ""}
{startingObj ""}
{startCommand ""}
{root $::env(HOME)/public_html}
{port 8086}
{redirect [list]}
{logdir $::xotcl::logdir}
{host localhost}
{allowImmigrationHosts ""}
persistenceFile persistenceDir bccFile bccDir dbPackage
{startHTTPServer 1}
}
# Giving a bccFile (and possibly bccDir) as optional parameter means
# that an identical copy database will be created in that
# location (e.g. for creating a backup on a second hard drive.
Place instproc exportObjs args {
foreach obj $args {
my lappend exportedObjs [string trimleft $obj :]
puts stderr "*** exporting $obj, self=[self], objs=[my set exportedObjs]"
}
}
Place instproc isExportedObj obj {
expr {[lsearch [my exportedObjs] [string trimleft $obj :]] != -1}
}
Place instproc default {} {
[self]
}
Place instproc init args {
if {[my set startHTTPServer]} {
Httpd [self]::httpd \
-port [my port] \
-root [my root] \
-redirect [my redirect] \
-logdir [my logdir] \
-httpdWrk Place::HttpdWrk
}
#
# PersistenceMgr object for web entities
#
##### so ist das nicht toll ... init args sollten anders konfigurierbar sein
PersistenceMgr [self]::agentPersistenceMgr -dbPackage multi
if {[my exists dbPackage]} {
set dbp [my set dbPackage]
} else {
set dbp ""
}
if {![my exists persistenceDir]} {
my persistenceDir [string trimleft [self] :]
}
if {![my exists persistenceFile]} {
my persistenceFile persistentObjs-[my port]
}
[self]::agentPersistenceMgr store add $dbp \
-dirName [my persistenceDir] \
-fileName [my persistenceFile]
if {[my exists bccDir] || [my exists bccFile]} {
if {![my exists bccDir]} {
my bccDir [my set persistenceDir]
}
if {![my exists bccFile]} {
my bccFile [my persistenceFile]
}
[self]::agentPersistenceMgr store add $dbp \
-dirName [my bccDir] \
-fileName [my bccFile]
}
AgentMgr create [self]::agentMgr
RDFCreator create [self]::rdfCreator
#
# minimal obj for default behavior of the place -> calls go
# to web entities default (customize through a redirecting proc
# as in HtmlPlace or changing startingObj)
#
WebObject create [self]::start
my startingObj [self]::start
Registry [self]::registry
ErrorMgr [self]::error
ScriptCreator [self]::scriptCreator -dependencyChecking 0
my exportObjs [self]::start [self]::agentMgr [self]::registry
next
}
Place instproc startEventLoop args {
if {[llength $args] > 0} {
set startCommand [lindex $args 0]
::eval $startCommand
}
vwait forever ;# if we are in xotclsh call the event loop...
}
###
### Mixin-Classes for Http/Wrk that restricts the usable HTTP methods
###
Class RestrictHTTPMethods -parameter {
{allowedHTTPMethods "GET PUT HEAD POST CGI"}
}
RestrictHTTPMethods instproc init args {
next
my lappend workerMixins RestrictHTTPMethods::Wrk
}
Class RestrictHTTPMethods::Wrk
RestrictHTTPMethods::Wrk instproc respond {} {
my instvar method
[my info parent] instvar allowedHTTPMethods
if {[lsearch $allowedHTTPMethods $method] != -1} {
return [next]
} else {
my log Error "Restricted Method $method called"
my replyCode 405
my replyErrorMsg
}
}
Class Place::HttpdWrk -superclass Httpd::Wrk
Place::HttpdWrk instproc init args {
my set place [Place getInstance]
next
#puts "New Http-Worker: [self class]->[self] on [my set place]"
}
Place::HttpdWrk instproc parseParams {o m a call} {
upvar [self callinglevel] $o obj $m method $a args
###
set decodedCall [url decodeItem $call]
#my showMsg decodedCall=$decodedCall
if {[regexp {^([^ ]*) ?([^ ]*) ?(.*)$} $decodedCall _ \
obj method args]} {
#foreach a [my set formData] {lappend args [$a set content]}
#puts stderr "Parsed -- Obj: $obj, Method: $method, Args: $args"
return 1
} else {
puts stderr "could not parse <$decodedCall>"
return 0
}
}
Place::HttpdWrk instproc respond-HEAD {} {
my respond-GET; ### sendMsg inhibits content for method HEAD
}
Place::HttpdWrk instproc respond-GET {} {
my instvar fileName resourceName place
if {$resourceName eq ""} {
my sendMsg [$place default] text/html ;# kind of index.html
} elseif {[my parseParams obj method arguments $resourceName]} {
if {![my isobject $obj] && [file readable $fileName]} {
next ;# let Httpd handle this
} else {
set response [$place invokeCall obj status $method $arguments]
#puts stderr "RESPONSE: $response"
#
# let the object's sending strategy mixin choose
# the appropriate sending mode
#
# $obj showClass
if {[info exists status] && $status >= 300} {
my replyCode $status
my replyErrorMsg $response
} else {
#my lappend replyHeaderFields Cache-Control maxage=0
my lappend replyHeaderFields Pragma no-cache
$obj send [self] $response
}
}
} else {
my set version 1.0
my replyCode 400
my replyErrorMsg [my callError "Could not parse: " $resourceName]
}
}
Place::HttpdWrk instproc respond-POST {} {
my instvar resourceName place
my respond-GET
}
Place::HttpdWrk instproc respond-PUT {} {
my instvar resourceName place data
#my showCall
if {$resourceName ne ""} {
if {[my parseParams obj m a $resourceName]} {
set obj [string trimleft $obj :]
set AMgr ${place}::agentMgr
if {[info commands $obj] eq "" &&
![$AMgr info agents $obj]} {
#puts stderr "Receiving to put --------------------------------$obj $data"
set AI [$AMgr parseData $obj $data]
#puts stderr "parray --${AI}::agentData------------------------"
#parray ${AI}::agentData
#puts stderr "parray --${AI}::agentData----------------DONE--------"
#$AI showVars
#puts stderr "----[$AI exists agentData(agent:script)]----"
if {[$AI exists agentData(agent:script)]} {
set immigrateResult [$AMgr immigrate $AI]
#puts stderr "immigrateResult=<$immigrateResult>"
my replyCode 200
my sendMsg $immigrateResult text/plain
} else {
my set version 1.0
my replyCode 400
my replyErrorMsg "Migration failed"
}
} else {
my set version 1.0
my replyCode 400
my replyErrorMsg "Migration: object name already in use."
}
} else {
my set version 1.0
my replyCode 400
my replyErrorMsg "Migration call must provide object name"
}
} else {
# return the own place name -> any client can call the place via
# placename::start !
my sendMsg $place text/plain
}
}
namespace export RestrictHTTPMethods Place
namespace eval RestrictHTTPMethods {
namespace export Wrk
}
namespace eval Place {
namespace export HttpdWrk
}
}
namespace import ::xotcl::actiweb::httpPlace::*
namespace eval RestrictHTTPMethods {
namespace import ::xotcl::actiweb::httpPlace::RestrictHTTPMethods::*
}
namespace eval Place {
namespace import ::xotcl::actiweb::httpPlace::Place::*
}
|