Giter Site home page Giter Site logo

minio / minio-java Goto Github PK

View Code? Open in Web Editor NEW
1.1K 40.0 476.0 11.23 MB

MinIO Client SDK for Java

Home Page: https://docs.min.io/docs/java-client-quickstart-guide.html

License: Apache License 2.0

Java 100.00%
libraries sdk minio-java client-sdk aws-s3 s3-bucket

minio-java's Introduction

MinIO Java SDK for Amazon S3 Compatible Cloud Storage Slack

MinIO Java SDK is Simple Storage Service (aka S3) client to perform bucket and object operations to any Amazon S3 compatible object storage service.

For a complete list of APIs and examples, please take a look at the Java Client API Reference documentation.

Minimum Requirements

Java 1.8 or above.

Maven usage

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.5.11</version>
</dependency>

Gradle usage

dependencies {
    implementation("io.minio:minio:8.5.11")
}

JAR download

The latest JAR can be downloaded from here

Quick Start Example - File Uploader

This example program connects to an object storage server, makes a bucket on the server and then uploads a file to the bucket.

You need three items in order to connect to an object storage server.

Parameters Description
Endpoint URL to S3 service.
Access Key Access key (aka user ID) of an account in the S3 service.
Secret Key Secret key (aka password) of an account in the S3 service.

This example uses MinIO server playground https://play.min.io. Feel free to use this service for test and development.

FileUploader.java

import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.UploadObjectArgs;
import io.minio.errors.MinioException;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

public class FileUploader {
  public static void main(String[] args)
      throws IOException, NoSuchAlgorithmException, InvalidKeyException {
    try {
      // Create a minioClient with the MinIO server playground, its access key and secret key.
      MinioClient minioClient =
          MinioClient.builder()
              .endpoint("https://play.min.io")
              .credentials("Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG")
              .build();

      // Make 'asiatrip' bucket if not exist.
      boolean found =
          minioClient.bucketExists(BucketExistsArgs.builder().bucket("asiatrip").build());
      if (!found) {
        // Make a new bucket called 'asiatrip'.
        minioClient.makeBucket(MakeBucketArgs.builder().bucket("asiatrip").build());
      } else {
        System.out.println("Bucket 'asiatrip' already exists.");
      }

      // Upload '/home/user/Photos/asiaphotos.zip' as object name 'asiaphotos-2015.zip' to bucket
      // 'asiatrip'.
      minioClient.uploadObject(
          UploadObjectArgs.builder()
              .bucket("asiatrip")
              .object("asiaphotos-2015.zip")
              .filename("/home/user/Photos/asiaphotos.zip")
              .build());
      System.out.println(
          "'/home/user/Photos/asiaphotos.zip' is successfully uploaded as "
              + "object 'asiaphotos-2015.zip' to bucket 'asiatrip'.");
    } catch (MinioException e) {
      System.out.println("Error occurred: " + e);
      System.out.println("HTTP trace: " + e.httpTrace());
    }
  }
}

Compile FileUploader

$ javac -cp minio-8.5.11-all.jar FileUploader.java

Run FileUploader

$ java -cp minio-8.5.11-all.jar:. FileUploader
'/home/user/Photos/asiaphotos.zip' is successfully uploaded as object 'asiaphotos-2015.zip' to bucket 'asiatrip'.

$ mc ls play/asiatrip/
[2016-06-02 18:10:29 PDT]  82KiB asiaphotos-2015.zip

More References

Explore Further

Contribute

Please refer Contributors Guide

minio-java's People

Contributors

aarushiarya avatar abperiasamy avatar anjalshireesh avatar balamurugana avatar benjamin3322 avatar bigustad avatar butterflyzh avatar christopher-fredregill avatar deekoder avatar donatello avatar dormanze avatar ebozduman avatar emkas avatar fkautz avatar harshavardhana avatar inuyasha82 avatar jgolda avatar kannappanr avatar kevinsmile avatar koolhead17 avatar krishnasrinivas avatar minio-trusted avatar murphywill avatar nitisht avatar nl5887 avatar poornas avatar praveenrajmani avatar sinhaashish avatar tobias- avatar vadmeste avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

