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