The Trunk: Monticello-ul.678.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: Monticello-ul.678.mcz

commits-2
Levente Uzonyi uploaded a new version of Monticello to project The Trunk:
http://source.squeak.org/trunk/Monticello-ul.678.mcz

==================== Summary ====================

Name: Monticello-ul.678
Author: ul
Time: 19 March 2018, 1:03:18.137853 am
UUID: 4d47635e-aa48-43cc-99bb-b8d2f1a5a51f
Ancestors: Monticello-cmm.677

Store and reuse a shared WebClient instance for each MCHttpRepository. This makes it possible to speed up downloads by reusing TCP connections.
Disabled by default. Enable it by evaluating [MCHttpRepository useSharedWebClientInstance: true]

=============== Diff against Monticello-cmm.677 ===============

Item was changed:
  MCFileBasedRepository subclass: #MCHttpRepository
+ instanceVariableNames: 'location user password readerCache indexed webClient'
+ classVariableNames: 'UseSharedWebClientInstance'
- instanceVariableNames: 'location user password readerCache indexed'
- classVariableNames: ''
  poolDictionaries: ''
  category: 'Monticello-Repositories'!

Item was added:
+ ----- Method: MCHttpRepository class>>useSharedWebClientInstance (in category 'preferences') -----
+ useSharedWebClientInstance
+
+ <preference: 'Use shared WebClient instance'
+ category: 'Monticello'
+ description: 'When true, use a shared WebClient instance to speed up downloads from MCHttpRepositories. Requires WebClient to be present.'
+ type: #Boolean>
+ ^UseSharedWebClientInstance ifNil: [ false ]!

Item was added:
+ ----- Method: MCHttpRepository class>>useSharedWebClientInstance: (in category 'preferences') -----
+ useSharedWebClientInstance: aBoolean
+
+ UseSharedWebClientInstance := aBoolean!

Item was changed:
  ----- Method: MCHttpRepository>>allFileNames (in category 'overriding') -----
  allFileNames
+
  | index |
+ index := self displayProgress: 'Updating ', self description during: [
+ self httpGet: self locationWithTrailingSlash, '?C=M;O=D' arguments: nil ].
+ ^index ifNotNil: [ self parseFileNamesFromStream: index ]!
- self displayProgress: 'Updating ', self description during:[
- index := HTTPSocket httpGet: self locationWithTrailingSlash, '?C=M;O=D' args: nil user: self user passwd: self password.
- ].
- index isString ifTrue: [NetworkError signal: 'Could not access ', location].
- ^ self parseFileNamesFromStream: index !

Item was added:
+ ----- Method: MCHttpRepository>>httpGet:arguments: (in category 'private') -----
+ httpGet: url arguments: arguments
+
+ | progress urlString client  response result |
+ self class useSharedWebClientInstance ifFalse: [
+ ^HTTPSocket httpGet: url args: arguments user: self user passwd: self password ].
+ progress := [ :total :amount |
+ HTTPProgress new
+ total: total;
+ amount: amount;
+ signal: 'Downloading...' ].
+ urlString := arguments
+ ifNil: [ url ]
+ ifNotNil: [
+ | queryString |
+ queryString := (Smalltalk classNamed: #WebUtils) encodeUrlEncodedForm: arguments.
+ (url includes: $?)
+ ifTrue: [ url, '&', queryString ]
+ ifFalse: [ url, '?', queryString ] ].
+ "Acquire webClient by atomically storing it in the client variable and setting its value to nil."
+ client := webClient.
+ webClient := nil.
+ client ifNil: [ client := (Smalltalk classNamed: #WebClient) new ].
+ response := client
+ username: self user;
+ password: self password;
+ httpGet: urlString do: [ :request |
+ request
+ headerAt: 'Authorization' put: 'Basic ', (self user, ':', self password) base64Encoded;
+ headerAt: 'Connection' put: 'Keep-Alive';
+ headerAt: 'Accept' put: '*/*' ].
+ result := (response code between: 200 and: 299)
+ ifFalse: [
+ response content. "Make sure content is read."
+ nil ]
+ ifTrue: [ (RWBinaryOrTextStream with: (response contentWithProgress: progress)) reset ].
+ "Save the WebClient instance for reuse, but only if there is no client cached."
+ webClient  
+ ifNil: [ webClient := client ]
+ ifNotNil: [ client close ].
+ ^result ifNil: [
+ NetworkError signal: 'Could not access ', location.
+ nil ]!

Item was changed:
  ----- Method: MCHttpRepository>>readStreamForFileNamed:do: (in category 'private') -----
  readStreamForFileNamed: aString do: aBlock
+
  | contents |
+ contents := self displayProgress: 'Downloading ', aString during: [
+ self httpGet: (self urlForFileNamed: aString) arguments: nil ].
+ ^contents ifNotNil: [ aBlock value: contents ]!
- self displayProgress: 'Downloading ', aString during:[
- contents := HTTPSocket httpGet: (self urlForFileNamed: aString) args: nil user: self user passwd: self password.
- ].
- ^ contents isString ifFalse: [aBlock value: contents]!