Skip to content

Commit daf2d1c

Browse files
authored
Allow setting sdk_name at runtime (#834)
1 parent e97930a commit daf2d1c

17 files changed

+244
-26
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
**Features**:
66

77
- Extend API with ptr/len-string interfaces. ([#827](https://github.com/getsentry/sentry-native/pull/827))
8+
- Allow setting sdk_name at runtime ([#834](https://github.com/getsentry/sentry-native/pull/834))
89

910
## 0.6.1
1011

include/sentry.h

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,6 +1008,32 @@ SENTRY_API void sentry_options_set_transport_thread_name_n(
10081008
SENTRY_API const char *sentry_options_get_transport_thread_name(
10091009
const sentry_options_t *opts);
10101010

1011+
/*
1012+
* Configures the name of the sentry SDK. Returns 0 on success.
1013+
*/
1014+
SENTRY_API int sentry_options_set_sdk_name(
1015+
sentry_options_t *opts, const char *sdk_name);
1016+
1017+
/*
1018+
* Configures the name of the sentry SDK. Returns 0 on success.
1019+
*/
1020+
SENTRY_API int sentry_options_set_sdk_name_n(
1021+
sentry_options_t *opts, const char *sdk_name, size_t sdk_name_len);
1022+
1023+
/**
1024+
* Returns the configured sentry SDK name. Unless overwritten this defaults to
1025+
* SENTRY_SDK_NAME.
1026+
*/
1027+
SENTRY_API const char *sentry_options_get_sdk_name(
1028+
const sentry_options_t *opts);
1029+
1030+
/**
1031+
* Returns the user agent. Unless overwritten this defaults to
1032+
* "SENTRY_SDK_NAME / SENTRY_SDK_VERSION".
1033+
*/
1034+
SENTRY_API const char *sentry_options_get_user_agent(
1035+
const sentry_options_t *opts);
1036+
10111037
/**
10121038
* Enables or disables debug printing mode.
10131039
*/
@@ -1983,12 +2009,14 @@ SENTRY_EXPERIMENTAL_API int sentry_clear_crashed_last_run(void);
19832009
SENTRY_EXPERIMENTAL_API const char *sentry_sdk_version(void);
19842010

19852011
/**
1986-
* Sentry SDK name.
2012+
* Sentry SDK name set during build time.
2013+
* Deprecated: Please use sentry_options_get_sdk_name instead.
19872014
*/
19882015
SENTRY_EXPERIMENTAL_API const char *sentry_sdk_name(void);
19892016

19902017
/**
1991-
* Sentry SDK User-Agent.
2018+
* Sentry SDK User-Agent set during build time.
2019+
* Deprecated: Please use sentry_options_get_user_agent instead.
19922020
*/
19932021
SENTRY_EXPERIMENTAL_API const char *sentry_sdk_user_agent(void);
19942022

src/backends/sentry_backend_crashpad.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,8 @@ sentry__crashpad_backend_startup(
311311
data->db = crashpad::CrashReportDatabase::Initialize(database).release();
312312

313313
crashpad::CrashpadClient client;
314-
char *minidump_url = sentry__dsn_get_minidump_url(options->dsn);
314+
char *minidump_url
315+
= sentry__dsn_get_minidump_url(options->dsn, options->user_agent);
315316
SENTRY_TRACEF("using minidump url \"%s\"", minidump_url);
316317
std::string url = minidump_url ? std::string(minidump_url) : std::string();
317318
sentry_free(minidump_url);

src/sentry_options.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ sentry_options_new(void)
3636
if (!opts->environment) {
3737
opts->environment = sentry__string_clone("production");
3838
}
39+
sentry_options_set_sdk_name(opts, SENTRY_SDK_NAME);
3940
opts->max_breadcrumbs = SENTRY_BREADCRUMBS_MAX;
4041
opts->user_consent = SENTRY_USER_CONSENT_UNKNOWN;
4142
opts->auto_session_tracking = true;
@@ -84,6 +85,8 @@ sentry_options_free(sentry_options_t *opts)
8485
}
8586
sentry__dsn_decref(opts->dsn);
8687
sentry_free(opts->release);
88+
sentry_free(opts->sdk_name);
89+
sentry_free(opts->user_agent);
8790
sentry_free(opts->environment);
8891
sentry_free(opts->dist);
8992
sentry_free(opts->http_proxy);
@@ -295,6 +298,51 @@ sentry_options_get_transport_thread_name(const sentry_options_t *opts)
295298
return opts->transport_thread_name;
296299
}
297300

301+
int
302+
sentry_options_set_sdk_name(sentry_options_t *opts, const char *sdk_name)
303+
{
304+
if (!opts || !sdk_name) {
305+
return 1;
306+
}
307+
const size_t sdk_name_len = strlen(sdk_name);
308+
return sentry_options_set_sdk_name_n(opts, sdk_name, sdk_name_len);
309+
}
310+
311+
int
312+
sentry_options_set_sdk_name_n(
313+
sentry_options_t *opts, const char *sdk_name, size_t sdk_name_len)
314+
{
315+
if (!opts || !sdk_name) {
316+
return 1;
317+
}
318+
319+
sentry_free(opts->sdk_name);
320+
opts->sdk_name = sentry__string_clone_n(sdk_name, sdk_name_len);
321+
322+
sentry_stringbuilder_t sb;
323+
sentry__stringbuilder_init(&sb);
324+
sentry__stringbuilder_append(&sb, opts->sdk_name);
325+
sentry__stringbuilder_append(&sb, "/");
326+
sentry__stringbuilder_append(&sb, SENTRY_SDK_VERSION);
327+
328+
sentry_free(opts->user_agent);
329+
opts->user_agent = sentry__stringbuilder_into_string(&sb);
330+
331+
return 0;
332+
}
333+
334+
const char *
335+
sentry_options_get_sdk_name(const sentry_options_t *opts)
336+
{
337+
return opts->sdk_name;
338+
}
339+
340+
const char *
341+
sentry_options_get_user_agent(const sentry_options_t *opts)
342+
{
343+
return opts->user_agent;
344+
}
345+
298346
void
299347
sentry_options_set_debug(sentry_options_t *opts, int debug)
300348
{

src/sentry_options.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ typedef struct sentry_options_s {
3838
char *http_proxy;
3939
char *ca_certs;
4040
char *transport_thread_name;
41+
char *sdk_name;
42+
char *user_agent;
4143
sentry_path_t *database_path;
4244
sentry_path_t *handler_path;
4345
sentry_logger_t logger;

src/sentry_scope.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,15 @@ get_client_sdk(void)
2929
{
3030
sentry_value_t client_sdk = sentry_value_new_object();
3131

32-
sentry_value_t name = sentry_value_new_string(SENTRY_SDK_NAME);
33-
sentry_value_set_by_key(client_sdk, "name", name);
32+
SENTRY_WITH_OPTIONS (options) {
33+
sentry_value_t sdk_name = sentry_value_new_string(options->sdk_name);
34+
sentry_value_set_by_key(client_sdk, "name", sdk_name);
35+
}
36+
// in case the SDK is not initialized yet, fallback to build-time value
37+
if (sentry_value_is_null(sentry_value_get_by_key(client_sdk, "name"))) {
38+
sentry_value_t sdk_name = sentry_value_new_string(SENTRY_SDK_NAME);
39+
sentry_value_set_by_key(client_sdk, "name", sdk_name);
40+
}
3441

3542
sentry_value_t version = sentry_value_new_string(SENTRY_SDK_VERSION);
3643
sentry_value_set_by_key(client_sdk, "version", version);

src/sentry_transport.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,8 @@ sentry_transport_free(sentry_transport_t *transport)
150150

151151
sentry_prepared_http_request_t *
152152
sentry__prepare_http_request(sentry_envelope_t *envelope,
153-
const sentry_dsn_t *dsn, const sentry_rate_limiter_t *rl)
153+
const sentry_dsn_t *dsn, const sentry_rate_limiter_t *rl,
154+
const char *user_agent)
154155
{
155156
if (!dsn || !dsn->is_valid) {
156157
return NULL;
@@ -189,7 +190,7 @@ sentry__prepare_http_request(sentry_envelope_t *envelope,
189190
sentry_prepared_http_header_t *h;
190191
h = &req->headers[req->headers_len++];
191192
h->key = "x-sentry-auth";
192-
h->value = sentry__dsn_get_auth_header(dsn);
193+
h->value = sentry__dsn_get_auth_header(dsn, user_agent);
193194

194195
h = &req->headers[req->headers_len++];
195196
h->key = "content-type";

src/sentry_transport.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ typedef struct sentry_prepared_http_request_s {
8282
*/
8383
sentry_prepared_http_request_t *sentry__prepare_http_request(
8484
sentry_envelope_t *envelope, const sentry_dsn_t *dsn,
85-
const sentry_rate_limiter_t *rl);
85+
const sentry_rate_limiter_t *rl, const char *user_agent);
8686

8787
/**
8888
* Free a previously allocated HTTP request.

src/sentry_utils.c

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ sentry__dsn_decref(sentry_dsn_t *dsn)
312312
}
313313

314314
char *
315-
sentry__dsn_get_auth_header(const sentry_dsn_t *dsn)
315+
sentry__dsn_get_auth_header(const sentry_dsn_t *dsn, const char *user_agent)
316316
{
317317
if (!dsn || !dsn->is_valid) {
318318
return NULL;
@@ -321,8 +321,14 @@ sentry__dsn_get_auth_header(const sentry_dsn_t *dsn)
321321
sentry__stringbuilder_init(&sb);
322322
sentry__stringbuilder_append(&sb, "Sentry sentry_key=");
323323
sentry__stringbuilder_append(&sb, dsn->public_key);
324-
sentry__stringbuilder_append(
325-
&sb, ", sentry_version=7, sentry_client=" SENTRY_SDK_USER_AGENT);
324+
sentry__stringbuilder_append(&sb, ", sentry_version=7");
325+
326+
sentry__stringbuilder_append(&sb, ", sentry_client=");
327+
if (user_agent) {
328+
sentry__stringbuilder_append(&sb, user_agent);
329+
} else {
330+
sentry__stringbuilder_append(&sb, SENTRY_SDK_USER_AGENT);
331+
}
326332
return sentry__stringbuilder_into_string(&sb);
327333
}
328334

@@ -353,15 +359,16 @@ sentry__dsn_get_envelope_url(const sentry_dsn_t *dsn)
353359
}
354360

355361
char *
356-
sentry__dsn_get_minidump_url(const sentry_dsn_t *dsn)
362+
sentry__dsn_get_minidump_url(const sentry_dsn_t *dsn, const char *user_agent)
357363
{
358-
if (!dsn || !dsn->is_valid) {
364+
if (!dsn || !dsn->is_valid || !user_agent) {
359365
return NULL;
360366
}
361367
sentry_stringbuilder_t sb;
362368
init_string_builder_for_url(&sb, dsn);
363-
sentry__stringbuilder_append(
364-
&sb, "/minidump/?sentry_client=" SENTRY_SDK_USER_AGENT "&sentry_key=");
369+
sentry__stringbuilder_append(&sb, "/minidump/?sentry_client=");
370+
sentry__stringbuilder_append(&sb, user_agent);
371+
sentry__stringbuilder_append(&sb, "&sentry_key=");
365372
sentry__stringbuilder_append(&sb, dsn->public_key);
366373
return sentry__stringbuilder_into_string(&sb);
367374
}

src/sentry_utils.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ void sentry__dsn_decref(sentry_dsn_t *dsn);
8080
* described here:
8181
* https://docs.sentry.io/development/sdk-dev/overview/#authentication
8282
*/
83-
char *sentry__dsn_get_auth_header(const sentry_dsn_t *dsn);
83+
char *sentry__dsn_get_auth_header(
84+
const sentry_dsn_t *dsn, const char *user_agent);
8485

8586
/**
8687
* Returns the envelope endpoint url used for normal uploads as a newly
@@ -92,7 +93,8 @@ char *sentry__dsn_get_envelope_url(const sentry_dsn_t *dsn);
9293
* Returns the minidump endpoint url used for uploads done by the out-of-process
9394
* crashpad backend as a newly allocated string.
9495
*/
95-
char *sentry__dsn_get_minidump_url(const sentry_dsn_t *dsn);
96+
char *sentry__dsn_get_minidump_url(
97+
const sentry_dsn_t *dsn, const char *user_agent);
9698

9799
/**
98100
* Returns the number of milliseconds since the unix epoch.

0 commit comments

Comments
 (0)