Skip to content

Commit 0ba1dc7

Browse files
committed
Reduce use of stringly typed lookups. Fix boundary bug.
1 parent 0bf0cc6 commit 0ba1dc7

File tree

10 files changed

+47
-28
lines changed

10 files changed

+47
-28
lines changed

SwiftIpfsApi.xcodeproj/xcshareddata/xcschemes/SwiftIpfsApi.xcscheme

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,13 @@
7878
ReferencedContainer = "container:SwiftIpfsApi.xcodeproj">
7979
</BuildableReference>
8080
</MacroExpansion>
81+
<EnvironmentVariables>
82+
<EnvironmentVariable
83+
key = "CFNETWORK_DIAGNOSTICS"
84+
value = "1"
85+
isEnabled = "NO">
86+
</EnvironmentVariable>
87+
</EnvironmentVariables>
8188
<AdditionalOptions>
8289
</AdditionalOptions>
8390
</LaunchAction>

SwiftIpfsApi/HttpIo.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,9 @@ public struct HttpIo : NetworkIo {
101101
} else {
102102

103103
/// Add the contents of the file to multipart message.
104-
105104
let fileUrl = URL(fileURLWithPath: path)
106-
107105
guard let fileData = try? Data(contentsOf: fileUrl) else { throw MultipartError.failedURLCreation }
108106

109-
// var fileName = fileUrl.absoluteString //.lastPathComponent
110-
// fileName = fileName.substring(from: file.index(file.startIndex, offsetBy:7))
111107
let fileName = NSString(string: fileUrl.absoluteString).replacingOccurrences(of: "file://", with: "")
112108

113109
multipart = try Multipart.addFilePart(multipart, fileName: fileName, fileData: fileData)

SwiftIpfsApi/IpfsApi.swift

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,22 @@ enum IpfsApiError : Error {
145145
case bootstrapError(String)
146146
}
147147

148+
// map command names to string to avoid "stringly typed" lookups.
149+
enum IpfsCmdString : String {
150+
case Ref = "Ref"
151+
case Path = "Path"
152+
case Version = "Version"
153+
case Name = "Name"
154+
case Pinned = "Pinned"
155+
case Keys = "Keys"
156+
case Peers = "Peers"
157+
case ID = "ID"
158+
case Addrs = "Addrs"
159+
case Value = "Value"
160+
case Message = "Message"
161+
162+
}
163+
148164
public class IpfsApi : IpfsApiClient {
149165

150166
public var baseUrl: String = ""
@@ -170,7 +186,6 @@ public class IpfsApi : IpfsApiClient {
170186
public let stats = Stats()
171187
public let config = Config()
172188
public let update = Update()
173-
174189

175190
public convenience init(addr: Multiaddr) throws {
176191
/// Get the host and port number from the Multiaddr
@@ -232,16 +247,13 @@ public class IpfsApi : IpfsApiClient {
232247

233248
public func add(_ filePaths: [String], completionHandler: @escaping ([MerkleNode]) -> Void) throws {
234249

235-
try net.sendTo(baseUrl+"add?stream-channels=true", content: filePaths) {
236-
// try net.sendTo(baseUrl+"add?r", content: filePaths) {
250+
try net.sendTo(baseUrl+"add?s", content: filePaths) {
237251
data in
238252
do {
239253
/// If there was no data fetched pass an empty dictionary and return.
240254
let fixedData = fixStreamJson(data)
241255

242-
243256
let json = JsonType.parse(try JSONSerialization.jsonObject(with: fixedData, options: JSONSerialization.ReadingOptions.allowFragments) as AnyObject)
244-
print(json)
245257

246258
let res = try merkleNodesFromJson(json)
247259
guard res.count > 0 else { throw IpfsApiError.jsonSerializationFailed }
@@ -321,7 +333,7 @@ public class IpfsApi : IpfsApiClient {
321333
var refs: [Multihash] = []
322334

323335
for obj in results {
324-
if let ref = obj.object?["Ref"]?.string {
336+
if let ref = obj.object?[IpfsCmdString.Ref.rawValue]?.string {
325337
let mh = try fromB58String(ref)
326338
refs.append(mh)
327339
}
@@ -339,7 +351,7 @@ public class IpfsApi : IpfsApiClient {
339351
try fetchJson("dns?arg=" + domain) {
340352
result in
341353

342-
guard let path = result.object?["Path"]?.string else { throw IpfsApiError.resultMissingData("No Path found") }
354+
guard let path = result.object?[IpfsCmdString.Path.rawValue]?.string else { throw IpfsApiError.resultMissingData("No Path found") }
343355
completionHandler(path)
344356
}
345357
}
@@ -377,7 +389,7 @@ public class IpfsApi : IpfsApiClient {
377389
public func version(_ completionHandler: @escaping (String) -> Void) throws {
378390
try fetchJson("version") {
379391
json in
380-
let version = json.object?["Version"]?.string ?? ""
392+
let version = json.object?[IpfsCmdString.Version.rawValue]?.string ?? ""
381393
completionHandler(version)
382394
}
383395
}

SwiftIpfsApi/Multipart.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ extension Multipart {
6565
for _ in 0 ..< count {
6666
let r = Int(arc4random_uniform(UInt32(maxCount)))
6767
let randomIndex = allowed.index(allowed.startIndex, offsetBy: r)
68-
// output += String(allowed.characters[allowed.characters.index(allowed.startIndex, offsetBy: r)])
69-
output += allowed[..<randomIndex]
68+
69+
output += String(allowed[randomIndex])
7070
}
7171

7272
return output
@@ -144,12 +144,12 @@ extension Multipart {
144144
public static func finishMultipart(_ multipart: Multipart, completionHandler: @escaping (Data) -> Void) {
145145

146146
let outString = "--" + multipart.boundary + "--" + lineFeed
147+
147148
multipart.body.append(outString.data(using: String.Encoding.utf8)!)
148149

149150
multipart.request.setValue(String(multipart.body.length), forHTTPHeaderField: "content-length")
150151
multipart.request.httpBody = multipart.body as Data
151-
152-
152+
153153
/// Send off the request
154154
let task = URLSession.shared.dataTask(with: (multipart.request as URLRequest)) {
155155
(data: Data?, response: URLResponse?, error: Error?) -> Void in

SwiftIpfsApi/Subcommands/Bootstrap.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public class Bootstrap : ClientSubCommand {
5858
result in
5959

6060
var addresses: [Multiaddr] = []
61-
if let peers = result.object?["Peers"]?.array {
61+
if let peers = result.object?[IpfsCmdString.Peers.rawValue]?.array {
6262
/// Make an array of Multiaddr from each peer
6363
addresses = try peers.map { try newMultiaddr($0.string!) }
6464
}

SwiftIpfsApi/Subcommands/Config.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ public class Config : ClientSubCommand {
2828
public func get(_ key: String, completionHandler: @escaping (JsonType) throws -> Void) throws {
2929
try parent!.fetchJson("config?arg=" + key) {
3030
result in
31-
guard let value = result.object?["Value"] else {
32-
throw IpfsApiError.swarmError("Config get error: \(String(describing: result.object?["Message"]?.string))")
31+
guard let value = result.object?[IpfsCmdString.Value.rawValue] else {
32+
throw IpfsApiError.swarmError("Config get error: \(String(describing: result.object?[IpfsCmdString.Message.rawValue]?.string))")
3333
}
3434

3535
try completionHandler(value)

SwiftIpfsApi/Subcommands/Name.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public class Name : ClientSubCommand {
3535
try parent!.fetchJson(request) {
3636
result in
3737

38-
let resolvedName = result.object?["Path"]?.string ?? ""
38+
let resolvedName = result.object?[IpfsCmdString.Path.rawValue]?.string ?? ""
3939
completionHandler(resolvedName)
4040
}
4141
// try parent!.fetchData(request) {

SwiftIpfsApi/Subcommands/Pin.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class Pin : ClientSubCommand {
1919
try parent!.fetchJson("pin/add?stream-channels=true&arg=\(b58String(hash))") {
2020
result in
2121

22-
guard let objects = result.object?["Pinned"]?.array else {
22+
guard let objects = result.object?[IpfsCmdString.Pinned.rawValue]?.array else {
2323
throw IpfsApiError.pinError("Pin.add error: No Pinned objects in JSON data.")
2424
}
2525

@@ -53,7 +53,7 @@ public class Pin : ClientSubCommand {
5353
try parent!.fetchJson("pin/ls?stream-channels=true&t=" + pinType.rawValue) {
5454
result in
5555

56-
guard let objects = result.object?["Keys"] else {
56+
guard let objects = result.object?[IpfsCmdString.Keys.rawValue] else {
5757
throw IpfsApiError.pinError("Pin.ls error: No Keys Dictionary in JSON data.")
5858
}
5959

@@ -70,7 +70,7 @@ public class Pin : ClientSubCommand {
7070
try parent!.fetchJson("pin/rm?stream-channels=true&r=\(recursive)&arg=\(b58String(hash))") {
7171
result in
7272

73-
guard let objects = result.object?["Pinned"]?.array else {
73+
guard let objects = result.object?[IpfsCmdString.Pinned.rawValue]?.array else {
7474
throw IpfsApiError.pinError("Pin.rm error: No Pinned objects in JSON data.")
7575
}
7676

SwiftIpfsApi/Subcommands/Swarm.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public class Swarm : ClientSubCommand {
2121
result in
2222

2323
var addresses: [Multiaddr] = []
24-
if let swarmPeers = result.object?["Peers"]?.array {
24+
if let swarmPeers = result.object?[IpfsCmdString.Peers.rawValue]?.array {
2525
/// Make an array of Multiaddr from each peer in swarmPeers.
2626
addresses = try swarmPeers.map { try newMultiaddr($0.string!) }
2727
}
@@ -36,7 +36,7 @@ public class Swarm : ClientSubCommand {
3636

3737
try parent!.fetchJson("swarm/addrs?stream-channels=true") {
3838
result in
39-
guard let addrsData = result.object?["Addrs"] else {
39+
guard let addrsData = result.object?[IpfsCmdString.Addrs.rawValue] else {
4040
throw IpfsApiError.swarmError("Swarm.addrs error: No Addrs key in JSON data.")
4141
}
4242
try completionHandler(addrsData)

SwiftIpfsApiTests/SwiftIpfsApiTests.swift

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ import SwiftMultihash
1414

1515
class SwiftIpfsApiTests: XCTestCase {
1616

17-
var hostString = "127.0.0.1" //"192.168.5.8"
17+
// var hostString = "ipfs-thing.localhost"//192.168.5.9" //127.0.0.1" //"192.168.5.8"
18+
var hostString = "127.0.0.1"
1819
let hostPort = 5001
1920

2021
/// Your own IPNS node hash
@@ -847,14 +848,17 @@ class SwiftIpfsApiTests: XCTestCase {
847848
func testIds() {
848849

849850
do {
851+
// let api = try IpfsApi(host: self.hostString, port: self.hostPort, ssl: true)
850852
let api = try IpfsApi(host: self.hostString, port: self.hostPort)
851853
let idString = self.nodeIdString
852854

853855
let id = { (dispatchGroup: DispatchGroup) throws -> Void in
854856
try api.id(idString) {
855857
result in
856858

857-
XCTAssert(result.object?["ID"]?.string == idString)
859+
//// XCTAssert(result.object?["ID"]?.string == idString)
860+
XCTAssert(result.object?[IpfsCmdString.ID.rawValue]?.string == idString)
861+
858862
dispatchGroup.leave()
859863
}
860864
}
@@ -1038,7 +1042,7 @@ class SwiftIpfsApiTests: XCTestCase {
10381042
// "file:///Users/teo/tmp/notred.png",
10391043
// "file:///Users/teo/tmp/F4115_WU5086.jpeg"]
10401044
// let filePaths = [ "file:///Users/teo/Library/Services/FilesToIpfs.workflow"]
1041-
let filePaths = [ "file:///Users/teo/tmp/addtest3"]
1045+
let filePaths = [ "file:///Users/teo/tmp/addtest5"]
10421046

10431047
let api = try IpfsApi(host: self.hostString, port: self.hostPort)
10441048

0 commit comments

Comments
 (0)