Swazoo.SwazooSite subclass: ILSite [ | codec | ILSite class >> default [ self ensureRegistered. ^self named: self defaultName ] ILSite class >> defaultHost [ ^'*' ] ILSite class >> defaultIp [ ^'*' ] ILSite class >> defaultName [ ^'IliadSite' ] ILSite class >> defaultPort [ ^8080 ] ILSite class >> ensureRegistered [ (self named: self defaultName) ifNil: [self newDefaultOn: self defaultPort] ] ILSite class >> new [ ^self basicNew ] ILSite class >> newDefaultOn: aPort [ ^(self newNamed: self defaultName) host: self defaultHost ip: self defaultIp port: aPort ] codec [ ^codec ifNil: [codec := self defaultCodec] ] codec: aCodec [ codec := aCodec ] defaultCodec [ ^Grease.GRNullCodec new ] answerTo: aRequest [ [ILDispatcher current dispatch: (self convertRequest: aRequest)] on: ILResponseNotification do: [:n | ^self convertResponse: n response] ] internalErrorResponseFor: anError [ ^Swazoo.HTTPResponse internalServerError entity: '

Internal error

' yourself ] convertHeader: aSwazooRequest [ | swazooFields fields | swazooFields := aSwazooRequest headers fields. fields := Dictionary new: swazooFields size. swazooFields keysAndValuesDo: [:key :field || value | value := String streamContents: [:stream | field valuesAsStringOn: stream]. fields at: key asLowercase put: value]. ^fields ] convertPostDataFrom: aValue [ (aValue filename isNil or: [aValue filename isEmpty]) ifTrue: [^self decode: aValue value] ifFalse: [ ^ILFileProxy new filename: aValue filename; contentType: aValue contentType; contents: aValue value; yourself] ] convertRequest: aSwazooRequest [ ^ILRequest new method: aSwazooRequest methodName; url: (ILUrl absolute: aSwazooRequest uriString); headers: (self convertHeader: aSwazooRequest); fields: (self parseFields: aSwazooRequest); cookies: (self parseCookies: aSwazooRequest); nativeRequest: aSwazooRequest; yourself ] convertResponse: aResponse [ | swazooResponse | swazooResponse := Swazoo.HTTPResponse new. aResponse headers do: [:each | | field fieldClass | fieldClass := Swazoo.HeaderField classForFieldName: each key. field := fieldClass newForFieldName: each key withValueFrom: each value. swazooResponse headers addField: field]. aResponse cookies do: [:each | swazooResponse cookie: (self cookieHeaderFor: each)]. swazooResponse code: aResponse status. swazooResponse entity: ((self isBinaryResponse: aResponse) ifTrue: [aResponse contents] ifFalse: [self encode: aResponse contents]). swazooResponse contentType: aResponse contentType greaseString. aResponse release. ^swazooResponse ] cookieHeaderFor: aCookie [ ^String streamContents: [:stream | stream nextPutAll: aCookie key; nextPutAll: '='; nextPutAll: (aCookie value ifNil: ['']). aCookie path isNil ifFalse: [ stream nextPutAll: '; path='; nextPutAll: aCookie path]. aCookie expiry isNil ifFalse: [ stream nextPutAll: '; expires='; nextPutAll: aCookie expiryString]] ] decode: aString [ ^self codec decode: aString ] encode: aString [ ^self codec encode: aString ] isBinaryResponse: aResponse [ | tokens type subTypes | tokens := aResponse contentType tokenize: '/'. type := tokens first. type = 'text' ifTrue: [^false]. tokens size = 1 ifTrue: [^true]. subTypes := tokens second tokenize: '\+'. ^subTypes noneSatisfy: [:each | #('x-javascript' 'xml' 'json') includes: each] ] parseCookies: aSwazooRequest [ | cookies swazooCookies cookieLine | cookies := Dictionary new. cookieLine := aSwazooRequest cookie. (cookieLine isNil or: [cookieLine isEmpty]) ifTrue: [^cookies]. swazooCookies := cookieLine tokenize: ';'. swazooCookies do: [:each || pair key value | pair := each tokenize: '='. key := SpStringUtilities trimBlanksFrom: pair first. value := pair size > 1 ifTrue: [SpStringUtilities trimBlanksFrom: pair second] ifFalse: [nil]. cookies at: key put: value]. ^cookies ] parseFields: aSwazooRequest [ | fields | fields := Dictionary new. aSwazooRequest isPost ifTrue: ["break encapsulation" aSwazooRequest ensureFullRead. aSwazooRequest postData keysAndValuesDo: [:key :value | | previousData data | data := self convertPostDataFrom: value. previousData := fields at: key ifAbsent: [nil]. previousData isNil ifTrue: [fields at: key put: data] ifFalse: [ (previousData isKindOf: OrderedCollection) ifTrue: [previousData add: data] ifFalse: [fields at: key put: (OrderedCollection with: previousData with: data)]]]] ifFalse: [aSwazooRequest queries do: [:each | fields at: each key put: each value]]. ^fields ] helpResolve: aResolution [ (self canAnswer and: [aResolution siteMatch: self]) ifFalse: [^nil]. ^self answerTo: aResolution request ] ]