AppleScript XML-RPC Bug (and workaround!) Found
Today I found a fun bug in AppleScript’s XML-RPC client support.
Read on to find out what I discovered when you try to handle errors from an XML-RPC script. I also present a workaround, which is both obvious and not obvious.
Follow me through a little journey, told in Applescript.
Simple Call
First, let’s see a XML-RPC script, which will return an error. We don’t catch the error and so it stops the script
on workCall()
tell application "http://betty.userland.com:80/RPC2"
call xmlrpc {method name:"examples.getStateListss", parameters:{1}}
end tell
end workCall
workCall()
The Error
Now, obviously this doesn’t work for certain production scripts (like those that work without user intervention). The typical answer is put code that might fail into a try / on error block like so:
on bugCall()
tell application "http://betty.userland.com:80/RPC2"
try
call xmlrpc {method name:"examples.getStateListss", parameters:{1}}
on error errMess number errNum
log errMess
log errNum
end try
end tell
end bugCall
bugCall()
However, this gives you a parameter error when you try this. This is very odd, annoying, and yes, I have filed a bug on it (Apple employees can find the full bug report at Radar #4083408.)
The Workaround
So I was talking with Matthew Strange today about the bug, and he suggested restructuring the script so it looked like this:
on workAround()
try
tell application "http://betty.userland.com:80/RPC2"
call xmlrpc {method name:"examples.getStateListss", parameters:{1}}
end tell
on error errMsg number errNum
log errMsg
log errNum
end try
end workAround
workAround()
This kind of makes sense, because you tend to get scope errors in Applescript sometimes. Something like the following might error out:
to doIt()
beep
end
on run()
tell application "myApp"
doIt()
end tell
end run
This script, or something similar, may error out with a message stating that “MyApp doesn’t know how to handle doIt()”. You see, Applescript gets kind of confused here and thinks that it should tell myApp to call this function. Of course, myApp has no idea what to do - this function is in the script itself. Perhaps something similar is happening here with the error code information.
Conclusion
This bug has distracted me for at least half a day, probably more. Trying to determine who’s to blame, server or client. When I saw this error happen with Userland’s servers (the creators of XML-RPC), as well as my own server, I knew it was a client issue.
I tried an experiment in Cocoa with the WebServices.framework level, which worked fine. I was all ready to spend a developer incident to track this bug down when I discovered the workaround.
So there’s All You Ever wanted to know about using Applescript’s XML-RPC client interface, and handling errors (”faults”) returned by the server.
Backup Brain
Sometimes I treat my blog as a backup brain, to store information that I know I will forget.
Trackback by h4ck3r =boi — April 8, 2005 @ 3:15 pm