Using a User-Defined Domain Name to Access OBS (SDK for C)

If you have any questions during development, post them on the Issues page of GitHub.
To access OBS through a user-defined domain name, you need to first configure a domain name on the Console.
Configuring a User-Defined Domain Name
To enable access to an OBS bucket through a user-defined domain name, you need to first associate the user-defined domain name with the domain name of the bucket.User-Defined Domain Name Introduction and User-Defined Domain Name Configuration.

If a user-defined domain name is configured as an acceleration domain name with CDN, you need to enable it to access OBS by configuring settings on CDN console.
The example shows how to configure the user-defined domain name with CDN on Huawei Cloud.
- Log in to the Huawei Cloud CDN console and select Domains from the navigation pane on the left. You can view all configured CDN domain names.
- Configure the origin server. Click the user-defined domain name to be used to go to the configuration page. Modify the origin server. Set Type of Primary Origin Server to Domain name, and set Origin Server to the domain name of the OBS bucket to be accessed.
- Set the retrieval host to the acceleration domain name, that is, your user-defined domain name. Otherwise, the retrieval authentication may fail.
When using a user-defined domain name to access OBS, you can call APIs as you normally do, except that you need to configure option as shown below:
option.bucket_options.useCname = true; option.bucket_options.host_name = "yourCustomDomain";
Code Examples: Uploading an Object Using a Custom Domain Name
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
#include "eSDKOBS.h" #include <stdio.h> #include <sys/stat.h> // The response callback function. The content of properties in the callback can be recorded in callback_data (custom callback data). obs_status response_properties_callback(const obs_response_properties *properties, void *callback_data); int put_file_data_callback(int buffer_size, char *buffer, void *callback_data); void put_file_complete_callback(obs_status status, const obs_error_details *error, void *callback_data); typedef struct put_file_object_callback_data { FILE *infile; uint64_t content_length; obs_status ret_status; } put_file_object_callback_data; uint64_t open_file_and_get_length(char *localfile, put_file_object_callback_data *data); int main() { // The following code shows how to use the put_object function to upload a local file when a custom domain name is used: // Call the obs_initialize method at the program entry to initialize global resources such as the network and memory. obs_initialize(OBS_INIT_ALL); obs_options options; // Create and initialize options, including the access domain name (host_name), access keys (access_key_id and access_key_secret), bucket name (bucket_name), and bucket storage class (storage_class). init_obs_options(&options); // Enter the endpoint corresponding to the bucket for host_name. CN-Hong Kong is used here as an example. Replace it with the one in your actual situation. options.bucket_options.host_name = "obs.ap-southeast-1.myhuaweicloud.com"; // Hard-coded or plaintext AK and SK are risky. For security purposes, encrypt your AK and SK and store them in the configuration file or environment variables. // In this example, the AK and SK are stored in environment variables for identity authentication. Before running the code in this example, configure local environment variables ACCESS_KEY_ID and SECRET_ACCESS_KEY. options.bucket_options.access_key = getenv("ACCESS_KEY_ID"); options.bucket_options.secret_access_key = getenv("SECRET_ACCESS_KEY"); char * bucketName = ""; options.bucket_options.bucket_name = bucketName; // Set the custom domain name. options.bucket_options.useCname = true; options.bucket_options.host_name = "example.obs.test.cname.com"; // Initialize the properties of the object to be uploaded. obs_put_properties put_properties; init_put_properties(&put_properties); // Name of the object to be uploaded char *key = "example_get_file_test"; // Uploaded file char file_name[256] = "./example_local_file_test.txt"; uint64_t content_length = 0; // Initialize the structure for storing the uploaded data. put_file_object_callback_data data; memset(&data, 0, sizeof(put_file_object_callback_data)); // Open the file and obtain the file length. content_length = open_file_and_get_length(file_name, &data); // Set the callback function. obs_put_object_handler putobjectHandler = { { &response_properties_callback, &put_file_complete_callback }, &put_file_data_callback }; put_object(&options, key, content_length, &put_properties, 0, &putobjectHandler, &data); if (OBS_STATUS_OK == data.ret_status) { printf("put object from file successfully. \n"); } else { printf("put object failed(%s).\n", obs_get_status_name(data.ret_status)); } if (data.infile != NULL) { fclose(data.infile); } // Release the allocated global resources. obs_deinitialize(); } // The response callback function. The content of properties in the callback can be recorded in callback_data (custom callback data). obs_status response_properties_callback(const obs_response_properties *properties, void *callback_data) { if (properties == NULL) { printf("error! obs_response_properties is null!"); if (callback_data != NULL) { obs_sever_callback_data *data = (obs_sever_callback_data *)callback_data; printf("server_callback buf is %s, len is %llu", data->buffer, data->buffer_len); return OBS_STATUS_OK; } else { printf("error! obs_sever_callback_data is null!"); return OBS_STATUS_OK; } } // Print the response. #define print_nonnull(name, field) \ do { \ if (properties-> field) { \ printf("%s: %s\n", name, properties->field); \ } \ } while (0) print_nonnull("request_id", request_id); print_nonnull("request_id2", request_id2); print_nonnull("content_type", content_type); if (properties->content_length) { printf("content_length: %llu\n", properties->content_length); } print_nonnull("server", server); print_nonnull("ETag", etag); print_nonnull("expiration", expiration); print_nonnull("website_redirect_location", website_redirect_location); print_nonnull("version_id", version_id); print_nonnull("allow_origin", allow_origin); print_nonnull("allow_headers", allow_headers); print_nonnull("max_age", max_age); print_nonnull("allow_methods", allow_methods); print_nonnull("expose_headers", expose_headers); print_nonnull("storage_class", storage_class); print_nonnull("server_side_encryption", server_side_encryption); print_nonnull("kms_key_id", kms_key_id); print_nonnull("customer_algorithm", customer_algorithm); print_nonnull("customer_key_md5", customer_key_md5); print_nonnull("bucket_location", bucket_location); print_nonnull("obs_version", obs_version); print_nonnull("restore", restore); print_nonnull("obs_object_type", obs_object_type); print_nonnull("obs_next_append_position", obs_next_append_position); print_nonnull("obs_head_epid", obs_head_epid); print_nonnull("reserved_indicator", reserved_indicator); int i; for (i = 0; i < properties->meta_data_count; i++) { printf("x-obs-meta-%s: %s\n", properties->meta_data[i].name, properties->meta_data[i].value); } return OBS_STATUS_OK; } int put_file_data_callback(int buffer_size, char *buffer, void *callback_data) { put_file_object_callback_data *data = (put_file_object_callback_data *)callback_data; int ret = 0; if (data->content_length) { int toRead = ((data->content_length > (unsigned)buffer_size) ? (unsigned)buffer_size : data->content_length); ret = fread(buffer, 1, toRead, data->infile); } uint64_t originalContentLength = data->content_length; data->content_length -= ret; if (data->content_length) { printf("%llu bytes remaining ", (unsigned long long)data->content_length); printf("(%d%% complete) ...\n", (int)(((originalContentLength - data->content_length) * 100) / originalContentLength)); } return ret; } void put_file_complete_callback(obs_status status, const obs_error_details *error, void *callback_data) { put_file_object_callback_data *data = (put_file_object_callback_data *)callback_data; data->ret_status = status; } uint64_t open_file_and_get_length(char *localfile, put_file_object_callback_data *data) { uint64_t content_length = 0; const char *body = 0; if (!content_length) { struct stat statbuf; if (stat(localfile, &statbuf) == -1) { fprintf(stderr, "\nERROR: Failed to stat file %s: ", localfile); return 0; } content_length = statbuf.st_size; } if (!(data->infile = fopen(localfile, "rb"))) { fprintf(stderr, "\nERROR: Failed to open input file %s: ", localfile); return 0; } data->content_length = content_length; return content_length; } |
Code Examples: Downloading an Object Using a Custom Domain Name
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
#include "eSDKOBS.h" #include <stdio.h> #include <sys/stat.h> // The response callback function. The content of properties in the callback can be recorded in callback_data (custom callback data). obs_status response_properties_callback(const obs_response_properties *properties, void *callback_data); obs_status get_object_data_callback(int buffer_size, const char *buffer, void *callback_data); void get_object_complete_callback(obs_status status, const obs_error_details *error, void *callback_data); typedef struct get_object_callback_data { FILE *outfile; obs_status ret_status; }get_object_callback_data; FILE * write_to_file(char *localfile); int main() { // The following code shows how to use the get_object function to download an object to a local file when a custom domain name is used: // Call the obs_initialize method at the program entry to initialize global resources such as the network and memory. obs_initialize(OBS_INIT_ALL); obs_options options; // Create and initialize options, including the access domain name (host_name), access keys (access_key_id and access_key_secret), bucket name (bucket_name), and bucket storage class (storage_class). init_obs_options(&options); // Enter the endpoint corresponding to the bucket for host_name. CN-Hong Kong is used here as an example. Replace it with the one in your actual situation. options.bucket_options.host_name = "obs.ap-southeast-1.myhuaweicloud.com"; // Hard-coded or plaintext AK and SK are risky. For security purposes, encrypt your AK and SK and store them in the configuration file or environment variables. // In this example, the AK and SK are stored in environment variables for identity authentication. Before running the code in this example, configure local environment variables ACCESS_KEY_ID and SECRET_ACCESS_KEY. options.bucket_options.access_key = getenv("ACCESS_KEY_ID"); options.bucket_options.secret_access_key = getenv("SECRET_ACCESS_KEY"); char * bucketName = ""; options.bucket_options.bucket_name = bucketName; // Set a custom domain name. options.bucket_options.useCname = true; options.bucket_options.host_name = "example.obs.test.cname.com"; // Set the name of the local file to which the object is downloaded. char *file_name = "./example_get_file_test"; obs_object_info object_info; // Set the object to be downloaded. memset(&object_info, 0, sizeof(obs_object_info)); object_info.key = "example_get_file_test"; object_info.version_id = NULL; //Set the structure for storing the downloaded object data based on service requirements. get_object_callback_data data; data.ret_status = OBS_STATUS_BUTT; data.outfile = write_to_file(file_name); // Define parameters for range-based download. obs_get_conditions getcondition; memset(&getcondition, 0, sizeof(obs_get_conditions)); init_get_properties(&getcondition); // Download start position. The default value is 0, indicating that the download starts from byte 0. getcondition.start_byte = 0; // Download length. The default value is 0, indicating that the object is downloaded until the end. // getcondition.byte_count = 0; // Define the download callback function. obs_get_object_handler get_object_handler = { { &response_properties_callback, &get_object_complete_callback}, &get_object_data_callback }; get_object(&options, &object_info, &getcondition, 0, &get_object_handler, &data); if (OBS_STATUS_OK == data.ret_status) { printf("get object successfully. \n"); } else { printf("get object failed(%s).\n", obs_get_status_name(data.ret_status)); } fclose(data.outfile); // Release the allocated global resources. obs_deinitialize(); } // The response callback function. The content of properties in the callback can be recorded in callback_data (custom callback data). obs_status response_properties_callback(const obs_response_properties *properties, void *callback_data) { if (properties == NULL) { printf("error! obs_response_properties is null!"); if (callback_data != NULL) { obs_sever_callback_data *data = (obs_sever_callback_data *)callback_data; printf("server_callback buf is %s, len is %llu", data->buffer, data->buffer_len); return OBS_STATUS_OK; } else { printf("error! obs_sever_callback_data is null!"); return OBS_STATUS_OK; } } // Print the response. #define print_nonnull(name, field) \ do { \ if (properties-> field) { \ printf("%s: %s\n", name, properties->field); \ } \ } while (0) print_nonnull("request_id", request_id); print_nonnull("request_id2", request_id2); print_nonnull("content_type", content_type); if (properties->content_length) { printf("content_length: %llu\n", properties->content_length); } print_nonnull("server", server); print_nonnull("ETag", etag); print_nonnull("expiration", expiration); print_nonnull("website_redirect_location", website_redirect_location); print_nonnull("version_id", version_id); print_nonnull("allow_origin", allow_origin); print_nonnull("allow_headers", allow_headers); print_nonnull("max_age", max_age); print_nonnull("allow_methods", allow_methods); print_nonnull("expose_headers", expose_headers); print_nonnull("storage_class", storage_class); print_nonnull("server_side_encryption", server_side_encryption); print_nonnull("kms_key_id", kms_key_id); print_nonnull("customer_algorithm", customer_algorithm); print_nonnull("customer_key_md5", customer_key_md5); print_nonnull("bucket_location", bucket_location); print_nonnull("obs_version", obs_version); print_nonnull("restore", restore); print_nonnull("obs_object_type", obs_object_type); print_nonnull("obs_next_append_position", obs_next_append_position); print_nonnull("obs_head_epid", obs_head_epid); print_nonnull("reserved_indicator", reserved_indicator); int i; for (i = 0; i < properties->meta_data_count; i++) { printf("x-obs-meta-%s: %s\n", properties->meta_data[i].name, properties->meta_data[i].value); } return OBS_STATUS_OK; } obs_status get_object_data_callback(int buffer_size, const char *buffer, void *callback_data) { get_object_callback_data *data = (get_object_callback_data *)callback_data; size_t wrote = fwrite(buffer, 1, buffer_size, data->outfile); return ((wrote < (size_t)buffer_size) ? OBS_STATUS_AbortedByCallback : OBS_STATUS_OK); } void get_object_complete_callback(obs_status status, const obs_error_details *error, void *callback_data) { get_object_callback_data *data = (get_object_callback_data *)callback_data; data->ret_status = status; } FILE * write_to_file(char *localfile) { FILE *outfile = 0; if (localfile) { struct stat buf; if (stat(localfile, &buf) == -1) { outfile = fopen(localfile, "wb"); } else { outfile = fopen(localfile, "a"); } if (!outfile) { fprintf(stderr, "\nERROR: Failed to open output file %s: ", localfile); return outfile; } } else { fprintf(stderr, "\nERROR: Failed to open output file, it's NULL, write object to stdout.", localfile); outfile = stdout; } return outfile; } |
Feedback
Was this page helpful?
Provide feedbackThank you very much for your feedback. We will continue working to improve the documentation.See the reply and handling status in My Cloud VOC.
For any further questions, feel free to contact us through the chatbot.
Chatbot