CONTENTS DELETED
The author has deleted this message.
|
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 |
CONTENTS DELETED
The author has deleted this message.
|
CONTENTS DELETED
The author has deleted this message.
|
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 |
CONTENTS DELETED
The author has deleted this message.
|
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 |
Free forum by Nabble | Edit this page |