Hi Chengyu,
On 2025/9/4 13:33, ChengyuZhu6 wrote:
From: Chengyu Zhu <hudson...@tencent.com>
..
@@ -96,6 +142,14 @@ static int ocierofs_curl_setup_common_options(struct CURL
*curl)
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 120L);
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "ocierofs/" PACKAGE_VERSION);
+ curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "");
+ curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
+#if defined(CURLOPT_TCP_KEEPIDLE)
+ curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, 30L);
+#endif
+#if defined(CURLOPT_TCP_KEEPINTVL)
+ curl_easy_setopt(curl, CURLOPT_TCP_KEEPINTVL, 15L);
+#endif
return 0;
}
@@ -114,10 +168,10 @@ static int ocierofs_curl_setup_basic_auth(struct CURL *curl, const char *usernam
return 0;
}
-static int ocierofs_curl_clear_auth(struct CURL *curl)
+static int ocierofs_curl_clear_auth(struct ocierofs_ctx *ctx)
{
- curl_easy_setopt(curl, CURLOPT_USERPWD, NULL);
- curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_NONE);
+ curl_easy_setopt(ctx->curl, CURLOPT_USERPWD, NULL);
+ curl_easy_setopt(ctx->curl, CURLOPT_HTTPAUTH, CURLAUTH_NONE);
return 0;
}
@@ -176,20 +230,20 @@ static int ocierofs_curl_perform(struct CURL *curl, long *http_code_out)
return 0;
}
-static int ocierofs_request_perform(struct erofs_oci *oci,
- struct erofs_oci_request *req,
- struct erofs_oci_response *resp)
+static int ocierofs_request_perform(struct ocierofs_ctx *ctx,
+
...
@@ -204,15 +258,10 @@ static int ocierofs_request_perform(struct erofs_oci *oci,
* @realm_out: pointer to store realm value
* @service_out: pointer to store service value
* @scope_out: pointer to store scope value
- *
- * Parse Bearer authentication header and extract realm, service, and scope
- * parameters for subsequent token requests.
- *
- * Return: 0 on success, negative errno on failure
Why do we drop this comment?
*/
static int ocierofs_parse_auth_header(const char *auth_header,
- char **realm_out, char **service_out,
- char **scope_out)
+ char **realm_out, char **service_out,
+ char **scope_out)
Let's not adjust lines which are unrelated to the commit.
{
char *realm = NULL, *service = NULL, *scope = NULL;
static const char * const param_names[] = {"realm=", "service=",
"scope="};
@@ -221,7 +270,6 @@ static int ocierofs_parse_auth_header(const char
*auth_header,
const char *p;
int i, ret = 0;
- // https://datatracker.ietf.org/doc/html/rfc6750#section-3
Same here.
if (strncmp(auth_header, "Bearer ", strlen("Bearer ")))
return -EINVAL;
@@ -229,7 +277,6 @@ static int ocierofs_parse_auth_header(const char *auth_header,
if (!header_copy)
return -ENOMEM;
- /* Clean up header: replace newlines with spaces and remove double spaces */
Same here.
If they are unrelated to the new feature, let's refine
ocierofs_parse_auth_header() later.
for (char *q = header_copy; *q; q++) {
if (*q == '\n' || *q == '\r')
*q = ' ';
@@ -277,22 +324,9 @@ out:
return ret;
}
-/**
- * ocierofs_extract_www_auth_info - Extract WWW-Authenticate header information
- * @resp_data: HTTP response data containing headers
- * @realm_out: pointer to store realm value (optional)
- * @service_out: pointer to store service value (optional)
- * @scope_out: pointer to store scope value (optional)
- *
- * Extract realm, service, and scope from WWW-Authenticate header in HTTP
response.
- * This function handles the common pattern of parsing WWW-Authenticate headers
- * that appears in multiple places in the OCI authentication flow.
- *
- * Return: 0 on success, negative errno on failure
- */
Same here.
static int ocierofs_extract_www_auth_info(const char *resp_data,
- char **realm_out, char **service_out,
- char **scope_out)
+ char **realm_out, char **service_out,
+ char **scope_out)
Same here.
{> char *www_auth;
char *line_end;
@@ -336,29 +370,12 @@ static int ocierofs_extract_www_auth_info(const char
*resp_data,
return ret;
}
-/**
- * ocierofs_get_auth_token_with_url - Get authentication token from auth server
- * @oci: OCI client structure
- * @auth_url: authentication server URL
- * @service: service name for authentication
- * @repository: repository name
- * @username: username for basic auth (optional)
- * @password: password for basic auth (optional)
- *
- * Request authentication token from the specified auth server URL using
- * basic authentication if credentials are provided.
- *
- * Return: authentication header string on success, ERR_PTR on failure
- */
-static char *ocierofs_get_auth_token_with_url(struct erofs_oci *oci,
- const char *auth_url,
- const char *service,
- const char *repository,
- const char *username,
- const char *password)
+static char *ocierofs_get_auth_token_with_url(struct ocierofs_ctx *ctx, const
char *auth_url,
+ const char *service, const char
*repository,
+ const char *username, const char
*password)
Since the arguments are changed, I'm fine with this change.
{
- struct erofs_oci_request req = {};
- struct erofs_oci_response resp = {};
+ struct ocierofs_request req = {};
+ struct ocierofs_response resp = {};
json_object *root, *token_obj, *access_token_obj;
const char *token;
char *auth_header = NULL;
@@ -373,40 +390,36 @@ static char *ocierofs_get_auth_token_with_url(struct
erofs_oci *oci,
}
if (username && password && *username) {
- ret = ocierofs_curl_setup_basic_auth(oci->curl, username,
- password);
+ ret = ocierofs_curl_setup_basic_auth(ctx->curl, username,
+ password);
Password can be aligned with `(` in the previous line?
if (ret)
goto out_url;
}
- ret = ocierofs_request_perform(oci, &req, &resp);
- ocierofs_curl_clear_auth(oci->curl);
+ ret = ocierofs_request_perform(ctx, &req, &resp);
+ ocierofs_curl_clear_auth(ctx);
if (ret)
goto out_url;
if (!resp.data) {
- erofs_err("empty response from auth server");
Why drop this?
ret = -EINVAL;
goto out_url;
}
root = json_tokener_parse(resp.data);
if (!root) {
- erofs_err("failed to parse auth response");
Why drop this?
ret = -EINVAL;
- goto out_url;
+ goto out_json;
}
if (!json_object_object_get_ex(root, "token", &token_obj) &&
!json_object_object_get_ex(root, "access_token",
&access_token_obj)) {
- erofs_err("no token found in auth response");
Why drop this?
ret = -EINVAL;
goto out_json;
}
token = json_object_get_string(token_obj ? token_obj : access_token_obj);
if (!token) {
- erofs_err("invalid token in auth response");
Why drop this?
...
auth_service = discovered_service ? discovered_service :
service;
- auth_header = ocierofs_get_auth_token_with_url(oci,
discovered_auth_url,
- auth_service,
repository,
- username,
password);
+ auth_header = ocierofs_get_auth_token_with_url(ctx,
discovered_auth_url,
+ auth_service, repository,
+ username, password);
Same here.
free(discovered_auth_url);
free(discovered_service);
if (!IS_ERR(auth_header))
@@ -544,9 +555,9 @@ static char *ocierofs_get_auth_token(struct erofs_oci *oci,
const char *registry
if (asprintf(&auth_url, auth_patterns[i], registry) < 0)
continue;
- auth_header = ocierofs_get_auth_token_with_url(oci, auth_url,
- service,
repository,
- username,
password);
+ auth_header = ocierofs_get_auth_token_with_url(ctx, auth_url,
+ service, repository,
+ username, password);
Same here.
free(auth_url);
if (!IS_ERR(auth_header))
@@ -557,24 +568,21 @@ static char *ocierofs_get_auth_token(struct erofs_oci
*oci, const char *registry
return ERR_PTR(-ENOENT);
}
-static char *ocierofs_get_manifest_digest(struct erofs_oci *oci,
- const char *registry,
- const char *repository, const char
*tag,
- const char *platform,
- const char *auth_header)
+static char *ocierofs_get_manifest_digest(struct ocierofs_ctx *ctx,
+ const char *registry,
+ const char *repository, const char *tag,
+ const char *platform,
+ const char *auth_header)
{
- struct erofs_oci_request req = {};
- struct erofs_oci_response resp = {};
+ struct ocierofs_request req = {};
+ struct ocierofs_response resp = {};
json_object *root, *manifests, *manifest, *platform_obj, *arch_obj;
json_object *os_obj, *digest_obj, *schema_obj, *media_type_obj;
char *digest = NULL;
const char *api_registry;
int ret = 0, len, i;
- if (!registry || !repository || !tag || !platform)
- return ERR_PTR(-EINVAL);
-
- api_registry = (!strcmp(registry, DOCKER_REGISTRY)) ?
DOCKER_API_REGISTRY : registry;
+ api_registry = ocierofs_get_api_registry(registry);
if (asprintf(&req.url, "https://%s/v2/%s/manifests/%s",
api_registry, repository, tag) < 0)
return ERR_PTR(-ENOMEM);
@@ -584,22 +592,20 @@ static char *ocierofs_get_manifest_digest(struct
erofs_oci *oci,
req.headers = curl_slist_append(req.headers,
"Accept: " DOCKER_MEDIATYPE_MANIFEST_LIST ","
- OCI_MEDIATYPE_INDEX "," DOCKER_MEDIATYPE_MANIFEST_V1 ","
- DOCKER_MEDIATYPE_MANIFEST_V2);
+ OCI_MEDIATYPE_INDEX "," OCI_MEDIATYPE_MANIFEST ","
+ DOCKER_MEDIATYPE_MANIFEST_V1 "," DOCKER_MEDIATYPE_MANIFEST_V2);
- ret = ocierofs_request_perform(oci, &req, &resp);
+ ret = ocierofs_request_perform(ctx, &req, &resp);
if (ret)
goto out;
if (!resp.data) {
- erofs_err("empty response from manifest request");
Same here.
ret = -EINVAL;
goto out;
}
root = json_tokener_parse(resp.data);
if (!root) {
- erofs_err("failed to parse manifest JSON");
Same here.
ret = -EINVAL;
goto out;
}
@@ -615,8 +621,7 @@ static char *ocierofs_get_manifest_digest(struct erofs_oci
*oci,
if (json_object_object_get_ex(root, "mediaType", &media_type_obj)) {
const char *media_type = json_object_get_string(media_type_obj);
- if (!strcmp(media_type, DOCKER_MEDIATYPE_MANIFEST_V2) ||
- !strcmp(media_type, OCI_MEDIATYPE_MANIFEST)) {
+ if (ocierofs_is_manifest(media_type)) {
digest = strdup(tag);
ret = 0;
goto out_json;
@@ -624,7 +629,6 @@ static char *ocierofs_get_manifest_digest(struct erofs_oci
*oci,
}
if (!json_object_object_get_ex(root, "manifests", &manifests)) {
- erofs_err("no manifests found in manifest list");
Same here.
ret = -EINVAL;
goto out_json;
}
@@ -634,9 +638,9 @@ static char *ocierofs_get_manifest_digest(struct erofs_oci
*oci,
manifest = json_object_array_get_idx(manifests, i);
if (json_object_object_get_ex(manifest, "platform",
- &platform_obj) &&
+ &platform_obj) &&
No need to change.
json_object_object_get_ex(platform_obj, "architecture",
- &arch_obj) &&
+ &arch_obj) &&
No need to change.
...
- }
+ free(oci_cfg->password);
+ oci_cfg->password = strdup(p);
+ if (!oci_cfg->password)
+ return -ENOMEM;
} else {
- erofs_err("invalid --oci value
%s", opt);
+ erofs_err("mkfs: invalid --oci value
%s", opt);
Unneeded `mkfs:`.
Thanks,
Gao Xiang