[Seaside] a <sameAs:> DNU from : ZnMessage>>isConnectionClose
Sven Van Caekenberghe
sven at stfx.eu
Sat Apr 28 07:11:27 UTC 2018
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 <liangbing64 at 126.com> 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" <sven at stfx.eu> 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 <liangbing64 at 126.com> 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" <liangbing64 at 126.com> 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" <sven at stfx.eu
> >> > 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 <
> >> liangbing64 at 126.com
> >> > 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
> >> >>
> >> seaside at lists.squeakfoundation.org
> >>
> >> >> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
> >> >
> >> >_______________________________________________
> >> >seaside mailing list
> >> >
> >> seaside at lists.squeakfoundation.org
> >>
> >> >http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
> >>
> >> <PharoScreenshot.png>_______________________________________________
> >> seaside mailing list
> >> seaside at lists.squeakfoundation.org
> >> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
> >
> >_______________________________________________
> >seaside mailing list
> >seaside at lists.squeakfoundation.org
> >http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>
> _______________________________________________
> seaside mailing list
> seaside at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
More information about the seaside
mailing list