On 04 Jun 2013, at 11:20, Andy Kellens <[email protected]> wrote:
>
> On 04 Jun 2013, at 11:13, Sven Van Caekenberghe <[email protected]> wrote:
>
>>
>> On 04 Jun 2013, at 11:04, Andy Kellens <[email protected]> wrote:
>>
>>> Hi Sven,
>>>
>>> Thanks for the quick response!
>>>
>>> A slightly altered version of your patch (it is #matches: instead of
>>> #match:) results in that the code goes into the right branch.
>>>
>>> ZnZincServerAdaptor>>requestFieldsFor: aZincRequest
>>> | fields |
>>> fields := WARequestFields new.
>>> (aZincRequest method = #POST and: [ aZincRequest hasEntity ])
>>> ifTrue: [
>>> (aZincRequest entity contentType matches: ZnMimeType
>>> applicationFormUrlEncoded)
>>> ifTrue: [
>>> fields addAll: aZincRequest entity
>>> fields ].
>>> (aZincRequest entity contentType matches: ZnMimeType
>>> multiPartFormData)
>>> ifTrue: [
>>> fields addAll: (self convertMultipart:
>>> aZincRequest entity) ] ].
>>> ^ fields
>>
>> Yes, sorry for the typo.
>>
>>> Now, to fix my problem I still had to patch two other methods to also use
>>> #matches: instead of #=
>>> ZnEntity>>contentType: object
>>> "We only allow assignment compatible with our designated mime type"
>>>
>>> | newType |
>>> newType := object asZnMimeType.
>>> (contentType notNil and:[contentType matches: newType])
>>> ifTrue: [ ^ self ]
>>> ifFalse: [
>>> (self class designatedMimeType isNil or: [ self class
>>> designatedMimeType matches: newType ])
>>> ifTrue: [ contentType := newType ] ]
>>
>> That makes sense, but I would say that the first condition should still use
>> #= otherwise it would no longer be possible to change the mime type from
>> text/plain to text/plain;charset=ascii for example (they types then match
>> and nothing will be done). If you make that change, does it still work for
>> you ?
>
> If I change it back to #=, the entity of the request is no longer a
> ZnApplicationFormUrlEncodedEntity but a ZnByteArrayEntity.
> When retrieving the fields, I get a #DNU that ZnByteArrayEntity does not
> understand #fields.
I will go into a Seaside image myself later on, but I think I didn't make
myself clear enough with my last remark. I meant to change your code:
ZnEntity>>contentType: object
"We only allow assignment compatible with our designated mime type"
| newType |
newType := object asZnMimeType.
(contentType notNil and: [ contentType matches: newType ])
ifTrue: [ ^ self ]
ifFalse: [
(self class designatedMimeType isNil or: [ self class
designatedMimeType matches: newType ])
ifTrue: [ contentType := newType ] ]
to
ZnEntity>>contentType: object
"We only allow assignment compatible with our designated mime type"
| newType |
newType := object asZnMimeType.
(contentType notNil and: [ contentType = newType ])
ifTrue: [ ^ self ]
ifFalse: [
(self class designatedMimeType isNil or: [ self class
designatedMimeType matches: newType ])
ifTrue: [ contentType := newType ] ]
>>
>>> and:
>>> ZnEntity class>>concreteSubclassForType: mimeType binary: forceBinary
>>> "Answer the concrete ZnEntity subclass that handles mimeType"
>>>
>>> ^ self allSubclasses
>>> detect: [ :each |
>>> each designatedMimeType matches: mimeType ]
>>> ifNone: [
>>> (mimeType isBinary or: [ forceBinary ])
>>> ifTrue: [ self byteArrayEntityClass ]
>>> ifFalse: [ self stringEntityClass ] ]
>>
>> That one makes sense indeed.
>>
>>> With these changes, everything works like a charm again.
>>>
>>> Kind regards,
>>>
>>> Andy
>>>
>>>
>>> On 04 Jun 2013, at 10:44, Sven Van Caekenberghe <[email protected]> wrote:
>>>
>>>> Hi Andy,
>>>>
>>>> Yes, I forgot about ZnZincServerAdaptor when refactoring/changing
>>>> ZnMimeType>>#= - sorry about that. The solution is actually quite easy:
>>>> ZnMimeType>>#match: does a comparison while ignoring additional mime type
>>>> parameters like charset, in addition to its wild card matching.
>>>>
>>>> So the patch then would be:
>>>>
>>>> ZnZincServerAdaptor>>requestFieldsFor: aZincRequest
>>>> | fields |
>>>> fields := WARequestFields new.
>>>> (aZincRequest method = #POST and: [ aZincRequest hasEntity ])
>>>> ifTrue: [
>>>> (aZincRequest entity contentType match: ZnMimeType
>>>> applicationFormUrlEncoded)
>>>> ifTrue: [
>>>> fields addAll: aZincRequest entity
>>>> fields ].
>>>> (aZincRequest entity contentType match: ZnMimeType
>>>> multiPartFormData)
>>>> ifTrue: [
>>>> fields addAll: (self convertMultipart:
>>>> aZincRequest entity) ] ].
>>>> ^ fields
>>>>
>>>> If you confirm that this works, I will check in the change later today.
>>>>
>>>> Thanks again for the cristal clear bug report !
>>>>
>>>> Regards,
>>>>
>>>> Sven
>>>>
>>>> On 04 Jun 2013, at 10:34, Andy Kellens <[email protected]> wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> Yesterday, I stumbled across a bug when using the Zinc Seaside adaptor
>>>>> that resulted in that the post fields of a request were not present in
>>>>> the WARequest.
>>>>> I found out that the problem occurred when converting a Zinc request into
>>>>> a WARequest.
>>>>>
>>>>> More particular:
>>>>> ZnZincServerAdaptor>>requestFieldsFor: aZincRequest
>>>>> | fields |
>>>>> fields := WARequestFields new.
>>>>> (aZincRequest method = #POST and: [ aZincRequest hasEntity ])
>>>>> ifTrue: [
>>>>> aZincRequest entity contentType = ZnMimeType
>>>>> applicationFormUrlEncoded
>>>>> ifTrue: [
>>>>> fields addAll: aZincRequest entity
>>>>> fields ].
>>>>> aZincRequest entity contentType = ZnMimeType
>>>>> multiPartFormData
>>>>> ifTrue: [
>>>>> fields addAll: (self convertMultipart:
>>>>> aZincRequest entity) ] ].
>>>>> ^ fields
>>>>>
>>>>>
>>>>> This method checks if the Mime Type is either applicationFormUrlEncoded
>>>>> or multiPartFormData in order to extract the post fields.
>>>>>
>>>>> Recently, ZnMimeType>>= got changed
>>>>> from:
>>>>> ZnMimeType>>= other
>>>>> ^ (self class == other class)
>>>>> and: [ self main = other main
>>>>> and: [ self sub = other sub ] ]
>>>>>
>>>>> to:
>>>>> ZnMimeType>>= other
>>>>> ^ (self class == other class)
>>>>> and: [ self main = other main
>>>>> and: [ self sub = other sub
>>>>> and: [ self hasParameters not & other
>>>>> hasParameters not
>>>>> or: [ self parameters =
>>>>> other parameters ] ] ] ]
>>>>>
>>>>> As my request had an additional parameter charset=utf-8, the equality
>>>>> with ZnMimeType applicationFormUrlEncoded failed and hence the fields
>>>>> were not extract.
>>>>>
>>>>> While I assume that the comparison of the Mime type parameters in #= is
>>>>> there for a good reason, and the best way to fix this problem is to
>>>>> change the #requestFieldsFor: method in order to match the Mime type
>>>>> differently, I wanted to briefly check with the mailing list before
>>>>> opening an issue + submitting a patch.
>>>>>
>>>>> Kind regards,
>>>>>
>>>>> Andy
>>>>
>>>>
>>>>
>>>> --
>>>> Sven Van Caekenberghe
>>>> Proudly supporting Pharo
>>>> http://pharo.org
>>>> http://association.pharo.org
>>>> http://consortium.pharo.org
>>>>
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>
>>
>
>