Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

File upload in case of HTTP 307

I am writing a Spring controller that handles the HTTP PUT request from client, and generates S3 pre-signed url and issues a HTTP 307 status (Temp redirect) code. So basically I am authenticating the client and if it succeeds then I am asking him to write to a s3 folder. The client is able to write to signed url location.

Now my concern is the client will have to do upload two times. Once to my application server and then to s3, so the operation will take double the time.

Is my understanding correct?Does the client actually does 2 write in this case? Or is the client smart enough and just pushes the part of payload first and if it succeeds then pushes entire payload?

I read about HTTP 100 status code, but looks like the app server/tomcat already issues it and is not in my control.

Here is my spring controller

@RequestMapping("/upload")
public ResponseEntity<Void> execute(HttpServletRequest request) throws IOException, ServletException {

  HttpHeaders headers = new HttpHeaders();
  String redirectUrl = getRedirectUrl(requestURI, request.getMethod());
  headers.setLocation(new URI(redirectUrl));

  ResponseEntity<Void> redirectEntity = new ResponseEntity<Void>(null,headers,HttpStatus.TEMPORARY_REDIRECT);
  return redirectEntity;
}

How can i prevent clint from uploading the entire payload to my app server?

like image 358
user93796 Avatar asked Apr 28 '17 22:04

user93796


People also ask

How do I fix Error 307?

The best way to handle URL redirections is at the server level with HTTP 3xx redirect status code responses. If your site is down for maintenance or unavailable for other reasons, you can redirect it temporarily to another URL with a 307 Temporary Redirect response.

What does the HTTP status code 307 means?

HTTP 307 Temporary Redirect redirect status response code indicates that the resource requested has been temporarily moved to the URL given by the Location headers. The method and the body of the original request are reused to perform the redirected request.

What is the difference between 302 and 307?

302 is temporary redirect, which is generated by the server whereas 307 is internal redirect response generated by the browser.


2 Answers

So my understanding correct?

Answer is YES. Server will send the response of PUT request after reading the full request including body. when you client will repeat the request, in response 307 (Temporary Redirect), it will be like a new http request.

Also an important point on using 307 response code from spec(see below) should be considered for this approach.

If the 307 status code is received in response to a request other
than GET or HEAD, the user agent MUST NOT automatically redirect the
request unless it can be confirmed by the user, since this might
change the conditions under which the request was issued.

On point

How can i prevent client from uploading the entire payload to my app server? You may do upload to s3 in background from your controller and return the redirect response (301?) point to an URL which will return the status of upload request.

like image 146
skadya Avatar answered Sep 21 '22 17:09

skadya


This just isn’t how HTTP works, HTTP has no mechanism to halt a file upload other than closing the connection, but if you close the connection you cant return the redirect information.
If you want the client to upload directly to S3, you will need to do it in two steps.
Have the client request the URL for the file transfer, then have them initiate the transfer with the desired URL.

like image 27
Magnus Avatar answered Sep 19 '22 17:09

Magnus