cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Announcements
What’s new: end-to-end encryption, Replay and Dash updates. Find out more about these updates, new features and more here.

Dropbox API Support & Feedback

Find help with the Dropbox API from other developers.

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Re: Error in call to API function "files/upload": HTTP header "Dropbox-API-Arg":

Re: Error in call to API function "files/upload": HTTP header "Dropbox-API-Arg":

ingconti
Helpful | Level 5

good you are available

Said so, pls let me know How to fix it.

to recap:

a) my ap is written in swift, NO other components (neither official dropbox library, too big and too messy)

b) it did work since 2 month ago. now I got error

c) if I cannot see WHAT has been broken, pls sent me HINTS about, OR let mr speak with some tech guy of upper level, to get some helpful tips.

14 Replies 14

Greg-DB
Dropbox Staff

I can't say exactly what may have changed recently. The need to encode these values in HTTP headers has existed for a long time, so perhaps the path value itself was changed or the client network stack changed to expose this issue.

 

The issue was not immediately apparent based on your initial report, but I was sure to refer you to the relevant documentation and example once it was.

 

The value sent by the client needs to be properly encoded in order for the backend to be able to parse it.

 

And thanks for letting me know about the example! I'll ask the team to update that.

ingconti
Helpful | Level 5

seems working !

 

THX

 

I used a reduced version for simple string, as path:

 

 

func DB_utf8Decode(_ data: Data) -> String {

    return NSString(data: data, encoding: String.Encoding.utf8.rawValue)! as String

}

 

 

func DB_asciiEscape(_ s: String) -> String {

    var out: String = ""

 

    for char in s.unicodeScalars {

        var esc = "\(char)"

        if !char.isASCII {

            esc = NSString(format:"\\u%04x", char.value) as String

        } else {

            if (char == "\u{7F}") {

                esc = "\\u007f"

            } else {

                esc = "\(char)"

            }

        }

        out += esc

 

    }

    return out

}

 

 

 

ingconti
Helpful | Level 5

as a last side note:

you had to write:

  • C# (2 cersions)
  • java
  • JavaScript
  • Objective-C

  • Python

  • PHP

  • Swift

 

So 8 versions when simply accepting binary JSON on server would have prevented all this stuff? and / or fixing on server directly?

 

seems,  as minimum, suboptimal.

 

Greg-DB
Dropbox Staff

Thanks for following up. I'm glad to hear you got this working, and thanks for the feedback!

ingconti
Helpful | Level 5

a more "swift" solution for string with a copiale of Unit test:

 

func DB_asciiEscape(_ s: String) -> String {

    

    let out = s.unicodeScalars.reduce("", { (partialResult: String, char: UnicodeScalar) -> String  in

    

        if !char.isASCII {

            return partialResult + String(format:"\\u%04x", char.value)

        } else {

            if (char == "\u{7F}") {

                return partialResult + "\\u007f"

            } else {

                return partialResult + "\(char)"

            }

        }

    }

    )

 

    return out

}

 

 

 

//------ UNIT TESTS:

 

 

    

    func testUtf8Decode(){

        

        let unescaped = "/OUT/aaaaa_000.jpg"

        let escaped  = DB_asciiEscape(unescaped)

        print(escaped)

        

        let contains = escaped.contains("uff3f000.jpg")

        XCTAssert(contains, "not ecaped")

    }

    

    

    func testUtf8Decode2(){

        

        let unescaped = "αβγ.jpg"

        let escaped  = DB_asciiEscape(unescaped)

        print(escaped)

        

        let contains = escaped.contains("\\u03b1\\u03b2\\u03b3")

        XCTAssert(contains, "not ecaped")

        

    }

 

 

 

 

Need more support?