minio-java's Issues

listAllIncompleteUploads seems to be a public method - minor change

scala> client.
asInstanceOf               bucketExists               disableLogging             dropAllIncompleteUploads   dropIncompleteUpload
enableLogging              getBucketACL               getObject                  getUrl                     isInstanceOf
listAllIncompleteUploads   listBuckets                listObjects                makeBucket                 putObject
removeBucket               removeObject               setBucketACL               setKeys                    setUserAgent
statObject                 toString

unauthenticated makeBucket() should result in ForbiddenException instead results in MalformedXML with s3

scala> client.makeBucket("ddd1")
Please open an issue with this bug at http://github.com/minio/minio-java
<?xml version="1.0"?><Error xmlns=""><Code>MalformedXML</Code><HostId>yoXauD7Q7qUTnpUCI2jCOYDOFzcgoJi/kHR+sINDps+usCZmArvD1vCYvJy3w8V9</HostId><Message>The XML you provided was not well-formed or did not validate against our published schema</Message><RequestId>BA31721C82F678BD</RequestId></Error>
io.minio.client.errors.InternalClientException

Support using a signing key

Signing keys are a scoped and time limited alternative to using access and private keys. Add support for using signing keys.

Add get object with offset specifier

It is useful for the user to be able to say getObject(bucket, key, offset). Currently, the user must specify the offset and length getObject(bucket, key, offset, length).

Setting content type to null results in a NPE

java.lang.NullPointerException
    at io.minio.client.Client.putObject(Client.java:1287)
    at io.minio.client.Client.putObject(Client.java:1269)
    at io.minio.client.Client.putObject(Client.java:937)
    at io.minio.integration.SimpleTests.putObject(SimpleTests.java:115)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)

get object range should not return full object

        InputStream smallobject = client.getObject(bucket, "smallobject", 0, 5);
        byte[] bytes = streamToByteArray(smallobject);
        Assert.assertEquals("hello", new String(bytes, "UTF-8"));

Expected: hello
Actual: hello world

Signature does not match for object names with "++" in them since okhttp transform them as "%20" space characters,

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>AKIAJVA5BMMU2RHO6IOQ</AWSAccessKeyId><StringToSign>AWS4-HMAC-SHA256
20150813T091515Z
20150813/us-east-1/s3/aws4_request
31d1896fde46001375ea1dfe5bf6f046515937b4e2767fd937d72a180ba4f0a2</StringToSign><SignatureProvided>a624147ba4b705fe5de4d584036a17cf0687453993618ca92fed68f74b34097c</SignatureProvided><StringToSignBytes>41 57 53 34 2d 48 4d 41 43 2d 53 48 41 32 35 36 0a 32 30 31 35 30 38 31 33 54 30 39 31 35 31 35 5a 0a 32 30 31 35 30 38 31 33 2f 75 73 2d 65 61 73 74 2d 31 2f 73 33 2f 61 77 73 34 5f 72 65 71 75 65 73 74 0a 33 31 64 31 38 39 36 66 64 65 34 36 30 30 31 33 37 35 65 61 31 64 66 65 35 62 66 36 66 30 34 36 35 31 35 39 33 37 62 34 65 32 37 36 37 66 64 39 33 37 64 37 32 61 31 38 30 62 61 34 66 30 61 32</StringToSignBytes><CanonicalRequest>POST
/ferenginar/my%20%201
uploads=
host:s3.amazonaws.com
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-amz-date:20150813T091515Z

