[Seaside] Nested form tags

Michel Bany m.bany at wanadoo.fr
Thu Nov 3 22:56:04 CET 2005


I believe I found the bug that causes the weird effects that have been 
observed when nesting forms.

When there are nested <form> in the html and when a submit button is 
pressed, the resulting http
request contains the "_s" and the "_k" hidden fields many times (once 
for each form).
As a result the http fields in the request are holding collection of 
strings rather than just strings
(the field dictionary object is too smart !) In such situations, Seaside 
is not able to retrieve the
session and shows the expiration screen.

I found that the consequences of the bug can be in corrected 
WAKom>>convertRequest:
where the request fields can be computed differently. The implementation 
in the attachment
eliminates the false expiration.

This does not occur in VisualWorks where the computation of the request 
fields are always
and consistently available as collections or strings.

The attached change set  includes both the fix and a test component with 
nested <form>

Enjoy,
Michel.



-------------- next part --------------
'From Squeak3.7 of ''4 September 2004'' [latest update: #5989] on 3 November 2005 at 10:28:53 pm'!
WAComponent subclass: #WANestedForms
	instanceVariableNames: ''
	classVariableNames: ''
	poolDictionaries: ''
	category: 'Seaside-Examples-Test'!

!WAKom methodsFor: 'as yet unclassified' stamp: 'mb 11/3/2005 22:28'!
convertRequest: aKomRequest 
	| request fields waFields |
	self processMultipartFields: aKomRequest.
	fields := aKomRequest method = 'POST'
				ifTrue: [aKomRequest postFields]
				ifFalse: [aKomRequest getFields].
	waFields := Dictionary new.				
	fields
		keysAndValuesDo: [:k :v | v isString
				ifFalse: [waFields at: k put: v first]
				ifTrue: [waFields at: k put: v]].
	request := WARequest
				method: aKomRequest method
				url: aKomRequest url unescapePercents
				headers: aKomRequest header
				fields: waFields
				cookies: aKomRequest cookies
				nativeRequest: aKomRequest.
	aKomRequest method = 'PUT'
		ifTrue: [request fields
				at: 'PUTData'
				put: (aKomRequest stream next: aKomRequest contentLength)].
	^ request! !


!WANestedForms methodsFor: 'rendering' stamp: 'mb 11/3/2005 22:17'!
renderContentOn: html
	html heading: 'Buttons in nested forms'.
	html text: 'Click the buttons and get an expired session !!'. 
	html
		form: [html
				submitButtonWithAction: [self inform: 'Button1']
				text: 'Button1'.
			html
				form: [html
						submitButtonWithAction: [self inform: 'Button2']
						text: 'Button2']]! !


!WANestedForms class methodsFor: 'initialize-release' stamp: 'mb 11/3/2005 22:13'!
initialize
	self registerAsApplication: 'NestedForms'! !

WANestedForms initialize!

!WANestedForms class reorganize!
('initialize-release' initialize)
!


!WANestedForms reorganize!
('rendering' renderContentOn:)
!



More information about the Seaside mailing list