| `password` | The password for pulling the calendar. If set, the binding pulls the calendar using basic auth. Only valid in combination with `username`. | optional |
| `maxSize` | The maximum size of the iCal-file in Mebibytes. | mandatory (default available) |
| `authorizationCode` | The authorization code to permit the execution of embedded command tags. If set, the binding checks that the authorization code in the command tag matches before executing any commands. | optional |
+| `userAgent` | Some providers require a specific user agent header. If left empty, the default Jetty header is used. | optional |
### Configuration for `eventfilter`
public String url;
@Nullable
public String username;
+ @Nullable
+ public String userAgent;
}
final int maxSize = maxSizeBD.intValue();
try {
regularPull = new PullJob(httpClient, new URI(currentConfiguration.url), currentConfiguration.username,
- currentConfiguration.password, calendarFile, maxSize * 1048576, this);
+ currentConfiguration.password, calendarFile, maxSize * 1048576, this,
+ currentConfiguration.userAgent);
} catch (URISyntaxException e) {
throw new ConfigBrokenException(String.format(
"The URI '%s' for downloading the calendar contains syntax errors.", currentConfiguration.url));
private final Logger logger = LoggerFactory.getLogger(PullJob.class);
private final int maxSize;
private final URI sourceURI;
+ private @Nullable final String userAgent;
/**
* Constructor of PullJob for creating a single pull of a calendar.
* @param listener The listener that should be fired when update succeed.
*/
public PullJob(HttpClient httpClient, URI sourceURI, @Nullable String username, @Nullable String password,
- File destination, int maxSize, CalendarUpdateListener listener) {
+ File destination, int maxSize, CalendarUpdateListener listener, @Nullable String userAgent) {
this.httpClient = httpClient;
this.sourceURI = sourceURI;
if (username != null && password != null) {
this.destination = destination;
this.listener = listener;
this.maxSize = maxSize;
+ this.userAgent = userAgent;
}
@Override
public void run() {
final Request request = httpClient.newRequest(sourceURI).followRedirects(true).method(HttpMethod.GET)
.timeout(HTTP_TIMEOUT_SECS, TimeUnit.SECONDS);
+ if (userAgent != null && !userAgent.isBlank()) {
+ request.agent(userAgent);
+ }
final Authentication.Result currentAuthentication = authentication;
if (currentAuthentication != null) {
currentAuthentication.apply(request);
thing-type.config.icalendar.calendar.refreshTime.description = Frequency to scan for changes in minutes
thing-type.config.icalendar.calendar.url.label = URL
thing-type.config.icalendar.calendar.url.description = URL for downloading iCalendar events
+thing-type.config.icalendar.calendar.userAgent.label = User Agent
+thing-type.config.icalendar.calendar.userAgent.description = Some providers require a specific user agent header. If left empty, the default Jetty header is used.
thing-type.config.icalendar.calendar.username.label = User Name
thing-type.config.icalendar.calendar.username.description = User name for fetching the calendar (usable in combination with password in HTTP basic auth)
thing-type.config.icalendar.eventfilter.datetimeEnd.label = End
<label>Command Authorization Code</label>
<description>Authorization Code to allow the execution of Command Tags (may be empty)</description>
</parameter>
+ <parameter name="userAgent" type="text" required="false">
+ <label>User Agent</label>
+ <description>Some providers require a specific user agent header. If left empty, the default Jetty header is used.</description>
+ <advanced>true</advanced>
+ </parameter>
</config-description>
</bridge-type>