@@ -20,45 +20,130 @@ public final class RssComm {
2020 . replacingOccurrences ( of: " " , with: " + " )
2121 . replacingOccurrences ( of: " " , with: " + " , options: [ ] , range: nil )
2222 }
23-
2423 public init ( ) throws {
2524 var errorCode : Int32 = - 1
2625
2726 let network_interface : ( @convention ( c) ( UnsafeMutablePointer < CChar > ? , UnsafeMutablePointer < CChar > ? , UnsafeMutableRawPointer ? , UnsafeMutablePointer < Int32 > ? ) -> UnsafeMutablePointer < CChar > ? ) ? = { url, data, _, error_code in
2827 let sem = DispatchSemaphore ( value: 0 )
29- let urlString = String ( cString: url!)
28+ var urlString = String ( cString: url!)
3029 let dataString = String ( cString: data!)
3130 string_free ( url)
3231 string_free ( data)
32+ if urlString. split ( separator: " / " ) . last == " rss_round_2 " {
33+ urlString. append ( " _stream " ) // use multipart-form api instead
34+ }
3335 let url = URL ( string: urlString) !
3436 let session = URLSession . shared
3537 var request = URLRequest ( url: url)
3638 request. httpMethod = " POST "
3739 request. addValue ( " * " , forHTTPHeaderField: " Access-Control-Allow-Origin " )
3840 request. addValue ( " GET, POST " , forHTTPHeaderField: " Access-Control-Allow-Methods " )
3941 request. addValue ( " Content-Type " , forHTTPHeaderField: " Access-Control-Allow-Headers " )
40- request. addValue ( " application/json " , forHTTPHeaderField: " Content-Type " )
41-
42- request. httpBody = dataString. data ( using: String . Encoding. utf8)
43- var resultPointer = UnsafeMutablePointer < CChar > ( nil )
44- var result = NSString ( )
45- session. dataTask ( with: request) { data, _, error in
46- defer {
47- sem. signal ( )
42+ if urlString. split ( separator: " / " ) . last == " rss_round_1 " {
43+ request. addValue ( " application/json " , forHTTPHeaderField: " Content-Type " )
44+ request. httpBody = dataString. data ( using: String . Encoding. utf8)
45+ var resultPointer = UnsafeMutablePointer < CChar > ( nil )
46+ var result = NSString ( )
47+ session. dataTask ( with: request) { data, _, error in
48+ defer {
49+ sem. signal ( )
50+ }
51+ if error != nil {
52+ let code : Int32 = 1
53+ error_code? . pointee = code
54+ }
55+ if let data = data {
56+ let resultString : String = String ( decoding: data, as: UTF8 . self)
57+ result = NSString ( string: resultString)
58+ }
59+ } . resume ( )
60+
61+ sem. wait ( )
62+ resultPointer = UnsafeMutablePointer < CChar > ( mutating: result. utf8String)
63+ return resultPointer
64+ } else {
65+ let json = try ! JSONSerialization . jsonObject ( with: dataString. data ( using: String . Encoding. utf8) !, options: . allowFragments) as! [ String : Any ]
66+
67+ let boundary = " Boundary- \( UUID ( ) . uuidString) "
68+ var request = URLRequest ( url: url)
69+ request. httpMethod = " POST "
70+ request. setValue ( " multipart/form-data; boundary= \( boundary) " , forHTTPHeaderField: " Content-Type " )
71+
72+ var body = Data ( )
73+
74+ func appendField( name: String , value: Any ) {
75+ body. append ( " -- \( boundary) \r \n " . data ( using: . utf8) !)
76+ body. append ( " Content-Disposition: form-data; name= \" \( name) \" \r \n \r \n " . data ( using: . utf8) !)
77+ body. append ( " \( value) \r \n " . data ( using: . utf8) !)
4878 }
49- if error != nil {
50- let code : Int32 = 1
51- error_code? . pointee = code
79+
80+ func appendJSONField( name: String , json: Any ) {
81+ if let jsonData = try ? JSONSerialization . data ( withJSONObject: json, options: [ ] ) ,
82+ let jsonString = String ( data: jsonData, encoding: . utf8) {
83+ body. append ( " -- \( boundary) \r \n " . data ( using: . utf8) !)
84+ body. append ( " Content-Disposition: form-data; name= \" \( name) \" \r \n " . data ( using: . utf8) !)
85+ body. append ( " Content-Type: application/json \r \n \r \n " . data ( using: . utf8) !)
86+ body. append ( " \( jsonString) \r \n " . data ( using: . utf8) !)
87+ }
5288 }
53- if let data = data {
54- let resultString : String = String ( decoding : data , as : UTF8 . self )
55- result = NSString ( string : resultString )
89+
90+ if let roundName = json [ " round_name " ] as? String {
91+ appendField ( name : " round_name " , value : roundName )
5692 }
57- } . resume ( )
58-
59- sem. wait ( )
60- resultPointer = UnsafeMutablePointer < CChar > ( mutating: result. utf8String)
61- return resultPointer
93+ if let serverIndex = json [ " server_index " ] as? Int {
94+ appendField ( name: " server_index " , value: serverIndex)
95+ }
96+ if let targetIndex = json [ " target_index " ] as? [ Int ] {
97+ appendField ( name: " target_index " , value: targetIndex. map { " \( $0) " } . joined ( separator: " , " ) )
98+ }
99+
100+ if let data = json [ " data " ] as? [ [ String : Any ] ] {
101+ for (index, dataItem) in data. enumerated ( ) {
102+ if let masterCommits = dataItem [ " master_commits " ] as? [ [ String : Any ] ] {
103+ for (idx, subDataItem) in masterCommits. enumerated ( ) {
104+ appendJSONField ( name: " data[ \( index) ][master_commits[ \( idx) ]] " , json: subDataItem)
105+ }
106+ }
107+ if let serverCommits = dataItem [ " server_commits " ] as? [ [ String : Any ] ] {
108+ for (idx, subDataItem) in serverCommits. enumerated ( ) {
109+ appendJSONField ( name: " data[ \( index) ][server_commits[ \( idx) ]] " , json: subDataItem)
110+ }
111+ }
112+ if let serverEncs = dataItem [ " server_encs " ] as? [ [ String : Any ] ] {
113+ for (idx, subDataItem) in serverEncs. enumerated ( ) {
114+ appendJSONField ( name: " data[ \( index) ][server_encs[ \( idx) ]] " , json: subDataItem)
115+ }
116+ }
117+ if let factorPubkeys = dataItem [ " factor_pubkeys " ] as? [ [ String : Any ] ] {
118+ for (idx, subDataItem) in factorPubkeys. enumerated ( ) {
119+ appendJSONField ( name: " data[ \( index) ][factor_pubkeys[ \( idx) ]] " , json: subDataItem)
120+ }
121+ }
122+ }
123+ }
124+
125+ body. append ( " -- \( boundary) -- \r \n " . data ( using: . utf8) !)
126+ request. httpBody = body
127+ var resultPointer = UnsafeMutablePointer < CChar > ( nil )
128+ var result = NSString ( )
129+ session. dataTask ( with: request) { data, _, error in
130+ defer {
131+ sem. signal ( )
132+ }
133+ if error != nil {
134+ let code : Int32 = 1
135+ error_code? . pointee = code
136+ }
137+ if let data = data {
138+ let resultString : String = String ( decoding: data, as: UTF8 . self)
139+ result = NSString ( string: resultString)
140+ }
141+ } . resume ( )
142+
143+ sem. wait ( )
144+ resultPointer = UnsafeMutablePointer < CChar > ( mutating: result. utf8String)
145+ return resultPointer
146+ }
62147 }
63148
64149 let result = withUnsafeMutablePointer ( to: & errorCode, { error in
0 commit comments