Where does BrotliReadStream come from?
Also, #hasBindingOf: seems dangerous to use as it uses declarations instead of bindings or both to look up the binding, while other binding-related methods use bindings (e.g. #bindingOf:ifAbsent:, #hasBindingThatBeginsWith:, #hideBinding:, #associationOrUndeclaredAt:). It will probably work as long as there's only a single environment.
Levente
On Thu, 6 Jul 2017, commits@source.squeak.org wrote:
Tobias Pape uploaded a new version of WebClient-Core to project The Trunk: http://source.squeak.org/trunk/WebClient-Core-topa.109.mcz
==================== Summary ====================
Name: WebClient-Core-topa.109 Author: topa Time: 6 July 2017, 3:27:22.152308 pm UUID: b795898b-9723-44ab-a429-bceb056f4b90 Ancestors: WebClient-Core-topa.108
As with content-type-charset, cope for content-encoding variability
=============== Diff against WebClient-Core-topa.108 ===============
Item was added:
- ----- Method: WebClient>>contentDecoders (in category 'initialize') -----
- contentDecoders
- | result |
- result := nil.
- (self class environment hasBindingOf: #GZipReadStream)
ifTrue: [result := 'gzip'].
- (self class environment hasBindingOf: #BrotliReadStream)
ifTrue: [ result := result ifNil: ['br'] ifNotNil: [:r | r, ', br']].
- ^ result!
Item was changed: ----- Method: WebClient>>httpGet:do: (in category 'methods') ----- httpGet: urlString do: aBlock "GET the response from the given url" "(WebClient httpGet: 'http://www.squeak.org') content"
| request | self initializeFromUrl: urlString. request := self requestWithUrl: urlString. request method: 'GET'.
- userAgent ifNotNil:[:ua | request headerAt: 'User-Agent' put: ua].
- self contentDecoders ifNotNil: [:decoders | request headerAt: 'Accept-Encoding' put: decoders].
- userAgent ifNotNil:[request headerAt: 'User-Agent' put: userAgent].
- request headerAt: 'Accept-Encoding' put: 'gzip'. aBlock value: request. ^self sendRequest: request
!
Item was added:
- ----- Method: WebMessage>>decoderForContentEncoding (in category 'private') -----
- decoderForContentEncoding
- (self headerAt: 'content-encoding') = 'gzip'
ifTrue: [^ self class environment
at: #GZipReadStream ifAbsent: [self error: 'GZip encoded responses not supported']].
- (self headerAt: 'content-encoding') = 'br'
ifTrue: [^ self class environment
at: #BrotliReadStream ifAbsent: [self error: 'Brotli encoded responses not supported']].
- ^ nil!
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 headerAt: 'content-encoding') = 'gzip' ifTrue: [
self textConverterForContentType ifNotNil: [:converter | result := result convertFromWithConverter: converter]. ^ resultresult := (GZipReadStream on: result) upToEnd].
!