[Ur] returnBlob behavior?

Sergey Mironov grrwlf at gmail.com
Mon Feb 20 03:22:03 EST 2017


Hi. I could confirm that the application posted by Marko returns file
content in both branches of [if]. I agree that it is strange.

Below is the code UrWeb generated on my machine. At the first glance,
it is expected to return blob only on the size check failure. Somehow,
returnBlob is executed in the both cases.

Regards,
Sergey


  static uw_unit
   __uwn_wrap_echoLength_4277(uw_context ctx, struct __uws_1 __uwr_x0_0,
                               uw_unit __uwr___1)
   {
   return(({
           uw_unit __uwr___2 =
           (uw_begin_region(ctx), uw_Basis_debug(ctx,
                                   uw_Basis_intToString(ctx,
                                    uw_Basis_blobSize(ctx,
                                     uw_Basis_fileData(ctx,
                                      __uwr_x0_0.__uwf_File)))));
           uw_end_region(ctx);
            uw_Basis_htmlifyInt_w(ctx,
             uw_Basis_strlen(ctx,
              ({
               uw_Basis_bool disc =
               !
                (uw_Basis_blobSize(ctx,
                  uw_Basis_fileData(ctx, __uwr_x0_0.__uwf_File)) <= 100000LL);

               disc == uw_Basis_True ? "Whoa!  That one's too big."
                 :
                disc == uw_Basis_False ?
                 ({
                  uw_Basis_blob blob =
                  uw_Basis_fileData(ctx, __uwr_x0_0.__uwf_File);
                  uw_Basis_string mimeType =
                  uw_Basis_blessMime(ctx,
                   uw_Basis_fileMimeType(ctx, __uwr_x0_0.__uwf_File));
                  uw_Basis_string
                  tmp;
                  uw_return_blob(ctx, blob, mimeType);
                  tmp;
                  })
                  :
                 ({
                  uw_Basis_string
                  tmp;
                  uw_error(ctx, FATAL,
"/nix/store/fby0l6fdwqrq0rsr25jbc9hhg2srix08-urweb-urp-Urpf/Urpf.ur:11:32-11:33:
pattern match failure");
                  tmp;
                  });
               })));
           }));
   }

2017-02-19 18:15 GMT+03:00 Adam Chlipala <adamc at csail.mit.edu>:
> I think you've gotten the wrong idea about [returnBlob].  It operates in the
> style of exceptions, ending the transaction with the given result.  It's not
> a normal function return, so you can't use it pass a blob from one part of
> your program to another.  Also, it definitely doesn't generate strings.
>
> Somewhat intentionally, Ur/Web currently does not provide a way to
> introspect into a blob, without using the FFI.  It would take some thought
> on what the right API would be.  In my applications that involve CSV import,
> I have their content pasted into textboxes.
>
>
> On 02/19/2017 10:11 AM, Marko Schütz Schmuck wrote:
>>
>> I'm confused about the use of returnBlob.
>>
>> I was looking through the existing urweb demos to see how I could
>> access the data in a blob of mime type "text/plain" as a string.
>> Eventually, I want to import into a table from a CSV file the user
>> uploads.
>>
>> I hoped that returnBlob used in a transaction string could achieve
>> this. So I modified demo/upload.ur to
>>
>> fun echo (r : {File : file}) : transaction string =
>>    if blobSize (fileData r.File) > 100000 then
>>        return "Whoa!  That one's too big."
>>    else
>>        returnBlob (fileData r.File) (blessMime (fileMimeType r.File))
>>
>> fun echoLength (r : {File : file}) : transaction page =
>>      s <- echo r ;
>>      return <xml>{[String.length s]}</xml>
>>
>> fun main () : transaction page
>>    = return <xml><body>
>>    <h1>The Amazing File Echoer!</h1>
>>
>>    <form>Upload a file: <upload{#File}/> <submit
>> action={echoLength}/></form>
>> </body></xml>
>>
>> This compiles and runs, and when I supply a file longer than 100000 I
>> get the expected page with the result 26, but to my surprise a shorter
>> file results in a page with the content of the file not it's length.
>>
>> I'd really appreciate some help.
>>
>> Thanks in advance and best regards,
>>
>> Marko
>
>
> _______________________________________________
> Ur mailing list
> Ur at impredicative.com
> http://www.impredicative.com/cgi-bin/mailman/listinfo/ur



More information about the Ur mailing list