summaryrefslogtreecommitdiff
path: root/inc
diff options
context:
space:
mode:
authorBryan Ischo <bryan@ischo.com>2011-09-28 01:12:32 -0700
committerBryan Ischo <bryan@ischo.com>2011-09-28 01:12:32 -0700
commit5465b5523a323f239cfc0f724afc1f900e24fcc4 (patch)
treeca57bbcefa3d26dc1e5ff9912d531b1a08707170 /inc
parent73366b8e549386c6183c64e3b47b913849bcddcf (diff)
downloadceph-libs3-5465b5523a323f239cfc0f724afc1f900e24fcc4.tar.gz
Incorporated change from Yehuda Sadeh which allows runtime
customization of the S3 server to talk to, with additional small improvements, enhanced by me to support multiple S3 hosts in the same runtime.
Diffstat (limited to 'inc')
-rw-r--r--inc/libs3.h49
-rw-r--r--inc/request.h3
-rw-r--r--inc/util.h10
3 files changed, 49 insertions, 13 deletions
diff --git a/inc/libs3.h b/inc/libs3.h
index 8f06e31..baa200c 100644
--- a/inc/libs3.h
+++ b/inc/libs3.h
@@ -116,11 +116,14 @@ extern "C" {
************************************************************************** **/
/**
- * This is the hostname that all S3 requests will go through; virtual-host
- * style requests will prepend the bucket name to this host name, and
- * path-style requests will use this hostname directly
+ * S3_MAX_HOSTNAME_SIZE is the maximum size we allow for a host name
**/
-#define S3_HOSTNAME "s3.amazonaws.com"
+#define S3_MAX_HOSTNAME_SIZE 255
+
+/**
+ * This is the default hostname that is being used for the S3 requests
+ **/
+#define S3_DEFAULT_HOSTNAME "s3.amazonaws.com"
/**
@@ -194,7 +197,7 @@ extern "C" {
* query string
**/
#define S3_MAX_AUTHENTICATED_QUERY_STRING_SIZE \
- (sizeof("https://" S3_HOSTNAME "/") + (S3_MAX_KEY_SIZE * 3) + \
+ (sizeof("https:///") + S3_MAX_HOSTNAME_SIZE + (S3_MAX_KEY_SIZE * 3) + \
sizeof("?AWSAccessKeyId=") + 32 + sizeof("&Expires=") + 32 + \
sizeof("&Signature=") + 28 + 1)
@@ -636,6 +639,12 @@ typedef struct S3AclGrant
typedef struct S3BucketContext
{
/**
+ * The name of the host to connect to when making S3 requests. If set to
+ * NULL, the default S3 hostname passed in to S3_initialize will be used.
+ **/
+ const char *hostName;
+
+ /**
* The name of the bucket to use in the bucket context
**/
const char *bucketName;
@@ -1145,13 +1154,20 @@ typedef struct S3GetObjectHandler
* all necessary initialization; however, be warned that things may
* break if your application re-initializes the dependent libraries
* later.
+ * @param defaultS3Hostname is a string the specifies the default S3 server
+ * hostname to use when making S3 requests; this value is used
+ * whenever the hostName of an S3BucketContext is NULL. If NULL is
+ * passed here then the default of S3_DEFAULT_HOSTNAME will be used.
* @return One of:
* S3StatusOK on success
+ * S3StatusUriTooLong if the defaultS3HostName is longer than
+ * S3_MAX_HOSTNAME_SIZE
* S3StatusInternalError if dependent libraries could not be
* initialized
* S3StatusOutOfMemory on failure due to out of memory
**/
-S3Status S3_initialize(const char *userAgentInfo, int flags);
+S3Status S3_initialize(const char *userAgentInfo, int flags,
+ const char *defaultS3HostName);
/**
@@ -1428,6 +1444,8 @@ S3Status S3_generate_authenticated_query_string
* buckets
* @param secretAccessKey gives the Amazon Secret Access Key for which to list
* owned buckets
+ * @param hostName is the S3 host name to use; if NULL is passed in, the
+ * default S3 host as provided to S3_initialize() will be used.
* @param requestContext if non-NULL, gives the S3RequestContext to add this
* request to, and does not perform the request immediately. If NULL,
* performs the request immediately and synchronously.
@@ -1437,7 +1455,7 @@ S3Status S3_generate_authenticated_query_string
* all callbacks for this request
**/
void S3_list_service(S3Protocol protocol, const char *accessKeyId,
- const char *secretAccessKey,
+ const char *secretAccessKey, const char *hostName,
S3RequestContext *requestContext,
const S3ListServiceHandler *handler,
void *callbackData);
@@ -1457,6 +1475,8 @@ void S3_list_service(S3Protocol protocol, const char *accessKeyId,
* buckets
* @param secretAccessKey gives the Amazon Secret Access Key for which to list
* owned buckets
+ * @param hostName is the S3 host name to use; if NULL is passed in, the
+ * default S3 host as provided to S3_initialize() will be used.
* @param bucketName is the bucket name to test
* @param locationConstraintReturnSize gives the number of bytes in the
* locationConstraintReturn parameter
@@ -1477,7 +1497,8 @@ void S3_list_service(S3Protocol protocol, const char *accessKeyId,
**/
void S3_test_bucket(S3Protocol protocol, S3UriStyle uriStyle,
const char *accessKeyId, const char *secretAccessKey,
- const char *bucketName, int locationConstraintReturnSize,
+ const char *hostName, const char *bucketName,
+ int locationConstraintReturnSize,
char *locationConstraintReturn,
S3RequestContext *requestContext,
const S3ResponseHandler *handler, void *callbackData);
@@ -1491,6 +1512,8 @@ void S3_test_bucket(S3Protocol protocol, S3UriStyle uriStyle,
* buckets
* @param secretAccessKey gives the Amazon Secret Access Key for which to list
* owned buckets
+ * @param hostName is the S3 host name to use; if NULL is passed in, the
+ * default S3 host as provided to S3_initialize() will be used.
* @param bucketName is the name of the bucket to be created
* @param cannedAcl gives the "REST canned ACL" to use for the created bucket
* @param locationConstraint if non-NULL, gives the geographic location for
@@ -1504,8 +1527,9 @@ void S3_test_bucket(S3Protocol protocol, S3UriStyle uriStyle,
* all callbacks for this request
**/
void S3_create_bucket(S3Protocol protocol, const char *accessKeyId,
- const char *secretAccessKey, const char *bucketName,
- S3CannedAcl cannedAcl, const char *locationConstraint,
+ const char *secretAccessKey, const char *hostName,
+ const char *bucketName, S3CannedAcl cannedAcl,
+ const char *locationConstraint,
S3RequestContext *requestContext,
const S3ResponseHandler *handler, void *callbackData);
@@ -1520,6 +1544,8 @@ void S3_create_bucket(S3Protocol protocol, const char *accessKeyId,
* buckets
* @param secretAccessKey gives the Amazon Secret Access Key for which to list
* owned buckets
+ * @param hostName is the S3 host name to use; if NULL is passed in, the
+ * default S3 host as provided to S3_initialize() will be used.
* @param bucketName is the name of the bucket to be deleted
* @param requestContext if non-NULL, gives the S3RequestContext to add this
* request to, and does not perform the request immediately. If NULL,
@@ -1531,7 +1557,8 @@ void S3_create_bucket(S3Protocol protocol, const char *accessKeyId,
**/
void S3_delete_bucket(S3Protocol protocol, S3UriStyle uriStyle,
const char *accessKeyId, const char *secretAccessKey,
- const char *bucketName, S3RequestContext *requestContext,
+ const char *hostName, const char *bucketName,
+ S3RequestContext *requestContext,
const S3ResponseHandler *handler, void *callbackData);
diff --git a/inc/request.h b/inc/request.h
index afb4929..9e3a477 100644
--- a/inc/request.h
+++ b/inc/request.h
@@ -165,7 +165,8 @@ typedef struct Request
// ----------------------------------------------------------------------------
// Initialize the API
-S3Status request_api_initialize(const char *userAgentInfo, int flags);
+S3Status request_api_initialize(const char *userAgentInfo, int flags,
+ const char *hostName);
// Deinitialize the API
void request_api_deinitialize();
diff --git a/inc/util.h b/inc/util.h
index 94735a8..4138ca7 100644
--- a/inc/util.h
+++ b/inc/util.h
@@ -32,6 +32,14 @@
#include <stdint.h>
#include "libs3.h"
+// acl groups
+#define ACS_URL "http://acs.amazonaws.com/groups/"
+
+#define ACS_GROUP_ALL_USERS ACS_URL "global/AllUsers"
+#define ACS_GROUP_AWS_USERS ACS_URL "global/AuthenticatedUsers"
+#define ACS_GROUP_LOG_DELIVERY ACS_URL "s3/LogDelivery"
+
+
// Derived from S3 documentation
@@ -49,7 +57,7 @@
// https://s3.amazonaws.com/${BUCKET}/${KEY}?acl
// 255 is the maximum bucket length
#define MAX_URI_SIZE \
- ((sizeof("https://" S3_HOSTNAME "/") - 1) + 255 + 1 + \
+ ((sizeof("https:///") - 1) + S3_MAX_HOSTNAME_SIZE + 255 + 1 + \
MAX_URLENCODED_KEY_SIZE + (sizeof("?torrent" - 1)) + 1)
// Maximum size of a canonicalized resource