[squeak-dev] The Trunk: Monticello-ul.678.mcz

commits at source.squeak.org commits at source.squeak.org
Thu Mar 22 18:03:42 UTC 2018


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]!



More information about the Squeak-dev mailing list