Two things: Do you really know that your if statement is succeeding? When you have doubts about things like that, putting a print, die(), or some other statement that removes the question of whether your subroutine is actually getting called is needed.
The second thing is the ampersand really isn't needed in the context that you're calling msg(). Typically, when you're passing arguments to a subroutine, the ampersand is not used. It's used when you want to pass the current value of @_ to the subroutine.
I ran your code, setting $proto = "HTTP/1.0", and then to "xHTTP/1.0". In both cases, it ran fine. This leads me to believe that the value that you think should be in $proto is not what you expect. To test your theory, put a print or die() statement after the if that will display the value of $proto.
--Chris
e-mail jcwren