[squeak-dev] The Trunk: Network-ar.46.mcz

commits at source.squeak.org commits at source.squeak.org
Wed Dec 30 15:24:02 UTC 2009

Andreas Raab uploaded a new version of Network to project The Trunk:

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

Name: Network-ar.46
Author: ar
Time: 30 December 2009, 4:23:24 am
UUID: 62689cdd-d137-f546-acfb-840508ca3502
Ancestors: Network-ar.45

Add an HTTPProgress notification that can be used to display progress during HTTPSocket httpGet: operations.

=============== Diff against Network-ar.45 ===============

Item was changed:
  ----- Method: HTTPSocket class>>httpGetDocument:args:accept:request: (in category 'get the page') -----
  httpGetDocument: url args: args accept: mimeType request: requestString
  	"Return the exact contents of a web object. Asks for the given MIME 
  type. If mimeType is nil, use 'text/html'. An extra requestString may be 
  submitted and must end with crlf.  The parsed header is saved. Use a 
  proxy server if one has been registered.  tk 7/23/97 17:12"
  	"Note: To fetch raw data, you can use the MIME type 
  	| serverName serverAddr port bare page index connectToHost connectToPort aStream portSuffix |
  	Socket initializeNetwork.
  	bare := (url asLowercase beginsWith: 'http://') 
  		ifTrue: [url copyFrom: 8 to: url size]
  		ifFalse: [url].
  	bare := bare copyUpTo: $#.  "remove fragment, if specified"
  	serverName := bare copyUpTo: $/.
  	page := bare copyFrom: serverName size + 1 to: bare size.
  	(serverName includes: $:) 
  		ifTrue: [ index := serverName indexOf: $:.
  			port := (serverName copyFrom: index+1 to: serverName size) asNumber.
  			portSuffix := ':', port printString.
  			serverName := serverName copyFrom: 1 to: index-1. ]
  		ifFalse: [
  			port := self defaultPort.
  			portSuffix := ''. ].
  	page size = 0 ifTrue: [page := '/'].
  	"add arguments"
  	args ifNotNil: [page := page, (self argString: args) ].
  	(self shouldUseProxy: serverName)
  		ifFalse: [ 
  			connectToHost := serverName.
  			connectToPort := port ]
  		ifTrue:  [
  			page := 'http://', serverName, portSuffix, page.		"put back 
  			connectToHost := self httpProxyServer.
  			connectToPort := self httpProxyPort].
+ 	HTTPProgress signal: 'Looking up ', connectToHost.
  	serverAddr := NetNameResolver addressForName: connectToHost timeout: 20.
+ 	serverAddr ifNil: [^ 'Could not resolve the server named: ', connectToHost].
- 	serverAddr ifNil: [
- 		^ 'Could not resolve the server named: ', connectToHost].
  3 timesRepeat: [ | sock length firstData list type header newUrl |
  	sock := HTTPSocket new.
  	sock connectTo: serverAddr port: connectToPort.
  	(sock waitForConnectionUntil: (self deadlineSecs: 30)) ifFalse: [
  		Socket deadServer: connectToHost.  sock destroy.
  		^ 'Server ',connectToHost,' is not responding'].
  	"Transcript cr;show: url; cr.
  	Transcript show: page; cr."
  	sock sendCommand: 'GET ', page, ' HTTP/1.0', CrLf, 
  		(mimeType ifNotNil: ['ACCEPT: ', mimeType, CrLf] ifNil: ['']),
  		'ACCEPT: text/html', CrLf,	"Always accept plain text"
  		HTTPBlabEmail,	"may be empty"
  		requestString,	"extra user request. Authorization"
  		self userAgentString, CrLf,
  		'Host: ', serverName, portSuffix, CrLf.	"blank line 
  automatically added"
  	list := sock getResponseUpTo: CrLf, CrLf ignoring: (String with: CR).	"list = header, CrLf, CrLf, 
  	header := list at: 1.
  	"Transcript show: page; cr; show: header; cr."
  	firstData := list at: 3.
  	header isEmpty 
  		ifTrue: [aStream := 'server aborted early']
  		ifFalse: [
  			"dig out some headers"
  			sock header: header.
  			length := sock getHeader: 'content-length'.
  			length ifNotNil: [ length := length asNumber ].
  			type := sock getHeader: 'content-type'.
  			sock responseCode first = $3 ifTrue: [
  				newUrl := sock getHeader: 'location'.
  				newUrl ifNotNil: [ 
  					Transcript show: 'redirecting to ', newUrl; cr.
  					sock destroy.
  					newUrl := self expandUrl: newUrl ip: serverAddr port: connectToPort.
  					^self httpGetDocument: newUrl args: args  accept: mimeType request: requestString] ].
  			aStream := sock getRestOfBuffer: firstData totalLength: length.
  			"a 400-series error"
  			sock responseCode first = $4 ifTrue: [^ header, aStream contents].
  	sock destroy.	"Always OK to destroy!!"
  	aStream class ~~ String ifTrue: [
   		^ MIMEDocument contentType: type content: aStream contents url: url].
  	aStream = 'server aborted early' ifTrue: [ ^aStream ].
  {'HTTPSocket class>>httpGetDocument:args:accept:request:'. aStream. url} inspect.
  	^'some other bad thing happened!!'!

Item was added:
+ Notification subclass: #HTTPProgress
+ 	instanceVariableNames: 'total amount'
+ 	classVariableNames: ''
+ 	poolDictionaries: ''
+ 	category: 'Network-Protocols'!
+ !HTTPProgress commentStamp: 'ar 12/30/2009 16:16' prior: 0!
+ HTTP progress notification. Includes:
+ - total: The total size of the download (if known)
+ - amount: The completed amount of the download (if known)
+ !

Item was changed:
  ----- Method: HTTPSocket>>getRestOfBuffer:totalLength: (in category 'as yet unclassified') -----
  getRestOfBuffer: beginning totalLength: length
  	"Reel in a string of a fixed length.  Part of it has already been received.  Close the connection after all chars are received.  We do not strip out linefeed chars.  tk 6/16/97 22:32" 
  	"if length is nil, read until connection close.  Response is of type text, not binary."
  	| buf response bytesRead |
  	length ifNil: [^ self getRestOfBuffer: beginning].
  	buf := String new: length.
  	response := RWBinaryOrTextStream on: buf.
  	response nextPutAll: beginning.
  	buf := String new: length.
  	[(response position < length) & (self isConnected | self dataAvailable)] 
  	whileTrue: [
+ 		(HTTPProgress new)
+ 			total: length;
+ 			amount: response position;
+ 			signal: 'Downloading...'.
  		(self waitForDataUntil: (Socket deadlineSecs: 5)) ifFalse: [
  	 		Transcript show: 'data was slow'; cr].
  		bytesRead := self primSocket: socketHandle receiveDataInto: buf startingAt: 1 
  				count: (length - response position). 
  		bytesRead > 0 ifTrue: [  
  			response nextPutAll: (buf copyFrom: 1 to: bytesRead)] ].
  	"Transcript cr; show: 'data byte count: ', response position printString."
  	"Transcript cr; show: ((self isConnected) ifTrue: ['Over length by: ', bytesRead printString] 
  		ifFalse: ['Socket closed'])."
  	response position < length ifTrue: [^ 'server aborted early'].
  	response reset.	"position: 0."
  	^ response!

Item was added:
+ ----- Method: HTTPProgress>>total (in category 'accessing') -----
+ total
+ 	"Answer the total size of the download, if known"
+ 	^total!

Item was added:
+ ----- Method: HTTPProgress>>amount: (in category 'accessing') -----
+ amount: bytes
+ 	"Set the completed amount of the download (if known)"
+ 	amount := bytes!

Item was added:
+ ----- Method: HTTPProgress>>total: (in category 'accessing') -----
+ total: bytes
+ 	"Answer the total size of the download, if known"
+ 	total := bytes!

Item was added:
+ ----- Method: HTTPProgress>>amount (in category 'accessing') -----
+ amount
+ 	"Answer the completed amount of the download (if known)"
+ 	^amount!

More information about the Squeak-dev mailing list