]> git.basschouten.com Git - openhab-addons.git/blob
ef6f86faaa5ba106904fe4dc92a8ea23eb947f3c
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.ipcamera.internal.servlet;
14
15 import java.io.BufferedInputStream;
16 import java.io.BufferedOutputStream;
17 import java.io.File;
18 import java.io.FileInputStream;
19 import java.io.IOException;
20 import java.util.Dictionary;
21 import java.util.Properties;
22
23 import javax.servlet.ServletOutputStream;
24 import javax.servlet.annotation.WebServlet;
25 import javax.servlet.http.HttpServlet;
26 import javax.servlet.http.HttpServletResponse;
27
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;
33
34 /**
35  * The {@link IpCameraServlet} is responsible for serving files to the Jetty
36  * server normally found on port 8080
37  *
38  * @author Matthew Skinner - Initial contribution
39  */
40 @NonNullByDefault
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;
48
49     public IpCameraServlet(ThingHandler handler, HttpService httpService) {
50         this(handler, httpService, new Properties());
51     }
52
53     public IpCameraServlet(ThingHandler handler, HttpService httpService, Dictionary<Object, Object> initParameters) {
54         this.handler = handler;
55         this.httpService = httpService;
56         this.initParameters = initParameters;
57         startListening();
58     }
59
60     public void startListening() {
61         try {
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());
67         }
68     }
69
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.");
76             return;
77         }
78         try {
79             response.setContentLength(snapshot.length);
80             ServletOutputStream servletOut = response.getOutputStream();
81             servletOut.write(snapshot);
82         } catch (IOException e) {
83         }
84     }
85
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();
93         try {
94             response.setContentLength(bytes.length);
95             ServletOutputStream servletOut = response.getOutputStream();
96             servletOut.write(bytes);
97             servletOut.write("\r\n".getBytes());
98         } catch (IOException e) {
99         }
100     }
101
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);
106             return;
107         }
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;
117         try {
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()];
121             int length;
122             while ((length = input.read(buffer)) > 0) {
123                 output.write(buffer, 0, length);
124             }
125         } finally {
126             if (output != null) {
127                 output.close();
128             }
129             if (input != null) {
130                 input.close();
131             }
132         }
133     }
134
135     public void dispose() {
136         try {
137             httpService.unregister("/ipcamera/" + handler.getThing().getUID().getId());
138             this.destroy();
139         } catch (IllegalArgumentException e) {
140             logger.warn("Unregistration of servlet failed:{}", e.getMessage());
141         }
142     }
143 }