1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
/*
* httpresource.h: VDR on Smart TV plugin
*
* Copyright (C) 2012 Thorsten Lohmar
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
*/
#ifndef __HTTPREQUEST_H__
#define __HTTPREQUEST_H__
#include <string>
#include <cstring>
#include <pthread.h>
#include "log.h"
using namespace std;
struct cRange {
cRange(): isRangeRequest(false), begin(0), end(0) {};
bool isRangeRequest;
unsigned long long begin;
unsigned long long end;
};
struct sQueryAVP {
string attribute;
string value;
sQueryAVP(string a, string v) : attribute (a), value(v) {};
};
enum eConnState {
WAITING,
READHDR,
READPAYLOAD,
SERVING,
TOCLOSE
};
enum eContentType {
NYD, // Not Yet Defined
VDRDIR,
SINGLEFILE,
MEMBLOCK
};
struct sFileEntry {
string sName;
string sPath;
int sStart;
sFileEntry(string n, string l, int s) : sName(n), sPath(l), sStart(s) {
};
};
class SmartTvServer;
class cResumeEntry;
class cHttpResource {
public:
cHttpResource(int, int, string, int, SmartTvServer*);
virtual ~cHttpResource();
int handleRead();
int handleWrite();
int checkStatus();
int readFromClient();
void threadLoop();
int run();
private:
SmartTvServer* mFactory;
Log* mLog;
string mServerAddr;
int mServerPort;
int mFd;
int mReqId;
time_t mConnTime;
int mHandleReadCount;
bool mConnected;
eConnState mConnState;
eContentType mContentType;
string mReadBuffer;
string mMethod;
string *mResponseMessage;
int mResponseMessagePos;
char* mBlkData;
int mBlkPos;
int mBlkLen;
// string path;
string mRequest;
string mQuery;
string mPath;
string mDir;
string mVersion;
string protocol;
unsigned long long mReqContentLength;
string mPayload;
string mUserAgent;
bool mAcceptRanges;
cRange rangeHdr;
unsigned long long mFileSize;
uint mRemLength;
FILE *mFile;
int mVdrIdx;
string mFileStructure;
bool mIsRecording;
float mRecProgress;
// int writeToClient(const char *buf, size_t buflen);
// int sendDataChunk();
void setNonBlocking();
int fillDataBlk();
int handlePost();
int processRequest();
int processHttpHeaderNew();
int readRequestPayload();
// int processHttpHeader();
void sendError(int status, const char *title, const char *extra, const char *text);
int sendDir(struct stat *statbuf);
int sendVdrDir(struct stat *statbuf);
int sendRecordingsHtml (struct stat *statbuf);
int sendRecordingsXml (struct stat *statbuf);
int sendChannelsXml (struct stat *statbuf);
int sendEpgXml (struct stat *statbuf);
int sendMediaXml (struct stat *statbuf);
// int sendMPD (struct stat *statbuf);
int sendManifest (struct stat *statbuf, bool is_hls = true);
void writeM3U8(float duration, float seg_dur, int end_seg);
void writeMPD(float duration, float seg_dur, int end_seg);
int sendMediaSegment (struct stat *statbuf);
void sendHeaders(int status, const char *title, const char *extra, const char *mime,
long long int length, time_t date);
int sendFile(struct stat *statbuf);
// Helper Functions
const char *getMimeType(const char *name);
string getConnStateName();
void checkRecording();
int parseRangeHeaderValue(string);
int parseHttpRequestLine(string);
int parseHttpHeaderLine (string);
int parseQueryLine (vector<sQueryAVP> *avps);
int parseResume(cResumeEntry &entry, string &id);
int parseFiles(vector<sFileEntry> *entries, string prefix, string dir_base, string dir_name, struct stat *statbuf);
int getQueryAttributeValue(vector<sQueryAVP> *avps, string id, string &val);
int openFile(const char *name);
int writeXmlItem(string title, string link, string programme, string desc, string guid, time_t start, int dur);
// string removeEtChar(string line);
// string hexDump(string input);
// string convertUrl(string input);
// string convertBack(string input);
};
#endif
|