2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.ipcamera.internal.servlet;
15 import java.io.BufferedInputStream;
16 import java.io.BufferedOutputStream;
18 import java.io.FileInputStream;
19 import java.io.IOException;
20 import java.util.Dictionary;
21 import java.util.Properties;
23 import javax.servlet.ServletOutputStream;
24 import javax.servlet.annotation.WebServlet;
25 import javax.servlet.http.HttpServlet;
26 import javax.servlet.http.HttpServletResponse;
28 import org.eclipse.jdt.annotation.NonNullByDefault;
29 import org.openhab.core.thing.binding.ThingHandler;
30 import org.osgi.service.http.HttpService;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
35 * The {@link IpCameraServlet} is responsible for serving files to the Jetty
36 * server normally found on port 8080
38 * @author Matthew Skinner - Initial contribution
41 @WebServlet(asyncSupported = true)
42 public abstract class IpCameraServlet extends HttpServlet {
43 protected final Logger logger = LoggerFactory.getLogger(this.getClass());
44 private static final long serialVersionUID = 1L;
45 protected final ThingHandler handler;
46 protected final HttpService httpService;
47 protected final Dictionary<Object, Object> initParameters;
49 public IpCameraServlet(ThingHandler handler, HttpService httpService) {
50 this(handler, httpService, new Properties());
53 public IpCameraServlet(ThingHandler handler, HttpService httpService, Dictionary<Object, Object> initParameters) {
54 this.handler = handler;
55 this.httpService = httpService;
56 this.initParameters = initParameters;
60 public void startListening() {
62 initParameters.put("servlet-name", "/ipcamera/" + handler.getThing().getUID().getId());
63 httpService.registerServlet("/ipcamera/" + handler.getThing().getUID().getId(), this, initParameters,
64 httpService.createDefaultHttpContext());
65 } catch (Exception e) {
66 logger.warn("Registering servlet failed:{}", e.getMessage());
70 protected void sendSnapshotImage(HttpServletResponse response, String contentType, byte[] snapshot) {
71 response.setHeader("Access-Control-Allow-Origin", "*");
72 response.setHeader("Access-Control-Expose-Headers", "*");
73 response.setContentType(contentType);
74 if (snapshot.length == 1) {
75 logger.warn("ipcamera.jpg was requested but there was no jpg in ram to send.");
79 response.setContentLength(snapshot.length);
80 ServletOutputStream servletOut = response.getOutputStream();
81 servletOut.write(snapshot);
82 } catch (IOException e) {
86 protected void sendString(HttpServletResponse response, String contents, String contentType) {
87 response.setHeader("Access-Control-Allow-Origin", "*");
88 response.setHeader("Access-Control-Expose-Headers", "*");
89 response.setContentType(contentType);
90 response.setHeader("Pragma", "no-cache");
91 response.setHeader("Cache-Control", "max-age=0, no-cache, no-store");
92 byte[] bytes = contents.getBytes();
94 response.setContentLength(bytes.length);
95 ServletOutputStream servletOut = response.getOutputStream();
96 servletOut.write(bytes);
97 servletOut.write("\r\n".getBytes());
98 } catch (IOException e) {
102 protected void sendFile(HttpServletResponse response, String filename, String contentType) throws IOException {
103 File file = new File(filename);
104 if (!file.exists()) {
105 response.sendError(HttpServletResponse.SC_NOT_FOUND);
108 response.setBufferSize((int) file.length());
109 response.setContentType(contentType);
110 response.setHeader("Access-Control-Allow-Origin", "*");
111 response.setHeader("Access-Control-Expose-Headers", "*");
112 response.setHeader("Content-Length", String.valueOf(file.length()));
113 response.setHeader("Pragma", "no-cache");
114 response.setHeader("Cache-Control", "max-age=0, no-cache, no-store");
115 BufferedInputStream input = null;
116 BufferedOutputStream output = null;
118 input = new BufferedInputStream(new FileInputStream(file), (int) file.length());
119 output = new BufferedOutputStream(response.getOutputStream(), (int) file.length());
120 byte[] buffer = new byte[(int) file.length()];
122 while ((length = input.read(buffer)) > 0) {
123 output.write(buffer, 0, length);
126 if (output != null) {
135 public void dispose() {
137 httpService.unregister("/ipcamera/" + handler.getThing().getUID().getId());
139 } catch (IllegalArgumentException e) {
140 logger.warn("Unregistration of servlet failed:{}", e.getMessage());