From c1b6a796865d11006634f39c765eb12a4bfb556d 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 (cherry picked from commit 6f448f32fe9b7379e2630fab7b06205f901f2ded) --- 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 79b9516eb..4019e94e3 100644 --- a/include/asterisk/ari.h +++ b/include/asterisk/ari.h @@ -146,10 +146,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 bc23e6e56..da564da20 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 0cc1ee7b0..eb15a88b8 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 efec810e1..da889ec45 100644 --- a/tests/test_ari.c +++ b/tests/test_ari.c @@ -218,7 +218,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 */ @@ -248,7 +248,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 */ @@ -275,7 +275,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; @@ -298,7 +298,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