host;x-amz-content-sha256;x-amz-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855</CanonicalRequest><CanonicalRequestBytes>50 4f 53 54 0a 2f 66 65 72 65 6e 67 69 6e 61 72 2f 6d 79 25 32 30 25 32 30 31 0a 75 70 6c 6f 61 64 73 3d 0a 68 6f 73 74 3a 73 33 2e 61 6d 61 7a 6f 6e 61 77 73 2e 63 6f 6d 0a 78 2d 61 6d 7a 2d 63 6f 6e 74 65 6e 74 2d 73 68 61 32 35 36 3a 65 33 62 30 63 34 34 32 39 38 66 63 31 63 31 34 39 61 66 62 66 34 63 38 39 39 36 66 62 39 32 34 32 37 61 65 34 31 65 34 36 34 39 62 39 33 34 63 61 34 39 35 39 39 31 62 37 38 35 32 62 38 35 35 0a 78 2d 61 6d 7a 2d 64 61 74 65 3a 32 30 31 35 30 38 31 33 54 30 39 31 35 31 35 5a 0a 0a 68 6f 73 74 3b 78 2d 61 6d 7a 2d 63 6f 6e 74 65 6e 74 2d 73 68 61 32 35 36 3b 78 2d 61 6d 7a 2d 64 61 74 65 0a 65 33 62 30 63 34 34 32 39 38 66 63 31 63 31 34 39 61 66 62 66 34 63 38 39 39 36 66 62 39 32 34 32 37 61 65 34 31 65 34 36 34 39 62 39 33 34 63 61 34 39 35 39 39 31 62 37 38 35 32 62 38 35 35</CanonicalRequestBytes><RequestId>F106B117F1E5A1C6</RequestId><HostId>Evn0xYo8BxtGX6xFh9+RByNt3CgeZ9J0Cx2oWiBdqdNgYQpCoBynpgUCfQsMNYqy8SM0e2DXQ5k=</HostId></Error>
Exception in thread "main" io.minio.errors.AccessDeniedException
    at io.minio.MinioClient.parseError(MinioClient.java:296)
    at io.minio.MinioClient.newMultipartUpload(MinioClient.java:1266)
    at io.minio.MinioClient.putObject(MinioClient.java:1055)
    at PutObject.main(PutObject.java:36)

Missing usage of Content-Type in putObject

https://github.com/minio/minio-java/blob/master/src/main/java/io/minio/MinioClient.java#L1155

  private void putObject(String bucketName, String objectName, String contentType, byte[] data, byte[] md5sum)
    throws InvalidBucketNameException, NoResponseException, IOException, XmlPullParserException,
           ErrorResponseException, InternalException {
    putObject(bucketName, objectName, contentType, data, md5sum, "", 0);
  }


  private String putObject(String bucketName, String objectName, String contentType, byte[] data, byte[] md5sum,
                           String uploadId, int partId)
    throws InvalidBucketNameException, NoResponseException, IOException, XmlPullParserException,
           ErrorResponseException, InternalException {
    Map<String,String> headerMap = new HashMap<String,String>();
    headerMap.put("Content-MD5", BaseEncoding.base64().encode(md5sum));

    Map<String,String> queryParamMap = null;
    if (partId > 0 && uploadId != null && !"".equals(uploadId.trim())) {
      queryParamMap = new HashMap<String,String>();
      queryParamMap.put("partNumber", Integer.toString(partId));
      queryParamMap.put("uploadId", uploadId);
    }

    HttpResponse response = executePut(bucketName, objectName, data, headerMap, queryParamMap);
    return response.header().getEtag();
  }

It is not used as part of HTTP header.

Another issue is that putObject of individual parts do not need contentType it is only needed during

      uploadId = newMultipartUpload(bucketName, objectName);

statObject tries to read error body - throws an invalid exception

HEAD request on an object has no body, it shouldn't try to read

./build/install/minio-java-examples/bin/stat-object
StatObject app
Exception in thread "main" java.io.EOFException: input contained no data
    at org.xmlpull.mxp1.MXParser.fillBuf(MXParser.java:3003)
    at org.xmlpull.mxp1.MXParser.more(MXParser.java:3046)
    at org.xmlpull.mxp1.MXParser.parseProlog(MXParser.java:1410)
    at org.xmlpull.mxp1.MXParser.nextImpl(MXParser.java:1395)
    at org.xmlpull.mxp1.MXParser.next(MXParser.java:1093)
    at com.google.api.client.xml.Xml.parseElementInternal(Xml.java:245)
    at com.google.api.client.xml.Xml.parseElement(Xml.java:222)
    at io.minio.MinioClient.parseXml(MinioClient.java:376)
    at io.minio.MinioClient.parseError(MinioClient.java:301)
    at io.minio.MinioClient.statObject(MinioClient.java:230)
    at io.minio.examples.StatObject.main(StatObject.java:34)

