]> git.basschouten.com Git - openhab-addons.git/blob
f8f817387f3198925e71b47c8574632df925e526
[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             httpService.registerServlet("/ipcamera/" + handler.getThing().getUID().getId(), this, initParameters,
63                     httpService.createDefaultHttpContext());
64         } catch (Exception e) {
65             logger.warn("Registering servlet failed:{}", e.getMessage());
66         }
67     }
68
69     protected void sendSnapshotImage(HttpServletResponse response, String contentType, byte[] snapshot) {
70         response.setHeader("Access-Control-Allow-Origin", "*");
71         response.setHeader("Access-Control-Expose-Headers", "*");
72         response.setContentType(contentType);
73         if (snapshot.length == 1) {
74             logger.warn("ipcamera.jpg was requested but there was no jpg in ram to send.");
75             return;
76         }
77         try {
78             response.setContentLength(snapshot.length);
79             ServletOutputStream servletOut = response.getOutputStream();
80             servletOut.write(snapshot);
81         } catch (IOException e) {
82         }
83     }
84
85     protected void sendString(HttpServletResponse response, String contents, String contentType) {
86         response.setHeader("Access-Control-Allow-Origin", "*");
87         response.setHeader("Access-Control-Expose-Headers", "*");
88         response.setContentType(contentType);
89         response.setHeader("Pragma", "no-cache");
90         response.setHeader("Cache-Control", "max-age=0, no-cache, no-store");
91         byte[] bytes = contents.getBytes();
92         try {
93             response.setContentLength(bytes.length);
94             ServletOutputStream servletOut = response.getOutputStream();
95             servletOut.write(bytes);
96             servletOut.write("\r\n".getBytes());
97         } catch (IOException e) {
98         }
99     }
100
101     protected void sendFile(HttpServletResponse response, String filename, String contentType) throws IOException {
102         File file = new File(filename);
103         if (!file.exists()) {
104             response.sendError(HttpServletResponse.SC_NOT_FOUND);
105             return;
106         }
107         response.setBufferSize((int) file.length());
108         response.setContentType(contentType);
109         response.setHeader("Access-Control-Allow-Origin", "*");
110         response.setHeader("Access-Control-Expose-Headers", "*");
111         response.setHeader("Content-Length", String.valueOf(file.length()));
112         response.setHeader("Pragma", "no-cache");
113         response.setHeader("Cache-Control", "max-age=0, no-cache, no-store");
114         BufferedInputStream input = null;
115         BufferedOutputStream output = null;
116         try {
117             input = new BufferedInputStream(new FileInputStream(file), (int) file.length());
118             output = new BufferedOutputStream(response.getOutputStream(), (int) file.length());
119             byte[] buffer = new byte[(int) file.length()];
120             int length;
121             while ((length = input.read(buffer)) > 0) {
122                 output.write(buffer, 0, length);
123             }
124         } finally {
125             if (output != null) {
126                 output.close();
127             }
128             if (input != null) {
129                 input.close();
130             }
131         }
132     }
133
134     public void dispose() {
135         try {
136             httpService.unregister("/ipcamera/" + handler.getThing().getUID().getId());
137             this.destroy();
138         } catch (IllegalArgumentException e) {
139             logger.warn("Unregistration of servlet failed:{}", e.getMessage());
140         }
141     }
142 }