April 8, 2005

AppleScript XML-RPC Bug (and workaround!) Found

Filed under: ResearchAndDevelopment — Ryan Wilcox @ 2:44 pm

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.

1 Comment

  1. 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

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.