Eliot Miranda uploaded a new version of Network to project The Trunk: http://source.squeak.org/trunk/Network-eem.249.mcz
==================== Summary ====================
Name: Network-eem.249 Author: eem Time: 12 October 2021, 5:04:34.016607 pm UUID: e005ce57-6681-403f-8cea-862ea013cd14 Ancestors: Network-ul.248
Extend HTTPServerDirectory so that it can parse XML descriptions as per e.g. http://files.squeak.org/trunk/. This works, but could really do with a review from someone intimately familiar with ServerDirectory and subclasses.
Hence the following gets the latest trunk images and unpacks them: | entries | entries := (HTTPServerDirectory new type: #http) altUrl: 'http://files.squeak.org/trunk/'; entries. #('32bit' '64bit') do: [:bitness| | latest | latest := (entries select: [:entry| entry name includesSubstring: bitness]) inject: entries first into: [:best :each| | vnb vne | vnb := (best name subStrings: '-') second asInteger. vne := (each name subStrings: '-') second asInteger. vnb > vne ifTrue: [best] ifFalse: [each]]. Cursor write showWhile: [(Cursor read showWhile: [ZipArchive new readFrom: (((HTTPServerDirectory new type: #http) altUrl: (latest containingDirectory altUrl, latest name); entries) detect: [:entry| entry name endsWith: 'bit.zip']) readStream]) extractAllTo: FileDirectory default informing: nil overwrite: true]]
=============== Diff against Network-ul.248 ===============
Item was changed: ----- Method: HTTPServerDirectory>>entries (in category 'file directory') ----- entries | answer ftpEntries | answer := HTTPSocket httpGetDocument: self dirListUrl. answer isString ifTrue: [^self error: 'Listing failed: ' , answer] ifFalse: [answer := answer content]. + answer first = $< ifTrue: + [(answer first: 5) = '<?xml' ifTrue: + [(Smalltalk classNamed: #XMLDOMParser) ifNotNil: + [^self parseFTPEntriesFromXML: (XMLDOMParser parseDocumentFrom: answer readStream useNamespaces: true)]]. + self error: 'Listing failed: ' , answer]. - answer first = $< - ifTrue: [self error: 'Listing failed: ' , answer]. ftpEntries := answer lines. ^ ftpEntries collect:[:ftpEntry | self class parseFTPEntry: ftpEntry] thenSelect: [:entry | entry notNil]!
Item was added: + ----- Method: HTTPServerDirectory>>fileSizeFromString: (in category 'misc') ----- + fileSizeFromString: aString + | size | + size := aString asNumber. + ('KMGTP' indexOf: aString last asUppercase ifAbsent: nil) ifNotNil: + [:index| size := size * (2 raisedTo: index * 10)]. "1k = 2^10, etc..." + ^size asInteger!
Item was added: + ----- Method: HTTPServerDirectory>>parseFTPEntriesFromXML: (in category 'misc') ----- + parseFTPEntriesFromXML: anXMLDocument + | entries | + entries := OrderedCollection new. + anXMLDocument + tagsNamed: #tr + ifReceiverDoAndRecurse: + [:node| | ec | + ((ec := node elementsAndContents) size = 4 + and: [((ec := ec asArray) allSatisfy: [:n| n isTag]) + and: [((ec collect: [:n| n attributeAt: 'class']) sameElements: #('n' 'm' 's' 't'))]]) ifTrue: + [[:n :m :s :t| | modificationString nameString | + (n isTag + and: [(modificationString := m string) size > 12 "YYYYMMDDHHSS" + and: [modificationString first isDigit]]) ifTrue: + [nameString := n attributeAt: 'href'. + entries addLast: + (t string = 'Directory' "is-a-directory flag" + ifTrue: + [DirectoryEntryDirectory + directory: self + name: nameString "file name" + creationTime: nil + modificationTime: modificationString asDateAndTime "modification time" + fileSize: nil] + ifFalse: + [DirectoryEntryFile + directory: self + name: nameString "file name" + creationTime: nil + modificationTime: modificationString asDateAndTime "modification time" + fileSize: (self fileSizeFromString: s string)])]] valueWithArguments: (ec collect: [:element| element elementsAndContents first])]]. + ^entries!
packages@lists.squeakfoundation.org