Error handling is badly written - rewrite it.

Current error handling puts all the error messages into an gigantic "parseError()" function.

The problem comes when solely on the basis of "statusCode" one constructs an exception - for example RemoveBucket.

$ javac -cp 'minio-0.2.6-all.jar' RemoveBucket.java
$ java -cp '.:minio-0.2.6-all.jar' RemoveBucket
RemoveBucket app
Exception in thread "main" io.minio.errors.AccessDeniedException
    at io.minio.MinioClient.parseError(MinioClient.java:301)
    at io.minio.MinioClient.removeBucket(MinioClient.java:952)
    at RemoveBucket.main(RemoveBucket.java:31)

Should throw BucketNotEmptyException but instead throws AccessDeniedException. This is perhaps the result of writing code in this way

     } else if (statusCode == 501 || statusCode == 405) {
     errorResponse.setCode("MethodNotAllowed");
     e = new MethodNotAllowedException();
     } else {
       errorResponse.setCode("AccessDenied");
        e = new AccessDeniedException();

EOFException on listBuckets() when request sent to s3.amazonaws.com without access keys

Listbuckets() operation should handle this with appropriate error.

scala> client.listBuckets()
java.io.EOFException: input contained no data
    at org.xmlpull.mxp1.MXParser.fillBuf(MXParser.java:3003)
    at org.xmlpull.mxp1.MXParser.more(MXParser.java:3046)
    at org.xmlpull.mxp1.MXParser.parseProlog(MXParser.java:1410)
    at org.xmlpull.mxp1.MXParser.nextImpl(MXParser.java:1395)
    at org.xmlpull.mxp1.MXParser.next(MXParser.java:1093)
    at com.google.api.client.xml.Xml.parseElementInternal(Xml.java:245)
    at com.google.api.client.xml.Xml.parseElement(Xml.java:222)
    at io.minio.client.Client.parseXml(Client.java:312)
    at io.minio.client.Client.parseError(Client.java:267)
    at io.minio.client.Client.listBuckets(Client.java:651)
    at .<init>(<console>:10)
    at .<clinit>(<console>)
    at .<init>(<console>:7)
    at .<clinit>(<console>)
    at $print(<console>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:734)
    at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:983)
    at scala.tools.nsc.interpreter.IMain.loadAndRunReq$1(IMain.scala:573)
    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:604)
    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:568)
    at scala.tools.nsc.interpreter.ILoop.reallyInterpret$1(ILoop.scala:760)
    at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:805)
    at scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:717)
    at scala.tools.nsc.interpreter.ILoop.processLine$1(ILoop.scala:581)
    at scala.tools.nsc.interpreter.ILoop.innerLoop$1(ILoop.scala:588)
    at scala.tools.nsc.interpreter.ILoop.loop(ILoop.scala:591)
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply$mcZ$sp(ILoop.scala:882)
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:837)
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:837)
    at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135)
    at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:837)
    at scala.tools.nsc.interpreter.ILoop.main(ILoop.scala:904)
    at xsbt.ConsoleInterface.run(ConsoleInterface.scala:62)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:101)
    at sbt.compiler.AnalyzingCompiler.console(AnalyzingCompiler.scala:76)
    at sbt.Console.sbt$Console$$console0$1(Console.scala:22)
    at sbt.Console$$anonfun$apply$2$$anonfun$apply$1.apply$mcV$sp(Console.scala:23)
    at sbt.Console$$anonfun$apply$2$$anonfun$apply$1.apply(Console.scala:23)
    at sbt.Console$$anonfun$apply$2$$anonfun$apply$1.apply(Console.scala:23)
    at sbt.Logger$$anon$4.apply(Logger.scala:85)
    at sbt.TrapExit$App.run(TrapExit.scala:248)
    at java.lang.Thread.run(Thread.java:745)


scala>

NPE when no buckets are available un-authenticated requests to localhost:9000

No buckets available on the server.

scala> client.listBuckets()
java.lang.NullPointerException
    at io.minio.client.Client.listBuckets(Client.java:649)
    at .<init>(<console>:10)
    at .<clinit>(<console>)
    at .<init>(<console>:7)
    at .<clinit>(<console>)
    at $print(<console>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:734)
    at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:983)
    at scala.tools.nsc.interpreter.IMain.loadAndRunReq$1(IMain.scala:573)
    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:604)
    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:568)
    at scala.tools.nsc.interpreter.ILoop.reallyInterpret$1(ILoop.scala:760)
    at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:805)
    at scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:717)
    at scala.tools.nsc.interpreter.ILoop.processLine$1(ILoop.scala:581)
    at scala.tools.nsc.interpreter.ILoop.innerLoop$1(ILoop.scala:588)
    at scala.tools.nsc.interpreter.ILoop.loop(ILoop.scala:591)
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply$mcZ$sp(ILoop.scala:882)
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:837)
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:837)
    at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135)
    at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:837)
    at scala.tools.nsc.interpreter.ILoop.main(ILoop.scala:904)
    at xsbt.ConsoleInterface.run(ConsoleInterface.scala:62)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:101)
    at sbt.compiler.AnalyzingCompiler.console(AnalyzingCompiler.scala:76)
    at sbt.Console.sbt$Console$$console0$1(Console.scala:22)
    at sbt.Console$$anonfun$apply$2$$anonfun$apply$1.apply$mcV$sp(Console.scala:23)
    at sbt.Console$$anonfun$apply$2$$anonfun$apply$1.apply(Console.scala:23)
    at sbt.Console$$anonfun$apply$2$$anonfun$apply$1.apply(Console.scala:23)
    at sbt.Logger$$anon$4.apply(Logger.scala:85)
    at sbt.TrapExit$App.run(TrapExit.scala:248)
    at java.lang.Thread.run(Thread.java:745)


scala>

convert minio-java to a stateless library

