]> git.basschouten.com Git - openhab-addons.git/blob
49a4ccba5e6a36d32d20f1d12691762dfdc211df
[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
21 import javax.servlet.ServletOutputStream;
22 import javax.servlet.annotation.WebServlet;
23 import javax.servlet.http.HttpServlet;
24 import javax.servlet.http.HttpServletResponse;
25
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;
31
32 /**
33  * The {@link IpCameraServlet} is responsible for serving files to the Jetty
34  * server normally found on port 8080
35  *
36  * @author Matthew Skinner - Initial contribution
37  */
38 @NonNullByDefault
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;
45
46     public IpCameraServlet(ThingHandler handler, HttpService httpService) {
47         this.handler = handler;
48         this.httpService = httpService;
49         startListening();
50     }
51
52     public void startListening() {
53         try {
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());
58         }
59     }
60
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.");
67             return;
68         }
69         try {
70             response.setContentLength(snapshot.length);
71             ServletOutputStream servletOut = response.getOutputStream();
72             servletOut.write(snapshot);
73         } catch (IOException e) {
74         }
75     }
76
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();
84         try {
85             response.setContentLength(bytes.length);
86             ServletOutputStream servletOut = response.getOutputStream();
87             servletOut.write(bytes);
88             servletOut.write("\r\n".getBytes());
89         } catch (IOException e) {
90         }
91     }
92
93     protected void sendFile(HttpServletResponse response, String filename, String contentType) throws IOException {
94         File file = new File(filename);
95         if (!file.exists()) {
96             response.sendError(HttpServletResponse.SC_NOT_FOUND);
97             return;
98         }
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;
108         try {
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()];
112             int length;
113             while ((length = input.read(buffer)) > 0) {
114                 output.write(buffer, 0, length);
115             }
116         } finally {
117             if (output != null) {
118                 output.close();
119             }
120             if (input != null) {
121                 input.close();
122             }
123         }
124     }
125
126     public void dispose() {
127         try {
128             httpService.unregister("/ipcamera/" + handler.getThing().getUID().getId());
129             this.destroy();
130         } catch (IllegalArgumentException e) {
131             logger.warn("Unregistration of servlet failed:{}", e.getMessage());
132         }
133     }
134 }