Re: a <sameAs:> DNU from : ZnMessage>>isConnectionClose
lb <[email protected]>
| Newsgroups | gmane.comp.lang.smalltalk.squeak.seaside |
|---|---|
| Message-ID | <[email protected]> |
Hi, IIUC, the problem is not in ZnMultiValueDictionary>>#at: key add: value "Store value under key. If key already exists, store multiple values as Array" value maybe an array that is Correct. problem is in Here, ZnMessage >> isConnectionClose | value | value := self headers at: 'Connection' ifAbsent: [ ^ false ]. "the value maybe a String or an Array " " if aString that is OKay, if an Array sameAs: DNU!!" ^ value sameAs: 'close' So, ZnMessage >>isConnectionClose | value | value := self headers at: 'Connection' ifAbsent: [ ^ false ]. value isArray ifTrue: [^ value includes: 'close']. value isString ifTrue: [^ value sameAs: 'close']. ^false Same as: isConnectionKeepAlive | value | value := self headers at: 'Connection' ifAbsent: [ ^ false ]. ^ value sameAs: 'keep-alive' Liang At 2018-04-27 20:28:19, "Sven Van Caekenberghe" <[email protected]> wrote: >Hi, > >I would still like to understand how you get in this situation. > >You could try the following modification: > >ZnMultiValueDictionary>>#at: key add: value > "Store value under key. If key already exists, store multiple values as Array" > > | existingValue newValue | > existingValue := self at: key ifAbsent: [ nil ]. > newValue := existingValue isNil > ifTrue: [ value ] > ifFalse: [ > existingValue isArray > ifTrue: [ > (existingValue includes: value) ifTrue: [ ^ value ]. > existingValue copyWith: value ] > ifFalse: [ > existingValue = value ifTrue: [ ^ value ]. > Array with: existingValue with: value ] ]. > ^ self at: key put: newValue > >This changes one method in a data structure underlying ZnHeaders to prevent it from accepting double entries. > >This way, the following expression, > > ZnMultiValueDictionary new at: 'Connection' add: 'close'; at: 'Connection' add: 'close'; yourself. > >will result in just one simple association being stored. > >Please let me know if this helps. > >Sven > >> On 27 Apr 2018, at 14:06, lb <[email protected]> wrote: >> >> Hi Sven >> It came again. >> Array(Object)>>doesNotUnderstand: #sameAs: >> ZnRequest(ZnMessage)>>isConnectionClose >> ZnRequest>>wantsConnectionClose >> ZnResponse>>setConnectionCloseFor: >> ZnManagingMultiThreadedServer(ZnMultiThreadedServer)>>augmentResponse:forRequest: >> ZnManagingMultiThreadedServer(ZnMultiThreadedServer)>>executeOneRequestResponseOn: >> [ [ self executeOneRequestResponseOn: stream ] whileFalse ] in ZnManagingMultiThreadedServer(ZnMultiThreadedServer)>>executeRequestResponseLoopOn: >> [ activeProcess psValueAt: index put: anObject. >> aBlock value ] in ZnCurrentServer(DynamicVariable)>>value:during: >> BlockClosure>>ensure: >> ZnCurrentServer(DynamicVariable)>>value:during: >> ZnCurrentServer class(DynamicVariable class)>>value:during: >> ZnManagingMultiThreadedServer(ZnMultiThreadedServer)>>executeRequestResponseLoopOn: >> [ self executeRequestResponseLoopOn: stream ] in [ [ self executeRequestResponseLoopOn: stream ] >> ensure: [ self logConnectionClosed: stream. >> self closeSocketStream: stream ] ] in [ [ [ self executeRequestResponseLoopOn: stream ] >> ensure: [ self logConnectionClosed: stream. >> self closeSocketStream: stream ] ] >> ifCurtailed: [ socket destroy ] ] in ZnManagingMultiThreadedServer(ZnMultiThreadedServer)>>serveConnectionsOn: >> BlockClosure>>ensure: >> [ [ self executeRequestResponseLoopOn: stream ] >> ensure: [ self logConnectionClosed: stream. >> self closeSocketStream: stream ] ] in [ [ [ self executeRequestResponseLoopOn: stream ] >> ensure: [ self logConnectionClosed: stream. >> self closeSocketStream: stream ] ] >> ifCurtailed: [ socket destroy ] ] in ZnManagingMultiThreadedServer(ZnMultiThreadedServer)>>serveConnectionsOn: >> BlockClosure>>ifCurtailed: >> [ [ [ self executeRequestResponseLoopOn: stream ] >> ensure: [ self logConnectionClosed: stream. >> self closeSocketStream: stream ] ] >> ifCurtailed: [ socket destroy ] ] in ZnManagingMultiThreadedServer(ZnMultiThreadedServer)>>serveConnectionsOn: >> [ self value. >> Processor terminateActive ] in BlockClosure>>newProcess >> >> >> >> At 2018-04-12 21:47:24, "lb" <[email protected]> wrote: >> Hi, Sven, >> Thank you very much, >> But I am not familiar with HTTP. I recover to original code now. >> when that occurs next time, I will copy the error stack here. >> >> >> Best regards >> >> Liang >> >> >> >> At 2018-04-12 20:21:07, "Sven Van Caekenberghe" <[email protected] >> > wrote: >> >Hi Liang, >> > >> >Headers in HTTP (as represented/implemented by the ZnHeaders object in Pharo) can be multi-valued. That is, a certain header name (key) can occur more than once. That creates a multi-valued situation. For example, there can be multiple cookies being set. But almost always, there is only one header with a unique name. >> > >> >What you see must be the result of the 'Connection:close' header line being present twice. I would like to understand how that can happen. Do you have any idea ? >> > >> >I am also not sure (I should check) what the spec says. >> > >> >What is special here is that although the header line occurs twice, it has the same/identical value. >> > >> >In any case, it is the first time I hear about this situation. >> > >> >Sven >> > >> >> On 12 Apr 2018, at 11:30, lb < >> [email protected] >> > wrote: >> >> >> >> Hi, >> >> my website always receives a sameAs: DNU from : >> >> ZnMessage>>isConnectionClose >> >> | value | >> >> value := self headers at: 'Connection' ifAbsent: [ ^ false ]. >> >> ^ value sameAs: 'close' >> >> >> >> value is an Array like #('close' 'close'). >> >> >> >> I fix like this to avoid receiving DNU message. >> >> isConnectionClose >> >> | value | >> >> value := self headers at: 'Connection' ifAbsent: [ ^ false ]. >> >> value isArray ifTrue: [^ (value at: 1) sameAs: 'close']. >> >> value isString ifTrue: [^ value sameAs: 'close']. >> >> ^false >> >> I can not confirm that fix is correct. >> >> Liang >> >> _______________________________________________ >> >> seaside mailing list >> >> >> [email protected] >> >> >> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside >> > >> >_______________________________________________ >> >seaside mailing list >> > >> [email protected] >> >> >http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside >> >> <PharoScreenshot.png>_______________________________________________ >> seaside mailing list >> [email protected] >> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside > >_______________________________________________ >seaside mailing list >[email protected] >http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside _______________________________________________ seaside mailing list [email protected] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside