[squeak-dev] The Trunk: Network-ar.87.mcz
commits at source.squeak.org
commits at source.squeak.org
Sat Sep 4 18:05:50 UTC 2010
Andreas Raab uploaded a new version of Network to project The Trunk:
http://source.squeak.org/trunk/Network-ar.87.mcz
==================== Summary ====================
Name: Network-ar.87
Author: ar
Time: 4 September 2010, 11:04:42.245 am
UUID: be2e83d6-1f4d-2246-aaf3-6d485f4f6578
Ancestors: Network-fbs.86
Do not encode incoming urls in httpRequest:... since they are assumed to be encoded already.
=============== Diff against Network-fbs.86 ===============
Item was changed:
----- Method: HTTPSocket class>>httpRequest:url:headers:content:response: (in category 'get the page') -----
httpRequest: method url: urlString headers: hdrs content: contentOrNil response: responseBlock
"Sends an HTTP request to the server. Returns a MIMEDocument if successful,
a string indicating the error otherwise. If a response block is provided, the
+ response is fed into into so that the sender can see all the headers.
+ The url string is assumed to be properly escaped by the sender."
- response is fed into into so that the sender can see all the headers."
| index serverAndPort server port rawUrl stream resp code headers
contentLength contentType contentStream |
(urlString beginsWith: 'http://') ifFalse:[self error: 'Not a http url'].
"Extract server, port, and url"
index := urlString indexOf: $/ startingAt: 8 ifAbsent:[urlString size+1]. "past http://"
serverAndPort := urlString copyFrom: 8 to: index-1.
server := serverAndPort copyUpTo: $:.
port := ((serverAndPort copyAfter: $:) ifEmpty:['80']) asNumber.
"Prepare the request URI"
rawUrl := urlString copyFrom: index to: urlString size.
(rawUrl beginsWith: '/') ifFalse:[rawUrl := '/', rawUrl].
- rawUrl := rawUrl encodeForHTTPWithTextEncoding: 'utf-8'
- conditionBlock: [:c | c isSafeForHTTP or:['/;&=\?' includes: c]].
"Check for proxy"
(self shouldUseProxy: server) ifTrue:[
self httpProxyServer ifNotEmpty:[
rawUrl := 'http://', serverAndPort, rawUrl. "per RFC 2616"
server := self httpProxyServer.
port := self httpProxyPort.
].
].
"Fire off the request"
stream := SocketStream openConnectionToHostNamed: server port: port.
stream nextPutAll: method; space; nextPutAll: rawUrl; space; nextPutAll: 'HTTP/1.0'; crlf.
stream nextPutAll: 'Host: ', serverAndPort; crlf.
stream nextPutAll: 'Connection: close'; crlf.
stream nextPutAll: 'User-Agent: ', self userAgentString; crlf.
stream nextPutAll: hdrs.
stream crlf.
contentOrNil ifNotNil:[
"Upload request content"
contentStream := contentOrNil readStream.
[contentStream atEnd] whileFalse:[
(HTTPProgress new) total: contentOrNil size;
amount: contentStream position; signal: 'Uploading...'.
stream nextPutAll: (contentStream next: 4096).
stream flush.
].
].
stream flush.
"Read the response"
resp := stream upToAll: String crlfcrlf.
"Extract the response code"
code := ((resp copyUpTo: String cr) findTokens: ' ') second asNumber.
"And the response headers"
headers := Dictionary new.
resp lines allButFirst allButLast do:[:nextLine|
headers at: (nextLine copyUpTo: $:) asLowercase
put: (nextLine copyAfter: $:) withBlanksTrimmed.
].
"Read response content"
contentLength := headers at: 'content-length' ifAbsent:[nil].
contentType := headers at: 'content-type' ifAbsent:['application/octet-stream'].
"Fixme - Provide HTTProgress"
contentLength
ifNil:[contentStream := WriteStream with: stream upToEnd]
ifNotNil:[
contentLength := contentLength asNumber.
contentStream := (String new: contentLength) writeStream.
[contentStream position < contentLength] whileTrue:[
contentStream nextPutAll:
(stream next: (contentLength - contentStream position min: 4096)).
(HTTPProgress new) total: contentLength;
amount: contentStream position; signal: 'Downloading...'.
].
].
stream close.
responseBlock ifNotNil:[responseBlock value: resp].
^(code between: 200 and: 299)
ifTrue:[MIMEDocument contentType: contentType
content: contentStream contents url: urlString]
ifFalse:[resp asString, contentStream contents].
!
More information about the Squeak-dev
mailing list
|