From 6f448f32fe9b7379e2630fab7b06205f901f2ded Mon Sep 17 00:00:00 2001 From: Torrey Searle Date: Wed, 17 Aug 2016 15:10:54 +0200 Subject: res_ari: Add http prefix to generated docs updated the uri handler to include the url prefix of the http server this enables res_ari to add it to the uris when generating docs Change-Id: I279335a2625261a8492206c37219698f42591c2e --- include/asterisk/ari.h | 3 ++- include/asterisk/http.h | 1 + main/http.c | 2 ++ res/res_ari.c | 16 +++++++++++----- tests/test_ari.c | 8 ++++---- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/include/asterisk/ari.h b/include/asterisk/ari.h index c3df46a2b..1c54a694b 100644 --- a/include/asterisk/ari.h +++ b/include/asterisk/ari.h @@ -144,10 +144,11 @@ void ast_ari_invoke(struct ast_tcptls_session_instance *ser, * for unit testing. * * \param uri Requested URI, relative to the docs path. + * \param prefix prefix that prefixes all http requests * \param headers HTTP headers. * \param[out] response RESTful HTTP response. */ -void ast_ari_get_docs(const char *uri, struct ast_variable *headers, struct ast_ari_response *response); +void ast_ari_get_docs(const char *uri, const char *prefix, struct ast_variable *headers, struct ast_ari_response *response); /*! \brief Abstraction for reading/writing JSON to a WebSocket */ struct ast_ari_websocket_session; diff --git a/include/asterisk/http.h b/include/asterisk/http.h index bb8973dce..d5f54cc65 100644 --- a/include/asterisk/http.h +++ b/include/asterisk/http.h @@ -101,6 +101,7 @@ struct ast_http_uri { AST_LIST_ENTRY(ast_http_uri) entry; const char *description; const char *uri; + const char *prefix; ast_http_callback callback; unsigned int has_subtree:1; /*! Structure is malloc'd */ diff --git a/main/http.c b/main/http.c index b2b35ff59..ac5aae150 100644 --- a/main/http.c +++ b/main/http.c @@ -671,6 +671,8 @@ int ast_http_uri_link(struct ast_http_uri *urih) AST_RWLIST_WRLOCK(&uris); + urih->prefix = prefix; + if ( AST_RWLIST_EMPTY(&uris) || strlen(AST_RWLIST_FIRST(&uris)->uri) <= len ) { AST_RWLIST_INSERT_HEAD(&uris, urih, entry); AST_RWLIST_UNLOCK(&uris); diff --git a/res/res_ari.c b/res/res_ari.c index 4a0a22d79..4ff98ce96 100644 --- a/res/res_ari.c +++ b/res/res_ari.c @@ -579,7 +579,7 @@ void ast_ari_invoke(struct ast_tcptls_session_instance *ser, } } -void ast_ari_get_docs(const char *uri, struct ast_variable *headers, +void ast_ari_get_docs(const char *uri, const char *prefix, struct ast_variable *headers, struct ast_ari_response *response) { RAII_VAR(struct ast_str *, absolute_path_builder, NULL, ast_free); @@ -685,9 +685,15 @@ void ast_ari_get_docs(const char *uri, struct ast_variable *headers, } } if (host != NULL) { - ast_json_object_set( - obj, "basePath", - ast_json_stringf("http://%s/ari", host->value)); + if (prefix != NULL && strlen(prefix) > 0) { + ast_json_object_set( + obj, "basePath", + ast_json_stringf("http://%s%s/ari", host->value,prefix)); + } else { + ast_json_object_set( + obj, "basePath", + ast_json_stringf("http://%s/ari", host->value)); + } } else { /* Without the host, we don't have the basePath */ ast_json_object_del(obj, "basePath"); @@ -969,7 +975,7 @@ static int ast_ari_callback(struct ast_tcptls_session_instance *ser, ast_ari_response_error(&response, 405, "Method Not Allowed", "Unsupported method"); } else { /* Skip the api-docs prefix */ - ast_ari_get_docs(strchr(uri, '/') + 1, headers, &response); + ast_ari_get_docs(strchr(uri, '/') + 1, urih->prefix, headers, &response); } } else { /* Other RESTful resources */ diff --git a/tests/test_ari.c b/tests/test_ari.c index fc74544af..a61a1182d 100644 --- a/tests/test_ari.c +++ b/tests/test_ari.c @@ -217,7 +217,7 @@ AST_TEST_DEFINE(get_docs) response = response_alloc(); headers = ast_variable_new("Host", "stasis.asterisk.org", __FILE__); - ast_ari_get_docs("resources.json", headers, response); + ast_ari_get_docs("resources.json", "", headers, response); ast_test_validate(test, 200 == response->response_code); /* basePath should be relative to the Host header */ @@ -247,7 +247,7 @@ AST_TEST_DEFINE(get_docs_nohost) } response = response_alloc(); - ast_ari_get_docs("resources.json", headers, response); + ast_ari_get_docs("resources.json", "", headers, response); ast_test_validate(test, 200 == response->response_code); /* basePath should be relative to the Host header */ @@ -274,7 +274,7 @@ AST_TEST_DEFINE(get_docs_notfound) } response = response_alloc(); - ast_ari_get_docs("i-am-not-a-resource.json", headers, response); + ast_ari_get_docs("i-am-not-a-resource.json", "", headers, response); ast_test_validate(test, 404 == response->response_code); return AST_TEST_PASS; @@ -297,7 +297,7 @@ AST_TEST_DEFINE(get_docs_hackerz) } response = response_alloc(); - ast_ari_get_docs("../../../../sbin/asterisk", headers, response); + ast_ari_get_docs("../../../../sbin/asterisk", "", headers, response); ast_test_validate(test, 404 == response->response_code); return AST_TEST_PASS; -- cgit v1.2.3