Convert the APIs to follow this style:

        config := minio.Config{
                AccessKeyID:     "YOUR-ACCESS-KEY-HERE",
                SecretAccessKey: "YOUR-PASSWORD-HERE",
        }

        // Default is Signature Version 4. To enable Signature Version 2 do the following.
        // config.Signature = minio.SignatureV2

        reader, stat, err := minio.GetObject(config, "https://s3.amazonaws.com/bucket/object") {
        if err != nil {
                log.Fatalln(err)
        }  

Errors should be more meaningful

At the moment, we throw IOException. We should throw more meaningful exceptions based on the type of error that occurred in addition to IOException.

All arguments for all functions should have native types

For example in Golang in PresignedGetObject

func (a API) PresignedGetObject(bucket, object string, expires time.Duration) (string, error) {

Expires argument is time.Duration which is a native type under Golang ecosystem, we should make sure that wherever possible we should take native types.

AuthorizationHeaderMalformed: the region is wrong when using MinioClient to query local minio

I have setup a minio instance on my machine, running in a docker container through the Docker minio image. I tried to add and list buckets from mc, with no issue.

Anyway, when I try to list the buckets with a library call, I get the following error:

Please open an issue with this bug at http://github.com/minio/minio-java
<?xml version="1.0"?><Error xmlns="">     <Code>AuthorizationHeaderMalformed</Code>
<HostId>3L137</HostId>
<Message>The authorization header is malformed; the region is wrong; expecting 'milkyway'.</Message>
<RequestId>3L137</RequestId>
<Resource>/</Resource>
</Error>
io.minio.errors.InternalClientException
    at io.minio.MinioClient.parseError(MinioClient.java:356)
    at io.minio.MinioClient.listBuckets(MinioClient.java:820)
        ....

I just started playing around with minio today, so I don't know if this is a bug in the library or some error from my side (more likely). I don't see any way to set the region minio is expecting on the request header manually.
This is the code causing the exception:

...
MinioClient minioClient = new MinioClient(address, accessKey, secretKey);
minioClient.listBuckets().forEachRemaining(bucket ->  logger.debug(bucket.getName()));
...

Bucket already exists is not handled by parse error

Please open an issue with this bug at http://github.com/minio/minio-java

<?xml version="1.0"?><Error xmlns=""><Code>BucketAlreadyOwnedByYou</Code><HostId>t5EtCTVqRI0TxU3I78pDYAGNAyJcYrlfArSAdPU9O8DTAs3EX/bif+s3dEkO6NGr4MAjIZu0iFo=</HostId><Message>Your previous request to create the named bucket succeeded and you already own it.</Message><RequestId>D7ED5F81E5619970</RequestId><BucketName>java-goroutine</BucketName></Error>
io.minio.client.errors.InternalClientException
    at io.minio.client.Client.parseError(Client.java:285)
    at io.minio.client.Client.makeBucket(Client.java:759)
    at io.minio.client.Client.makeBucket(Client.java:711)
    at io.minio.integration.SimpleTests.makeBucket(SimpleTests.java:65)

Listbuckets signature mismatch with localhost:9000

Checking what could be the issue..

scala> client.listBuckets()
Please open an issue with this bug at http://github.com/minio/minio-java
<?xml version="1.0"?><Error xmlns=""><Code>SignatureDoesNotMatch</Code><HostId>3L137</HostId><Message>The request signature we calculated does not match the signature you provided.</Message><RequestId>3L137</RequestId><Resource>/</Resource></Error>
io.minio.client.errors.InternalClientException
    at io.minio.client.Client.parseError(Client.java:284)
    at io.minio.client.Client.listBuckets(Client.java:650)
    at .<init>(<console>:10)
    at .<clinit>(<console>)
    at .<init>(<console>:7)
    at .<clinit>(<console>)
    at $print(<console>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:734)
    at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:983)
    at scala.tools.nsc.interpreter.IMain.loadAndRunReq$1(IMain.scala:573)
    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:604)
    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:568)
    at scala.tools.nsc.interpreter.ILoop.reallyInterpret$1(ILoop.scala:760)
    at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:805)
    at scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:717)
    at scala.tools.nsc.interpreter.ILoop.processLine$1(ILoop.scala:581)
    at scala.tools.nsc.interpreter.ILoop.innerLoop$1(ILoop.scala:588)
    at scala.tools.nsc.interpreter.ILoop.loop(ILoop.scala:591)
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply$mcZ$sp(ILoop.scala:882)
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:837)
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:837)
    at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135)
    at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:837)
    at scala.tools.nsc.interpreter.ILoop.main(ILoop.scala:904)
    at xsbt.ConsoleInterface.run(ConsoleInterface.scala:62)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:101)
    at sbt.compiler.AnalyzingCompiler.console(AnalyzingCompiler.scala:76)
    at sbt.Console.sbt$Console$$console0$1(Console.scala:22)
    at sbt.Console$$anonfun$apply$2$$anonfun$apply$1.apply$mcV$sp(Console.scala:23)
    at sbt.Console$$anonfun$apply$2$$anonfun$apply$1.apply(Console.scala:23)
    at sbt.Console$$anonfun$apply$2$$anonfun$apply$1.apply(Console.scala:23)
    at sbt.Logger$$anon$4.apply(Logger.scala:85)
    at sbt.TrapExit$App.run(TrapExit.scala:248)
    at java.lang.Thread.run(Thread.java:745)


scala> 

Perhaps should handle 501 as well, since that is reply minio server sends back for a DELETE() request

scala> client.removeBucket("testbucket")
Please open an issue with this bug at http://github.com/minio/minio-java
Unsuccessful response from server without XML error: 501
io.minio.client.errors.InternalClientException
    at io.minio.client.Client.parseError(Client.java:267)
    at io.minio.client.Client.removeBucket(Client.java:816)
    at .<init>(<console>:12)
    at .<clinit>(<console>)
    at .<init>(<console>:7)
    at .<clinit>(<console>)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.