Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to debug CORS error

I'm trying to grab an image from Amazon S3 using cross-origin resource sharing so that I can use the canvas.toDataUrl() method.

On S3 I set the CORSconfiguration on the bucket to:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

When canvas.toDataURL() threw security error code 18, I guessed it was because the image had to be loaded with a "crossOrigin" attribute set.

Still, no matter how I load the image from S3, for example:

<img src="http://s3.amazonaws.com/storybookstorage/wood.png" crossOrigin="anonymous">

Chrome now gives me the error when I load this image:

Cross-origin image load denied by Cross-Origin Resource Sharing policy.

Can anyone help me figure out what's wrong, or even how I could pinpoint where the problem might be?

My headers for the image request (from chrome dev tools):

Request:

 GET /storybookstorage/wood.png HTTP/1.1
 Host: s3.amazonaws.com
 Connection: keep-alive
 Cache-Control: max-age=0
 Accept: image/webp,*/*;q=0.8
 If-None-Match: "d5098b2c3d1417da8ccd9764612248ca"
 If-Modified-Since: Thu, 08 Aug 2013 01:10:23 GMT
 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36
 DNT: 1
 Referer: http://0.0.0.0:3000/items/1/
 Accept-Encoding: gzip,deflate,sdch
 Accept-Language: en-US,en;q=0.8

Response:

 Date:Sat, 24 Aug 2013 00:27:56 GMT
 ETag:"d5098b2c3d1417da8ccd9764612248ca"
 Last-Modified:Thu, 08 Aug 2013 01:10:23 GMT
 Server:AmazonS3
 x-amz-id-2:gyR2VMt9hec8HrGvcXvDrrRb/sOm3i/WpUaRdnpr/PY2VoaJigSdA960B0q83zzN
 x-amz-request-id:434E3571705359E9

Thanks!

like image 697
russelll Avatar asked Mar 14 '26 20:03

russelll


1 Answers

Ok I figured out the problem. It's hard to debug because the browser doesn't give much info. It was a problem on the client side - the CORS specification is really picky about how a request is made. So in my case, I think the problem was loading the image in just an image tag.

The only way it seemed to work is if I set the "crossOrigin" attribute before loading the image:

 var grabbed = new Image();
 $(grabbed).attr('crossOrigin', '');
 $(grabbed).attr("src", mySource);

The only way I was able to debug this was to test several different setups on the client side & different configurations server side because the headers can be hard to interpret. (Problems on the client side can make it seem like the server isn't configured properly).

like image 190
russelll Avatar answered Mar 16 '26 15:03

russelll



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!