[Ur] redirect breaks channels

Adam Chlipala adamc at csail.mit.edu
Sun Dec 29 10:36:33 EST 2013


On 12/28/2013 01:38 PM, Sergey Mironov wrote:
>> Executive summary: any properly typed function exported from a program's
>> main module is treated as accessible via GET requests.  However, RFCs say
>> that GET requests shouldn't cause side effects.  One fix is to add a .urs
>> file that only exposes the entry points you really intended.  (As a bonus,
>> this should also enable you to remove [: transaction page] annotations in
>> the .ur file!)
>>      
> Yes, the problem can be solved by adding channel2.urs containing
> 'main' signature only.

I think the error reporting was overeager in that case; I've pushed a 
changeset quieting it down.  Your original program compiles for me now.

However, you should be aware that this wasn't just a case of 
overconservative program analysis by Ur/Web.  Your program really does 
violate HTTP standards.  Redirects and links make GET requests, and GET 
requests aren't supposed to have side effects, whereas the functions you 
got complaints about do cause persistent side effects.  I only intended 
for 'safeGet' to be used in cases where there are especially compelling 
reasons to "break the rules"!

In your case, for instance, it would be easy to call [put] via a form or 
RPC, which use POST requests and so are allowed to cause persistent side 
effects.

> Unfortunately, I have at least one more test
> which I can't compile anymore because of similar errors. This
> application is rather complex so I don't plan to post it here, but it
> contains a single 'main' function without forms and redirects, only
> with  back-links to itself (via<a link={main {}}>back</a>).   That is
> why I think that urweb become too suspicious.

Let me know if my change doesn't fix that problem.  I'm not sure why any 
prior, recent Ur/Web changes would affect such things, though.

> In the end, it is strange to see
> error messages mentioning forms because channel2.ur contains no forms!
>    

Despite the fact that it wasn't actually called for in your code, that 
error message happened to be missing a third case, RPC handlers.  I 
added that possibility to the text, which should be helpful to further 
confuse people who come upon the message in the future. ;)  (Actually, 
when it only fires in appropriate cases, I hope it will always be clear 
what the problem is.)



More information about the Ur mailing list