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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.