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.

> 
>> 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
>>> 
>>> 
>>> 
>>> 
>>> 
>> 
>> 
> 
> 


Reply via email to