Uploading to Amazon S3 – Response for preflight is invalid (redirect – 307)

Response for preflight is invalid – redirect 307

Hi there!

Just wanted to make a quick post about an error message (Responde for preflight is invalid – redirect) that can probably confuse someone while working with Amazon S3 uploads directly from the browser.

I’d been testing uploads to Amazon S3 using Ember Plupload (a wrapper around Plupload) to a development bucket directly from the browser. I activated CORS by using this example and the S3 example in Ember Plupload page as it was required for direct uploads.

After I got everything working, I decided to create a “production” bucket and deploy my application pointing to that new bucket. Immediately I started getting this strange error in Chrome’s network tab while making the preflight request (the OPTIONS request).

Response for preflight is invalid (redirect) – 307

Essentially the response was a 307 redirect, instead of the 200 OK that I was expecting, and that was working on the development bucket.

Since uploading to the development bucket was working, it could only be some configuration or state that was wrong.

I checked and double checked the configurations and they were the same. I started googling without finding anything that helped.

I then looked really good at the response and noticed that the redirect was to a slightly different link than what I was expecting, it as redirecting me “https://mybucket.s3-eu-west-1.amazonaws.com” instead of the original url which was “https://mybucket.s3.amazonaws.com”.

I tried changing the upload url to this “redirect” and it started working, I checked the responses for the development bucket, and there was no mention of the “s3-west-1” anywhere.

After that I found this comment on github:

The reason his happens (and also the reason why it self-resolves), is that when you set up an S3 bucket, there’s a certain time during which the global bucket URL is not available, so AWS redirects to the region-specific URL.

The redirect response that Amazon sends back when you request the global URL doesn’t have CORS headers, so requests will fail until the DNS has propagated.

Which has a reference to S3’s documentation:

From the documentation:

Temporary redirects automatically redirect users who do not have DNS information for the requested bucket. This occurs because DNS changes take time to propagate through the Internet. For example, if a user creates a bucket with a location constraint and immediately stores an object in the bucket, information about the bucket might not yet have been distributed throughout the Internet. Because the bucket is a subdomain of s3.amazonaws.com, Amazon S3 redirects it to the correct Amazon S3 location.

So, I basically only had to wait until Amazon propagated DNS information (took about 2 hours or so, I think). But since it didn’t happen with the development bucket (which I created before I started developing…. so, it makes sense) I got lost there.

Well, I hope that this might spare you some headaches…. just wait a bit :)

Happy coding!

EmberJS – Failed to execute ‘setAttribute’ on ‘Element’: ‘=’ is not a valid attribute name.

Hi

Just wanted to do a quick post about this error I got when developing an EmberJS Application and trying to test a component (via an Integration test). The following error occurred while running the test:

Error: Failed to execute 'setAttribute' on 'Element': '=' is not a valid attribute name.
    at Error (native)
    at DOMHelper.prototype.setAttribute (http://localhost:4200/assets/vendor.js:12027:13)
    at Object.buildFragment (http://localhost:4200/assets/weldnote.js:24465:13)
    at getCachedFragment (http://localhost:4200/assets/vendor.js:55321:29)
    at Function.RenderResult.build (http://localhost:4200/assets/vendor.js:55044:20)
    at render (http://localhost:4200/assets/vendor.js:55008:37)
    at http://localhost:4200/assets/vendor.js:55799:11
    at renderAndCleanup (http://localhost:4200/assets/vendor.js:55836:18)
    at Object.block [as default] (http://localhost:4200/assets/vendor.js:55797:9)
    at keywords.yield (http://localhost:4200/assets/vendor.js:54620:25)

I was trying to create an integration test for a component like the following (the default generated test, where I removed the block form assertion):

import { moduleForComponent, test } from 'ember-qunit';
import hbs from 'htmlbars-inline-precompile';

moduleForComponent('/w-powerselect', 'Integration | Component | w powerselect', {
  integration: true
});

test('it renders', function(assert) {
  assert.expect(1);

  // Set any properties with this.set('myProperty', 'value');
  // Handle any actions with this.on('myAction', function(val) { ... });

  this.render(hbs`{{w-powerselect}}`);

  assert.equal(this.$().text().trim(), '');
});

It was an error message I never seen before, but sure enough it was a simple problem. I had this in my component handlebars template:

<label data-test='label'=>{{label}}</label> 
{{#if canEdit}} 
  <div class="w-powerselect-addon"> 
  <div class='w-powerselect-field' data-test='select-container'>
Can you spot the error? Look closely at the ‘data-test=’label’=>‘. Somehow I left that second ‘=‘ (equal) sign there and it doesn’t make HTMLBars fail the compilation but at runtime it blows up with this weird error.
Happy coding!

JPA Generate Schema – Scripting was requested, but no target was specified

Hi all,

I’ve been making some experiments with the Play Framework (version 2.4.2) and JPA integration (with Hibernate – version 4.3.10). I was trying to make Hibernate generate the SQL Schema based on the JPA annotations I had in my entity classes and stumbled upon the error you see on the title, with the following stack trace:

[ProvisionException: Unable to provision, see the following errors: 1) Error injecting constructor, javax.persistence.PersistenceException: Scripting was requested, but no target was specified at play.db.jpa.DefaultJPAApi$JPAApiProvider.<init>(DefaultJPAApi.java:35) at play.db.jpa.DefaultJPAApi$JPAApiProvider.class(DefaultJPAApi.java:30) while locating play.db.jpa.DefaultJPAApi$JPAApiProvider while locating play.db.jpa.JPAApi

I found that there are some JPA properties to make the provider (in my case, Hibernate) generate the scripts for you (standard properties, no need to use hibernate.hbm2ddl.auto in the persistence.xml file). I’ve found that link through this great answer on stackoverflow.

One of the properties is this:

<property name=“javax.persistence.schema-generation.scripts.action” value=“none / drop / drop-and-create / create “/>

Which when I added to my persistence.xml with any of the values – drop/drop-and-create/create  gave me the said error because I didn’t specify where to create the scripts. That’s what the following properties are for:

  • javax.persistence.schema-generation.scripts.create-target
  • javax.persistence.schema-generation.scripts.drop-target

You have to tell the JPA provider where to create the scripts, hence the error “scripting requested, but no target specified“.

The solution

Add the following properties:

  • <property name=“javax.persistence.schema-generation.scripts.action” value=“drop-and-create”/>
  • <property name=“javax.persistence.schema-generation.scripts.drop-target” value=“conf/db/drop-schema.sql”/>
  • <property name=“javax.persistence.schema-generation.scripts.create-target” value=“conf/db/create-schema.sql”/>

You then get the scripts generated to conf/db/. Hope that helps someone :)

Happy coding!