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;
21 import javax.servlet.ServletOutputStream;
22 import javax.servlet.annotation.WebServlet;
23 import javax.servlet.http.HttpServlet;
24 import javax.servlet.http.HttpServletResponse;
26 import org.eclipse.jdt.annotation.NonNullByDefault;
27 import org.openhab.core.thing.binding.ThingHandler;
28 import org.osgi.service.http.HttpService;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
33 * The {@link IpCameraServlet} is responsible for serving files to the Jetty
34 * server normally found on port 8080
36 * @author Matthew Skinner - Initial contribution
39 @WebServlet(asyncSupported = true)
40 public abstract class IpCameraServlet extends HttpServlet {
41 protected final Logger logger = LoggerFactory.getLogger(this.getClass());
42 private static final long serialVersionUID = 1L;
43 protected final ThingHandler handler;
44 protected final HttpService httpService;
46 public IpCameraServlet(ThingHandler handler, HttpService httpService) {
47 this.handler = handler;
48 this.httpService = httpService;
52 public void startListening() {
54 httpService.registerServlet("/ipcamera/" + handler.getThing().getUID().getId(), this, null,
55 httpService.createDefaultHttpContext());
56 } catch (Exception e) {
57 logger.warn("Registering servlet failed:{}", e.getMessage());
61 protected void sendSnapshotImage(HttpServletResponse response, String contentType, byte[] snapshot) {
62 response.setHeader("Access-Control-Allow-Origin", "*");
63 response.setHeader("Access-Control-Expose-Headers", "*");
64 response.setContentType(contentType);
65 if (snapshot.length == 1) {
66 logger.warn("ipcamera.jpg was requested but there was no jpg in ram to send.");
70 response.setContentLength(snapshot.length);
71 ServletOutputStream servletOut = response.getOutputStream();
72 servletOut.write(snapshot);
73 } catch (IOException e) {
77 protected void sendString(HttpServletResponse response, String contents, String contentType) {
78 response.setHeader("Access-Control-Allow-Origin", "*");
79 response.setHeader("Access-Control-Expose-Headers", "*");
80 response.setContentType(contentType);
81 response.setHeader("Pragma", "no-cache");
82 response.setHeader("Cache-Control", "max-age=0, no-cache, no-store");
83 byte[] bytes = contents.getBytes();
85 response.setContentLength(bytes.length);
86 ServletOutputStream servletOut = response.getOutputStream();
87 servletOut.write(bytes);
88 servletOut.write("\r\n".getBytes());
89 } catch (IOException e) {
93 protected void sendFile(HttpServletResponse response, String filename, String contentType) throws IOException {
94 File file = new File(filename);
96 response.sendError(HttpServletResponse.SC_NOT_FOUND);
99 response.setBufferSize((int) file.length());
100 response.setContentType(contentType);
101 response.setHeader("Access-Control-Allow-Origin", "*");
102 response.setHeader("Access-Control-Expose-Headers", "*");
103 response.setHeader("Content-Length", String.valueOf(file.length()));
104 response.setHeader("Pragma", "no-cache");
105 response.setHeader("Cache-Control", "max-age=0, no-cache, no-store");
106 BufferedInputStream input = null;
107 BufferedOutputStream output = null;
109 input = new BufferedInputStream(new FileInputStream(file), (int) file.length());
110 output = new BufferedOutputStream(response.getOutputStream(), (int) file.length());
111 byte[] buffer = new byte[(int) file.length()];
113 while ((length = input.read(buffer)) > 0) {
114 output.write(buffer, 0, length);
117 if (output != null) {
126 public void dispose() {
128 httpService.unregister("/ipcamera/" + handler.getThing().getUID().getId());
130 } catch (IllegalArgumentException e) {
131 logger.warn("Unregistration of servlet failed:{}", e.getMessage());