Deduplicate URI building code in soap schema code (#15799)

This commit is contained in:
Niels Dossche 2024-09-09 19:44:09 +02:00 committed by GitHub
parent 6ed730eb59
commit b7b492b184
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 22 additions and 35 deletions

View file

@ -143,6 +143,22 @@ static void schema_load_file(sdlCtx *ctx, xmlAttrPtr ns, xmlChar *location, xmlA
}
}
/* Returned uri must be freed by the caller. */
xmlChar *schema_location_construct_uri(const xmlAttr *attribute)
{
xmlChar *uri;
xmlChar *base = xmlNodeGetBase(attribute->doc, attribute->parent);
if (base == NULL) {
uri = xmlBuildURI(attribute->children->content, attribute->doc->URL);
} else {
uri = xmlBuildURI(attribute->children->content, base);
xmlFree(base);
}
return uri;
}
/*
2.6.1 xsi:type
2.6.2 xsi:nil
@ -196,15 +212,7 @@ int load_schema(sdlCtx *ctx, xmlNodePtr schema)
if (location == NULL) {
soap_error0(E_ERROR, "Parsing Schema: include has no 'schemaLocation' attribute");
} else {
xmlChar *uri;
xmlChar *base = xmlNodeGetBase(trav->doc, trav);
if (base == NULL) {
uri = xmlBuildURI(location->children->content, trav->doc->URL);
} else {
uri = xmlBuildURI(location->children->content, base);
xmlFree(base);
}
xmlChar *uri = schema_location_construct_uri(location);
schema_load_file(ctx, NULL, uri, tns, 0);
xmlFree(uri);
}
@ -216,15 +224,7 @@ int load_schema(sdlCtx *ctx, xmlNodePtr schema)
if (location == NULL) {
soap_error0(E_ERROR, "Parsing Schema: redefine has no 'schemaLocation' attribute");
} else {
xmlChar *uri;
xmlChar *base = xmlNodeGetBase(trav->doc, trav);
if (base == NULL) {
uri = xmlBuildURI(location->children->content, trav->doc->URL);
} else {
uri = xmlBuildURI(location->children->content, base);
xmlFree(base);
}
xmlChar *uri = schema_location_construct_uri(location);
schema_load_file(ctx, NULL, uri, tns, 0);
xmlFree(uri);
/* TODO: <redefine> support */
@ -245,14 +245,7 @@ int load_schema(sdlCtx *ctx, xmlNodePtr schema)
}
}
if (location) {
xmlChar *base = xmlNodeGetBase(trav->doc, trav);
if (base == NULL) {
uri = xmlBuildURI(location->children->content, trav->doc->URL);
} else {
uri = xmlBuildURI(location->children->content, base);
xmlFree(base);
}
uri = schema_location_construct_uri(location);
}
schema_load_file(ctx, ns, uri, tns, 1);
if (uri != NULL) {xmlFree(uri);}

View file

@ -22,6 +22,8 @@
int load_schema(sdlCtx *ctx, xmlNodePtr schema);
void schema_pass2(sdlCtx *ctx);
xmlChar *schema_location_construct_uri(const xmlAttr *attribute);
void delete_model(zval *zv);
void delete_model_persistent(zval *zv);
void delete_type(zval *zv);

View file

@ -361,15 +361,7 @@ static void load_wsdl_ex(zval *this_ptr, char *struri, sdlCtx *ctx, int include)
/* TODO: namespace ??? */
xmlAttrPtr tmp = get_attribute(trav->properties, "location");
if (tmp) {
xmlChar *uri;
xmlChar *base = xmlNodeGetBase(trav->doc, trav);
if (base == NULL) {
uri = xmlBuildURI(tmp->children->content, trav->doc->URL);
} else {
uri = xmlBuildURI(tmp->children->content, base);
xmlFree(base);
}
xmlChar *uri = schema_location_construct_uri(tmp);
load_wsdl_ex(this_ptr, (char*)uri, ctx, 1);
xmlFree(uri);
}