On 27.10.2017, at 18:40, monty monty2@programmer.net wrote:
This series of content decoding changes is not backwards compatible. Existing code that does its own response decoding with the assumption that WebClient won't do it will now double-decode the response--corrupting it. But breaking existing code is probably worth it here because of the gains in intuitiveness and correctness.
Is there any way to disable the automatic response decoding?
That's problematic. Some conversation was always done, you never ended up with mere Strings/ByteArrays.
This is the old version, that opportunistically applied inflate/deflate: ================ getContentWithProgress: progressBlockOrNil "Reads available content and returns it."
| length result | length := self contentLength. result := (stream isBinary ifTrue:[ ByteArray ] ifFalse: [ ByteString ]) new: (length ifNil: [ 1000 ]) streamContents: [ :outputStream | self streamFrom: stream to: outputStream size: length progress: progressBlockOrNil ]. (self headerAt: 'content-encoding') = 'gzip' ifFalse: [ ^result ]. ^(GZipReadStream on: result) upToEnd =================
Maybe we need a plain "get me the bytes" variant. Oh there is:
WebMessage>>streamFrom:to:size:progress:
That's somewhat inelegant but should work…
Best regards -Tobias
Sent: Wednesday, September 20, 2017 at 11:29 AM From: commits@source.squeak.org To: squeak-dev@lists.squeakfoundation.org, packages@lists.squeakfoundation.org Subject: [squeak-dev] The Trunk: WebClient-Core-topa.112.mcz
Tobias Pape uploaded a new version of WebClient-Core to project The Trunk: http://source.squeak.org/trunk/WebClient-Core-topa.112.mcz
==================== Summary ====================
Name: WebClient-Core-topa.112 Author: topa Time: 20 September 2017, 5:29:06.096983 pm UUID: 60b494fc-0652-4a28-be5a-1578963e5aed Ancestors: WebClient-Core-topa.111
Abide Postel's law for text conversion.
Be conservative in what you do, be liberal in what you accept from others.
=============== Diff against WebClient-Core-topa.111 ===============
Item was changed: ----- Method: WebMessage>>getContentWithProgress: (in category 'private') ----- getContentWithProgress: progressBlockOrNil "Reads available content and returns it."
| length result | length := self contentLength. result := (stream isBinary ifTrue:[ ByteArray ] ifFalse: [ ByteString ]) new: (length ifNil: [ 1000 ]) streamContents: [ :outputStream | self streamFrom: stream to: outputStream size: length progress: progressBlockOrNil ]. self decoderForContentEncoding ifNotNil: [:decoder | result := (decoder on: result) upToEnd]. self textConverterForContentType ifNotNil: [:converter |
[result := result convertFromWithConverter: converter]
on: InvalidUTF8 "some servers lie"
do: [^ result]].
^ resultresult := result convertFromWithConverter: converter].
!
Item was changed: ----- Method: WebMessage>>textConverterForContentType (in category 'accessing') ----- textConverterForContentType
| index contentType | contentType := self contentType. contentType size < 8 ifTrue: [ ^nil ].
- (contentType beginsWithAnyOf: #('application/' 'image/' 'video/' 'audio/')) ifTrue: [^nil]. index := contentType findString: 'charset=' startingAt: 1 caseSensitive: false. index = 0 ifTrue: [ ^nil ]. ^TextConverter newForEncoding: (contentType allButFirst: index + 7) "'charset=' size - 1"!