1 /* MiniDLNA project
2  *
3  * http://sourceforge.net/projects/minidlna/
4  *
5  * MiniDLNA media server
6  * Copyright (C) 2008-2012  Justin Maggard
7  *
8  * This file is part of MiniDLNA.
9  *
10  * MiniDLNA is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License version 2 as
12  * published by the Free Software Foundation.
13  *
14  * MiniDLNA is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with MiniDLNA. If not, see <http://www.gnu.org/licenses/>.
21  *
22  * Portions of the code from the MiniUPnP project:
23  *
24  * Copyright (c) 2006-2007, Thomas Bernard
25  * All rights reserved.
26  *
27  * Redistribution and use in source and binary forms, with or without
28  * modification, are permitted provided that the following conditions are met:
29  *     * Redistributions of source code must retain the above copyright
30  *       notice, this list of conditions and the following disclaimer.
31  *     * Redistributions in binary form must reproduce the above copyright
32  *       notice, this list of conditions and the following disclaimer in the
33  *       documentation and/or other materials provided with the distribution.
34  *     * The name of the author may not be used to endorse or promote products
35  *       derived from this software without specific prior written permission.
36  *
37  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
38  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
39  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
40  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
41  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
42  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
43  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
44  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
45  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
47  * POSSIBILITY OF SUCH DAMAGE.
48  */
49 #ifndef __UPNPHTTP_H__
50 #define __UPNPHTTP_H__
51 
52 #include <netinet/in.h>
53 #include <sys/queue.h>
54 
55 #include "minidlnatypes.h"
56 #include "config.h"
57 
58 /* server: HTTP header returned in all HTTP responses : */
59 #define MINIDLNA_SERVER_STRING	OS_VERSION " DLNADOC/1.50 UPnP/1.0 " SERVER_NAME "/" MINIDLNA_VERSION
60 
61 /*
62  states :
63   0 - waiting for data to read
64   1 - waiting for HTTP Post Content.
65   ...
66   >= 100 - to be deleted
67 */
68 enum httpCommands {
69 	EUnknown = 0,
70 	EGet,
71 	EPost,
72 	EHead,
73 	ESubscribe,
74 	EUnSubscribe
75 };
76 
77 struct upnphttp {
78 	struct event ev;
79 	struct in_addr clientaddr;	/* client address */
80 	int iface;
81 	int state;
82 	char HttpVer[16];
83 	/* request */
84 	char * req_buf;
85 	int req_buflen;
86 	int req_contentlen;
87 	int req_contentoff;     /* header length */
88 	enum httpCommands req_command;
89 	struct client_cache_s * req_client;
90 	const char * req_soapAction;
91 	int req_soapActionLen;
92 	const char * req_Callback;	/* For SUBSCRIBE */
93 	int req_CallbackLen;
94 	const char * req_NT;
95 	int req_NTLen;
96 	int req_Timeout;
97 	const char * req_SID;		/* For UNSUBSCRIBE */
98 	int req_SIDLen;
99 	off_t req_RangeStart;
100 	off_t req_RangeEnd;
101 	long int req_chunklen;
102 	uint32_t reqflags;
103 	/* response */
104 	char * res_buf;
105 	int res_buflen;
106 	int res_buf_alloclen;
107 	uint32_t respflags;
108 	/*int res_contentlen;*/
109 	/*int res_contentoff;*/		/* header length */
110 	LIST_ENTRY(upnphttp) entries;
111 };
112 
113 #define FLAG_TIMEOUT            0x00000001
114 #define FLAG_SID                0x00000002
115 #define FLAG_RANGE              0x00000004
116 #define FLAG_HOST               0x00000008
117 #define FLAG_LANGUAGE           0x00000010
118 
119 #define FLAG_INVALID_REQ        0x00000040
120 #define FLAG_HTML               0x00000080
121 
122 #define FLAG_CHUNKED            0x00000100
123 #define FLAG_TIMESEEK           0x00000200
124 #define FLAG_REALTIMEINFO       0x00000400
125 #define FLAG_PLAYSPEED          0x00000800
126 #define FLAG_XFERSTREAMING      0x00001000
127 #define FLAG_XFERINTERACTIVE    0x00002000
128 #define FLAG_XFERBACKGROUND     0x00004000
129 #define FLAG_CAPTION            0x00008000
130 
131 #ifndef MSG_MORE
132 #define MSG_MORE 0
133 #endif
134 
135 /* New_upnphttp() */
136 struct upnphttp *
137 New_upnphttp(int);
138 
139 /* CloseSocket_upnphttp() */
140 void
141 CloseSocket_upnphttp(struct upnphttp *);
142 
143 /* Delete_upnphttp() */
144 void
145 Delete_upnphttp(struct upnphttp *);
146 
147 /* BuildHeader_upnphttp()
148  * build the header for the HTTP Response
149  * also allocate the buffer for body data */
150 void
151 BuildHeader_upnphttp(struct upnphttp * h, int respcode,
152                      const char * respmsg,
153                      int bodylen);
154 
155 /* BuildResp_upnphttp()
156  * fill the res_buf buffer with the complete
157  * HTTP 200 OK response from the body passed as argument */
158 void
159 BuildResp_upnphttp(struct upnphttp *, const char *, int);
160 
161 /* BuildResp2_upnphttp()
162  * same but with given response code/message */
163 void
164 BuildResp2_upnphttp(struct upnphttp * h, int respcode,
165                     const char * respmsg,
166                     const char * body, int bodylen);
167 
168 /* Error messages */
169 void
170 Send500(struct upnphttp *);
171 void
172 Send501(struct upnphttp *);
173 
174 /* SendResp_upnphttp() */
175 void
176 SendResp_upnphttp(struct upnphttp *);
177 
178 #endif
179 
180