2016-06-21 9 views
1

Erstens, tut mir leid für den langen Titel.Rust AWS API-Gateway-Service-Proxy zu S3-Datei-Upload mit rohen https Anfrage

Ich habe ein API-Gateway eingerichtet, um als s3-Proxy zu fungieren, so dass ich Dateien hochladen kann, indem ich eine PUT-Anfrage an eine API-URL sende. Die API funktioniert gut (oder zumindest denke ich es), aber es scheint, dass ich Textdateien nur korrekt hochladen kann.

Für die hochgeladenen Textdateien (z. B. Content-Type = text/plain) sind die Größen der Dateien lokal identisch mit den Größen der Dateien, die in s3 bucket hochgeladen werden. ABER, das ist nicht der Fall für die Binärdateien (zB. Content-Type = application/pdf). Die Dateien in den s3-Buckets haben eine größere Größe. Wenn ich die Binärdateien von s3 herunterlade, kann ich sie nicht öffnen, sie sind beschädigt.

Hier wird der Rost-Code ist die Anfrage zu senden, ich bin mit hyper's http client:

match File::open(file.as_path()) { 
     Err(_) => Err("Failed to open file".to_owned()), 
     Ok(mut openned_file) => { 
      let file_mime = mime_guess::guess_mime_type(file.as_path()); 
      let connector = HttpsConnector::new(OpensslClient::default()); 
      let url_str = format!("https://my.api.com/upload/{}", 
           file.file_name().unwrap().to_str().unwrap()); 
      let mut client = 
       Request::with_connector(Method::Put, Url::parse(&url_str).unwrap(), &connector) 
        .unwrap(); 
      client.headers_mut().set(ContentType(file_mime.clone())); 
      // client.headers_mut().set(ContentLength(openned_file.metadata().unwrap().len())); 
      let file_mime_str = file_mime.to_string(); 
      let mut buffer: [u8; 4096] = [0; 4096]; 
      let mut uploaded: usize = 0; 
      let request = match file_mime { 
       Mime(TopLevel::Text, _, _) | 
       Mime(TopLevel::Application, SubLevel::Javascript, _) => { 
        let mut request = client.start().unwrap(); 
        println!("Uploading text ...",); 
        while let Ok(read_count) = openned_file.read(&mut buffer) { 
         if read_count > 0 { 
          println!("Uploading {} bytes", read_count); 
          request.write_all(&buffer[0..read_count]); 
          uploaded += read_count; 
         } else { 
          request.flush(); 
          println!("File mime: {}", file_mime_str); 
          println!("File size: {}, Total uploaded: {}", 
            openned_file.metadata().unwrap().len(), 
            uploaded); 
          break; 
         } 
        } 
        request 
       } 
       _ => { 
        // client.headers_mut() 
        //  .set_raw("Content-Encoding", vec![b"base64".to_vec()]); 
        let mut request = client.start().unwrap(); 

        let mut config = MIME; 
        config.line_length = None; 
        println!("Uploading binary ...",); 
        while let Ok(read_count) = openned_file.read(&mut buffer) { 
         if read_count > 0 { 
          println!("Uploading {} bytes", read_count); 
          request.write_all(&buffer[0..read_count]); 
          // let base64_str = buffer[0..read_count].to_base64(STANDARD); 
          // request.write_all(base64_str.into_bytes().as_slice()); 
          uploaded += read_count; 
         } else { 
          request.flush(); 
          println!("File mime: {}", file_mime_str); 
          println!("File size: {}, Total uploaded: {}", 
            openned_file.metadata().unwrap().len(), 
            uploaded); 
          break; 
         } 
        } 
        request 
       } 
      }; 

      match request.send() { 
       Err(err) => Err(format!("{}", err)), 
       Ok(mut response) => { 
        let mut rep_str = String::new(); 
        response.read_to_string(&mut rep_str); 
        Err(format!("{}", rep_str)) 
       } 
      } 

Wie Sie aus dem Kommentar gesetzt Code sehen können, ich das Content-Encoding = base64 und Codierung versucht haben, mit die Bytes, die aus der Datei zum Hochladen gelesen werden. Aber Content-Encoding = base64 scheint kein gültiger Kodierungstyp zu sein, den s3 akzeptiert. Ich konnte nicht vollständig hochladen (500: Interner Serverfehler, ich kann nicht einmal die Datei der falschen Größe auf S3 Eimer sehen), wenn ich die Inhaltscodierung einstelle. Aber Textdatei funktioniert perfekt.

Zum Vergleich:

Antwort

1

Leider zu diesem Zeitpunkt API-Gateway unterstützt keine binären Nutzlasten. Dies ist eine häufige Funktion, die in unserem Backlog enthalten ist, obwohl wir ein Veröffentlichungsdatum nicht kommentieren können. Wir werden sicher sein, diesen Beitrag zu aktualisieren, wenn das Feature veröffentlicht wurde.

Verwandte Themen