Native macOS app for posting to Mastodon, WordPress (self-hosted), and Micro.blog. Features: global hotkey (Ctrl+Option+Cmd+T), multiple accounts with selection, image attachments (up to 4, drag-and-drop), floating panel UI, Keychain storage.
42 lines
1.1 KiB
Swift
42 lines
1.1 KiB
Swift
import Foundation
|
|
|
|
struct MultipartFormData {
|
|
let boundary: String
|
|
private var body = Data()
|
|
|
|
init(boundary: String = UUID().uuidString) {
|
|
self.boundary = boundary
|
|
}
|
|
|
|
var contentType: String {
|
|
"multipart/form-data; boundary=\(boundary)"
|
|
}
|
|
|
|
mutating func addField(name: String, value: String) {
|
|
body.append("--\(boundary)\r\n")
|
|
body.append("Content-Disposition: form-data; name=\"\(name)\"\r\n\r\n")
|
|
body.append("\(value)\r\n")
|
|
}
|
|
|
|
mutating func addFile(name: String, filename: String, mimeType: String, data: Data) {
|
|
body.append("--\(boundary)\r\n")
|
|
body.append("Content-Disposition: form-data; name=\"\(name)\"; filename=\"\(filename)\"\r\n")
|
|
body.append("Content-Type: \(mimeType)\r\n\r\n")
|
|
body.append(data)
|
|
body.append("\r\n")
|
|
}
|
|
|
|
var finalized: Data {
|
|
var result = body
|
|
result.append("--\(boundary)--\r\n")
|
|
return result
|
|
}
|
|
}
|
|
|
|
extension Data {
|
|
mutating func append(_ string: String) {
|
|
if let data = string.data(using: .utf8) {
|
|
append(data)
|
|
}
|
|
}
|
|
}
|