[squeak-dev] HTTP Encoding and decoding

Jens Lincke jens.lincke at hpi.uni-potsdam.de
Mon May 12 16:14:32 UTC 2008


Hi,

I tried some examples to narrow it:

'ö' encodeForHTTP  = '%C3%B6'
'%C3%B6'unescapePercents  = 'ö'

':'  encodeForHTTP  = '%3A'
'%3A' unescapePercents =  ':'

'ö:' encodeForHTTP =  '%C3%B6%3A%B6'
'%C3%B6%3A%B6' unescapePercents => 'ö:¶'
'%C3%B6%3A' unescapePercents  => 'ö:'

the problem  happens in encodeForHTTPWithTextEncoding: encodingName 
conditionBlock: conditionBlock

where it is assumed that "encodedStream text; reset." clears the contents.

I don't know what is the correct behavior of 
MultiByteBinaryOrTextStream, but

encodedStream _ MultiByteBinaryOrTextStream on: (String new: 6).

solves the problem, for once... but it ist not fast.

with the attached fix, "('mö:' encodeForHTTP unescapePercents) = 'mö:' " 
evals to true

- Jens -

Robert Krahn schrieb:
> Hi,
>
> the following expressions returns false in 3.9.1:
>
> ('mö:' encodeForHTTP unescapePercents) = 'mö:'
>
> although #unescapePercents should be the opposite from #encodeForHTTP 
> (as stated in the method comment).
>
> I assume this is a bug?
>
> Best,
> Robert

-------------- next part --------------
'From Squeak3.9 of 7 November 2006 [latest update: #7067] on 12 May 2008 at 6:12:19 pm'!

!String methodsFor: 'converting' stamp: 'jl 5/12/2008 18:06'!
encodeForHTTPWithTextEncoding: encodingName conditionBlock: conditionBlock
	"change dangerous characters to their %XX form, for use in HTTP transactions"

	| httpSafeStream encodedStream cont |
	httpSafeStream _ WriteStream on: (String new).
	encodedStream _ MultiByteBinaryOrTextStream on: (String new: 6).
	encodedStream converter: (TextConverter newForEncoding: encodingName).
	self do: [:c |
		(conditionBlock value: c)
			ifTrue: [httpSafeStream nextPut: (Character value: c charCode)]
			ifFalse: [
				encodedStream _ MultiByteBinaryOrTextStream on: (String new: 6).
				encodedStream text; reset.
				encodedStream nextPut: c.
				encodedStream position: 0.
				encodedStream binary.
				cont _ encodedStream contents.
				cont do: [:byte |
					httpSafeStream nextPut: $%.
					httpSafeStream nextPut: (byte // 16) asHexDigit.
					httpSafeStream nextPut: (byte \\ 16) asHexDigit.
				].
			].
	].
	^ httpSafeStream contents.
! !



More information about the Squeak-dev mailing list