a <sameAs:> DNU from : ZnMessage>>isConnectionClose

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

a <sameAs:> DNU from : ZnMessage>>isConnectionClose

Bing Liang
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
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: a <sameAs:> DNU from : ZnMessage>>isConnectionClose

Sven Van Caekenberghe-2
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 <[hidden email]> 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
> [hidden email]
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside

_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: a <sameAs:> DNU from : ZnMessage>>isConnectionClose

Bing Liang
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" <[hidden email]> 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 <[hidden email]> 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 >> [hidden email] >> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside > >_______________________________________________ >seaside mailing list >[hidden email] >http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside

_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: a <sameAs:> DNU from : ZnMessage>>isConnectionClose

Bing Liang
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" <[hidden email]> 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" <[hidden email]> 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 <[hidden email]> 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 >> [hidden email] >> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside > >_______________________________________________ >seaside mailing list >[hidden email] >http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside

_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside

PharoScreenshot.png (236K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: a <sameAs:> DNU from : ZnMessage>>isConnectionClose

Sven Van Caekenberghe-2
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 <[hidden email]> 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" <[hidden email]> 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" <[hidden email]
> > 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 <
> [hidden email]
> > 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
> >>
> [hidden email]
>
> >> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
> >
> >_______________________________________________
> >seaside mailing list
> >
> [hidden email]
>
> >http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>
> <PharoScreenshot.png>_______________________________________________
> seaside mailing list
> [hidden email]
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside

_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: a <sameAs:> DNU from : ZnMessage>>isConnectionClose

Bing Liang
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" <[hidden email]> 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 <[hidden email]> 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" <[hidden email]> 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" <[hidden email] >> > 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 < >> [hidden email] >> > 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 >> >> >> [hidden email] >> >> >> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside >> > >> >_______________________________________________ >> >seaside mailing list >> > >> [hidden email] >> >> >http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside >> >> <PharoScreenshot.png>_______________________________________________ >> seaside mailing list >> [hidden email] >> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside > >_______________________________________________ >seaside mailing list >[hidden email] >http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside

_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: a <sameAs:> DNU from : ZnMessage>>isConnectionClose

Sven Van Caekenberghe-2
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 <[hidden email]> 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" <[hidden email]> 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 <[hidden email]> 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" <[hidden email]> 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" <[hidden email]
> >> > 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 <
> >> [hidden email]
> >> > 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
> >> >>
> >> [hidden email]
> >>
> >> >> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
> >> >
> >> >_______________________________________________
> >> >seaside mailing list
> >> >
> >> [hidden email]
> >>
> >> >http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
> >>
> >> <PharoScreenshot.png>_______________________________________________
> >> seaside mailing list
> >> [hidden email]
> >> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
> >
> >_______________________________________________
> >seaside mailing list
> >[hidden email]
> >http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>
> _______________________________________________
> seaside mailing list
> [hidden email]
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside

_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside