[squeak-dev] The Trunk: Network-ar.47.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed Dec 30 15:46:48 UTC 2009
Andreas Raab uploaded a new version of Network to project The Trunk:
http://source.squeak.org/trunk/Network-ar.47.mcz
==================== Summary ====================
Name: Network-ar.47
Author: ar
Time: 30 December 2009, 4:40:24 am
UUID: 429af7d7-a121-3342-a5c5-2f6c27f10bbe
Ancestors: Network-ar.46
Add HTTPProgress for put operations (uploads).
=============== Diff against Network-ar.46 ===============
Item was added:
+ ----- Method: HTTPSocket>>sendCommandWithProgress: (in category 'as yet unclassified') -----
+ sendCommandWithProgress: commandString
+ "Send the given command as a single line followed by a <CR><LF> terminator."
+
+ self sendDataWithProgress: commandString, CrLf.
+ !
Item was changed:
----- Method: HTTPSocket class>>httpPut:to:user:passwd: (in category 'get the page') -----
httpPut: contents to: url user: user passwd: passwd
"Upload the contents of the stream to a file on the server"
| bare serverName specifiedServer port page serverAddr authorization s list header firstData length aStream command digest |
Socket initializeNetwork.
"parse url"
bare := (url asLowercase beginsWith: 'http://')
ifTrue: [url copyFrom: 8 to: url size]
ifFalse: [url].
serverName := bare copyUpTo: $/.
specifiedServer := serverName.
(serverName includes: $:) ifFalse: [ port := self defaultPort ] ifTrue: [
port := (serverName copyFrom: (serverName indexOf: $:) + 1
to: serverName size) asNumber.
serverName := serverName copyUpTo: $:.
].
page := bare copyFrom: (bare indexOf: $/) to: bare size.
page size = 0 ifTrue: [page := '/'].
(self shouldUseProxy: serverName) ifTrue: [
page := 'http://', serverName, ':', port printString, page. "put back together"
serverName := self httpProxyServer.
port := self httpProxyPort].
"make the request"
serverAddr := NetNameResolver addressForName: serverName timeout: 20.
serverAddr ifNil: [
^ 'Could not resolve the server named: ', serverName].
authorization := ' Basic ', (user , ':' , passwd) base64Encoded.
[
s := HTTPSocket new.
s connectTo: serverAddr port: port.
s waitForConnectionUntil: self standardDeadline.
Transcript cr; show: url; cr.
command :=
'PUT ', page, ' HTTP/1.0', CrLf,
self userAgentString, CrLf,
'Host: ', specifiedServer, CrLf,
'ACCEPT: */*', CrLf,
HTTPProxyCredentials,
'Authorization: ' , authorization , CrLf ,
'Content-length: ', contents size printString, CrLf , CrLf ,
contents.
+ s sendCommandWithProgress: command.
- s sendCommand: command.
"get the header of the reply"
list := s getResponseUpTo: CrLf, CrLf ignoring: String cr. "list = header, CrLf, CrLf, beginningOfData"
header := list at: 1.
"Transcript show: page; cr; show: argsStream contents; cr; show: header; cr."
firstData := list at: 3.
"dig out some headers"
s header: header.
(authorization beginsWith: 'Digest ') not
and: [(digest := self digestFrom: s method: 'PUT' url: url user: user password: passwd) notNil]]
whileTrue: [authorization := 'Digest ', digest].
length := s getHeader: 'content-length'.
length ifNotNil: [ length := length asNumber ].
+ "Suppress progress during response handling"
+ [aStream := s getRestOfBuffer: firstData totalLength: length]
+ on: HTTPProgress do:[:ex| ex resume].
- aStream := s getRestOfBuffer: firstData totalLength: length.
s destroy. "Always OK to destroy!!"
^ header, aStream contents!
Item was added:
+ ----- Method: HTTPSocket>>sendDataWithProgress: (in category 'as yet unclassified') -----
+ sendDataWithProgress: aStringOrByteArray
+ "Send all of the data in the given array, even if it requires multiple calls to send it all. Return the number of bytes sent."
+
+ "An experimental version use on slow lines: Longer timeout and smaller writes to try to avoid spurious timeouts."
+
+ | bytesSent bytesToSend count |
+ bytesToSend := aStringOrByteArray size.
+ bytesSent := 0.
+ [bytesSent < bytesToSend] whileTrue: [
+ (HTTPProgress new)
+ total: bytesToSend;
+ amount: bytesSent;
+ signal: 'Uploading...'.
+ (self waitForSendDoneUntil: (Socket deadlineSecs: 60))
+ ifFalse: [ConnectionTimedOut signal: 'send data timeout; data not sent'].
+ count := self primSocket: socketHandle
+ sendData: aStringOrByteArray
+ startIndex: bytesSent + 1
+ count: (bytesToSend - bytesSent min: 5000).
+ bytesSent := bytesSent + count].
+
+ ^ bytesSent
+ !
More information about the Squeak-dev
mailing list
|