Re: a <sameAs:> DNU from : ZnMessage>>isConnectionClose
Sven Van Caekenberghe <[email protected]>
| Newsgroups | gmane.comp.lang.smalltalk.squeak.seaside |
|---|---|
| Message-ID | <[email protected]> |
My patch prevents the situation that you have a double entry with similar value, because that makes no sense. After that #isConnectionClose (and many other similar tests) will simply work. > On 28 Apr 2018, at 03:59, lb <[email protected]> wrote: > > 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 _______________________________________________ seaside mailing list [email protected] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside