Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
f0789fcd
Commit
f0789fcd
authored
Mar 15, 2003
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* httpd: begin to support get/post method (look at admin.html ;)
parent
fcbf0b13
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
292 additions
and
29 deletions
+292
-29
include/httpd.h
include/httpd.h
+4
-3
modules/misc/httpd.c
modules/misc/httpd.c
+288
-26
No files found.
include/httpd.h
View file @
f0789fcd
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
* httpd.h
* httpd.h
*****************************************************************************
*****************************************************************************
* Copyright (C) 2001-2003 VideoLAN
* Copyright (C) 2001-2003 VideoLAN
* $Id: httpd.h,v 1.
3 2003/03/06 11:09:56
fenrir Exp $
* $Id: httpd.h,v 1.
4 2003/03/15 00:09:31
fenrir Exp $
*
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
*
...
@@ -30,7 +30,7 @@ typedef struct httpd_file_t httpd_file_t;
...
@@ -30,7 +30,7 @@ typedef struct httpd_file_t httpd_file_t;
typedef
httpd_file_t
httpd_stream_t
;
typedef
httpd_file_t
httpd_stream_t
;
typedef
struct
httpd_file_callback_args_t
httpd_file_callback_args_t
;
typedef
struct
httpd_file_callback_args_t
httpd_file_callback_args_t
;
typedef
int
(
*
httpd_file_callback
)(
httpd_file_callback_args_t
*
p_args
,
uint8_t
**
pp_data
,
int
*
pi_data
);
typedef
int
(
*
httpd_file_callback
)(
httpd_file_callback_args_t
*
p_args
,
uint8_t
*
p_request
,
int
i_request
,
uint8_t
*
*
pp_data
,
int
*
pi_data
);
typedef
struct
httpd_sys_t
httpd_sys_t
;
typedef
struct
httpd_sys_t
httpd_sys_t
;
...
@@ -47,7 +47,8 @@ struct httpd_t
...
@@ -47,7 +47,8 @@ struct httpd_t
httpd_file_t
*
(
*
pf_register_file
)
(
httpd_t
*
,
httpd_file_t
*
(
*
pf_register_file
)
(
httpd_t
*
,
char
*
psz_file
,
char
*
psz_mime
,
char
*
psz_file
,
char
*
psz_mime
,
char
*
psz_user
,
char
*
psz_password
,
char
*
psz_user
,
char
*
psz_password
,
httpd_file_callback
pf_fill
,
httpd_file_callback
pf_get
,
httpd_file_callback
pf_post
,
httpd_file_callback_args_t
*
p_args
);
httpd_file_callback_args_t
*
p_args
);
void
(
*
pf_unregister_file
)
(
httpd_t
*
,
httpd_file_t
*
);
void
(
*
pf_unregister_file
)
(
httpd_t
*
,
httpd_file_t
*
);
...
...
modules/misc/httpd.c
View file @
f0789fcd
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
* httpd.c
* httpd.c
*****************************************************************************
*****************************************************************************
* Copyright (C) 2001-2003 VideoLAN
* Copyright (C) 2001-2003 VideoLAN
* $Id: httpd.c,v 1.
7 2003/03/06 11:09:56
fenrir Exp $
* $Id: httpd.c,v 1.
8 2003/03/15 00:09:31
fenrir Exp $
*
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
*
...
@@ -106,7 +106,8 @@ static void UnregisterHost ( httpd_t *, httpd_host_t * );
...
@@ -106,7 +106,8 @@ static void UnregisterHost ( httpd_t *, httpd_host_t * );
static
httpd_file_t
*
RegisterFile
(
httpd_t
*
,
static
httpd_file_t
*
RegisterFile
(
httpd_t
*
,
char
*
psz_file
,
char
*
psz_mime
,
char
*
psz_file
,
char
*
psz_mime
,
char
*
psz_user
,
char
*
psz_password
,
char
*
psz_user
,
char
*
psz_password
,
httpd_file_callback
pf_fill
,
httpd_file_callback
pf_get
,
httpd_file_callback
pf_post
,
httpd_file_callback_args_t
*
p_args
);
httpd_file_callback_args_t
*
p_args
);
static
void
UnregisterFile
(
httpd_t
*
,
httpd_file_t
*
);
static
void
UnregisterFile
(
httpd_t
*
,
httpd_file_t
*
);
...
@@ -153,7 +154,8 @@ struct httpd_file_t
...
@@ -153,7 +154,8 @@ struct httpd_file_t
vlc_bool_t
b_stream
;
/* if false: httpd will retreive data by a callback
vlc_bool_t
b_stream
;
/* if false: httpd will retreive data by a callback
true: it's up to the program to give data to httpd */
true: it's up to the program to give data to httpd */
void
*
p_sys
;
/* provided for user */
void
*
p_sys
;
/* provided for user */
httpd_file_callback
pf_fill
;
/* it should allocate and fill *pp_data and *pi_data */
httpd_file_callback
pf_get
;
/* it should allocate and fill *pp_data and *pi_data */
httpd_file_callback
pf_post
;
/* it should allocate and fill *pp_data and *pi_data */
/* private */
/* private */
...
@@ -173,7 +175,10 @@ struct httpd_file_t
...
@@ -173,7 +175,10 @@ struct httpd_file_t
#define HTTPD_CONNECTION_SENDING_HEADER 2
#define HTTPD_CONNECTION_SENDING_HEADER 2
#define HTTPD_CONNECTION_SENDING_FILE 3
#define HTTPD_CONNECTION_SENDING_FILE 3
#define HTTPD_CONNECTION_SENDING_STREAM 4
#define HTTPD_CONNECTION_SENDING_STREAM 4
#define HTTPD_CONNECTION_TO_BE_CLOSED 5
#define HTTPD_CONNECTION_METHOD_GET 1
#define HTTPD_CONNECTION_METHOD_POST 2
typedef
struct
httpd_connection_s
typedef
struct
httpd_connection_s
{
{
struct
httpd_connection_s
*
p_next
;
struct
httpd_connection_s
*
p_next
;
...
@@ -184,12 +189,16 @@ typedef struct httpd_connection_s
...
@@ -184,12 +189,16 @@ typedef struct httpd_connection_s
mtime_t
i_last_activity_date
;
mtime_t
i_last_activity_date
;
int
i_state
;
int
i_state
;
int
i_method
;
/* get/post */
char
*
psz_file
;
// file to be send
char
*
psz_file
;
// file to be send
int
i_http_error
;
// error to be send with the file
int
i_http_error
;
// error to be send with the file
char
*
psz_user
;
// if Authorization in the request header
char
*
psz_user
;
// if Authorization in the request header
char
*
psz_password
;
char
*
psz_password
;
uint8_t
*
p_request
;
// whith get: ?<*>, with post: main data
int
i_request_size
;
httpd_file_t
*
p_file
;
httpd_file_t
*
p_file
;
/* used while sending header and file */
/* used while sending header and file */
...
@@ -611,7 +620,8 @@ static void __RegisterFile( httpd_sys_t *p_httpt, httpd_file_t *p_file )
...
@@ -611,7 +620,8 @@ static void __RegisterFile( httpd_sys_t *p_httpt, httpd_file_t *p_file )
static
httpd_file_t
*
_RegisterFile
(
httpd_sys_t
*
p_httpt
,
static
httpd_file_t
*
_RegisterFile
(
httpd_sys_t
*
p_httpt
,
char
*
psz_file
,
char
*
psz_mime
,
char
*
psz_file
,
char
*
psz_mime
,
char
*
psz_user
,
char
*
psz_password
,
char
*
psz_user
,
char
*
psz_password
,
httpd_file_callback
pf_fill
,
httpd_file_callback
pf_get
,
httpd_file_callback
pf_post
,
httpd_file_callback_args_t
*
p_args
)
httpd_file_callback_args_t
*
p_args
)
{
{
httpd_file_t
*
p_file
;
httpd_file_t
*
p_file
;
...
@@ -651,7 +661,8 @@ static httpd_file_t *_RegisterFile( httpd_sys_t *p_httpt,
...
@@ -651,7 +661,8 @@ static httpd_file_t *_RegisterFile( httpd_sys_t *p_httpt,
p_file
->
b_stream
=
VLC_FALSE
;
p_file
->
b_stream
=
VLC_FALSE
;
p_file
->
p_sys
=
p_args
;
p_file
->
p_sys
=
p_args
;
p_file
->
pf_fill
=
pf_fill
;
p_file
->
pf_get
=
pf_get
;
p_file
->
pf_post
=
pf_post
;
p_file
->
i_buffer_size
=
0
;
p_file
->
i_buffer_size
=
0
;
p_file
->
i_buffer_last_pos
=
0
;
p_file
->
i_buffer_last_pos
=
0
;
...
@@ -670,12 +681,13 @@ static httpd_file_t *_RegisterFile( httpd_sys_t *p_httpt,
...
@@ -670,12 +681,13 @@ static httpd_file_t *_RegisterFile( httpd_sys_t *p_httpt,
static
httpd_file_t
*
RegisterFile
(
httpd_t
*
p_httpd
,
static
httpd_file_t
*
RegisterFile
(
httpd_t
*
p_httpd
,
char
*
psz_file
,
char
*
psz_mime
,
char
*
psz_file
,
char
*
psz_mime
,
char
*
psz_user
,
char
*
psz_password
,
char
*
psz_user
,
char
*
psz_password
,
httpd_file_callback
pf_fill
,
httpd_file_callback
pf_get
,
httpd_file_callback
pf_post
,
httpd_file_callback_args_t
*
p_args
)
httpd_file_callback_args_t
*
p_args
)
{
{
return
(
_RegisterFile
(
p_httpd
->
p_sys
,
return
(
_RegisterFile
(
p_httpd
->
p_sys
,
psz_file
,
psz_mime
,
psz_user
,
psz_password
,
psz_file
,
psz_mime
,
psz_user
,
psz_password
,
pf_
fill
,
p_args
)
);
pf_
get
,
pf_post
,
p_args
)
);
}
}
static
httpd_stream_t
*
_RegisterStream
(
httpd_sys_t
*
p_httpt
,
static
httpd_stream_t
*
_RegisterStream
(
httpd_sys_t
*
p_httpt
,
...
@@ -719,7 +731,8 @@ static httpd_stream_t *_RegisterStream( httpd_sys_t *p_httpt,
...
@@ -719,7 +731,8 @@ static httpd_stream_t *_RegisterStream( httpd_sys_t *p_httpt,
p_stream
->
b_stream
=
VLC_TRUE
;
p_stream
->
b_stream
=
VLC_TRUE
;
p_stream
->
p_sys
=
NULL
;
p_stream
->
p_sys
=
NULL
;
p_stream
->
pf_fill
=
NULL
;
p_stream
->
pf_get
=
NULL
;
p_stream
->
pf_post
=
NULL
;
p_stream
->
i_buffer_size
=
1024
*
1024
*
10
;
p_stream
->
i_buffer_size
=
1024
*
1024
*
10
;
p_stream
->
i_buffer_pos
=
0
;
p_stream
->
i_buffer_pos
=
0
;
...
@@ -901,7 +914,9 @@ static int HeaderStream( httpd_t *p_httpd, httpd_stream_t *p_stream,
...
@@ -901,7 +914,9 @@ static int HeaderStream( httpd_t *p_httpd, httpd_stream_t *p_stream,
/****************************************************************************/
/****************************************************************************/
/****************************************************************************/
/****************************************************************************/
static
int
httpd_page_401_fill
(
httpd_file_callback_args_t
*
p_args
,
uint8_t
**
pp_data
,
int
*
pi_data
)
static
int
httpd_page_401_get
(
httpd_file_callback_args_t
*
p_args
,
uint8_t
*
p_request
,
int
i_request
,
uint8_t
**
pp_data
,
int
*
pi_data
)
{
{
char
*
p
;
char
*
p
;
...
@@ -922,7 +937,9 @@ static int httpd_page_401_fill( httpd_file_callback_args_t *p_args, uint8_t **p
...
@@ -922,7 +937,9 @@ static int httpd_page_401_fill( httpd_file_callback_args_t *p_args, uint8_t **p
return
VLC_SUCCESS
;
return
VLC_SUCCESS
;
}
}
static
int
httpd_page_404_fill
(
httpd_file_callback_args_t
*
p_args
,
uint8_t
**
pp_data
,
int
*
pi_data
)
static
int
httpd_page_404_get
(
httpd_file_callback_args_t
*
p_args
,
uint8_t
*
p_request
,
int
i_request
,
uint8_t
**
pp_data
,
int
*
pi_data
)
{
{
char
*
p
;
char
*
p
;
...
@@ -944,12 +961,14 @@ static int httpd_page_404_fill( httpd_file_callback_args_t *p_args, uint8_t **p
...
@@ -944,12 +961,14 @@ static int httpd_page_404_fill( httpd_file_callback_args_t *p_args, uint8_t **p
return
VLC_SUCCESS
;
return
VLC_SUCCESS
;
}
}
static
int
httpd_page_admin_fill
(
httpd_file_callback_args_t
*
p_args
,
uint8_t
**
pp_data
,
int
*
pi_data
)
static
int
_httpd_page_admin_get_status
(
httpd_file_callback_args_t
*
p_args
,
uint8_t
**
pp_data
,
int
*
pi_data
)
{
{
httpd_sys_t
*
p_httpt
=
(
httpd_sys_t
*
)
p_args
;
httpd_sys_t
*
p_httpt
=
(
httpd_sys_t
*
)
p_args
;
httpd_connection_t
*
p_con
;
httpd_connection_t
*
p_con
;
char
*
p
;
int
i
;
int
i
;
char
*
p
;
/* FIXME FIXME do not use static size FIXME FIXME*/
/* FIXME FIXME do not use static size FIXME FIXME*/
p
=
*
pp_data
=
malloc
(
8096
);
p
=
*
pp_data
=
malloc
(
8096
);
...
@@ -1030,7 +1049,7 @@ static int httpd_page_admin_fill( httpd_file_callback_args_t *p_args, uint8_t *
...
@@ -1030,7 +1049,7 @@ static int httpd_page_admin_fill( httpd_file_callback_args_t *p_args, uint8_t *
/* XXX do not take lock on connection_lock */
/* XXX do not take lock on connection_lock */
p
+=
sprintf
(
p
,
"<h3>Connection list</h3>
\n
"
);
p
+=
sprintf
(
p
,
"<h3>Connection list</h3>
\n
"
);
p
+=
sprintf
(
p
,
"<table border=
\"
1
\"
cellspacing=
\"
0
\"
>
\n
"
);
p
+=
sprintf
(
p
,
"<table border=
\"
1
\"
cellspacing=
\"
0
\"
>
\n
"
);
p
+=
sprintf
(
p
,
"<tr>
\n
<th>IP</th><th>Requested File</th><th>Status</th>
\n
</tr>
\n
"
);
p
+=
sprintf
(
p
,
"<tr>
\n
<th>IP</th><th>Requested File</th><th>Status</th>
<th>Action</th>
\n
</tr>
\n
"
);
for
(
p_con
=
p_httpt
->
p_first_connection
;
p_con
!=
NULL
;
p_con
=
p_con
->
p_next
)
for
(
p_con
=
p_httpt
->
p_first_connection
;
p_con
!=
NULL
;
p_con
=
p_con
->
p_next
)
{
{
...
@@ -1038,6 +1057,14 @@ static int httpd_page_admin_fill( httpd_file_callback_args_t *p_args, uint8_t *
...
@@ -1038,6 +1057,14 @@ static int httpd_page_admin_fill( httpd_file_callback_args_t *p_args, uint8_t *
p
+=
sprintf
(
p
,
"<td>%s</td>
\n
"
,
inet_ntoa
(
p_con
->
sock
.
sin_addr
)
);
p
+=
sprintf
(
p
,
"<td>%s</td>
\n
"
,
inet_ntoa
(
p_con
->
sock
.
sin_addr
)
);
p
+=
sprintf
(
p
,
"<td>%s</td>
\n
"
,
p_con
->
psz_file
);
p
+=
sprintf
(
p
,
"<td>%s</td>
\n
"
,
p_con
->
psz_file
);
p
+=
sprintf
(
p
,
"<td>%d</td>
\n
"
,
p_con
->
i_http_error
);
p
+=
sprintf
(
p
,
"<td>%d</td>
\n
"
,
p_con
->
i_http_error
);
p
+=
sprintf
(
p
,
"<td><form method=
\"
get
\"
action=
\"\"
>"
"<select name=
\"
action
\"
>"
"<option selected>close_connection</option>"
"<option>ban_ip</option>"
"</select>"
"<input type=
\"
hidden
\"
name=
\"
id
\"
value=
\"
%p
\"
/>"
"<input type=
\"
submit
\"
value=
\"
Do it
\"
/>"
"</form></td>
\n
"
,
p_con
);
p
+=
sprintf
(
p
,
"</tr>
\n
"
);
p
+=
sprintf
(
p
,
"</tr>
\n
"
);
}
}
p
+=
sprintf
(
p
,
"</table>
\n
"
);
p
+=
sprintf
(
p
,
"</table>
\n
"
);
...
@@ -1051,6 +1078,149 @@ static int httpd_page_admin_fill( httpd_file_callback_args_t *p_args, uint8_t *
...
@@ -1051,6 +1078,149 @@ static int httpd_page_admin_fill( httpd_file_callback_args_t *p_args, uint8_t *
*
pi_data
=
strlen
(
*
pp_data
)
+
1
;
*
pi_data
=
strlen
(
*
pp_data
)
+
1
;
return
(
VLC_SUCCESS
);
}
static
int
_httpd_page_admin_get_success
(
httpd_file_callback_args_t
*
p_args
,
uint8_t
**
pp_data
,
int
*
pi_data
,
char
*
psz_msg
)
{
char
*
p
;
p
=
*
pp_data
=
malloc
(
8096
);
p
+=
sprintf
(
p
,
"<html>
\n
"
);
p
+=
sprintf
(
p
,
"<head>
\n
"
);
p
+=
sprintf
(
p
,
"<title>VideoLAN Client Stream Output</title>
\n
"
);
p
+=
sprintf
(
p
,
"</head>
\n
"
);
p
+=
sprintf
(
p
,
"<body>
\n
"
);
p
+=
sprintf
(
p
,
"<h1><center>VideoLAN Client Stream Output</center></h1>
\n
"
);
p
+=
sprintf
(
p
,
"<p>Success=`%s'</p>"
,
psz_msg
);
p
+=
sprintf
(
p
,
"<hr />
\n
"
);
p
+=
sprintf
(
p
,
"<a href=
\"
http://www.videolan.org
\"
>VideoLAN</a>
\n
"
);
p
+=
sprintf
(
p
,
"</body>
\n
"
);
p
+=
sprintf
(
p
,
"</html>
\n
"
);
*
pi_data
=
strlen
(
*
pp_data
)
+
1
;
return
(
VLC_SUCCESS
);
}
static
int
_httpd_page_admin_get_error
(
httpd_file_callback_args_t
*
p_args
,
uint8_t
**
pp_data
,
int
*
pi_data
,
char
*
psz_error
)
{
char
*
p
;
p
=
*
pp_data
=
malloc
(
8096
);
p
+=
sprintf
(
p
,
"<html>
\n
"
);
p
+=
sprintf
(
p
,
"<head>
\n
"
);
p
+=
sprintf
(
p
,
"<title>VideoLAN Client Stream Output</title>
\n
"
);
p
+=
sprintf
(
p
,
"</head>
\n
"
);
p
+=
sprintf
(
p
,
"<body>
\n
"
);
p
+=
sprintf
(
p
,
"<h1><center>VideoLAN Client Stream Output</center></h1>
\n
"
);
p
+=
sprintf
(
p
,
"<p>Error=`%s'</p>"
,
psz_error
);
p
+=
sprintf
(
p
,
"<hr />
\n
"
);
p
+=
sprintf
(
p
,
"<a href=
\"
http://www.videolan.org
\"
>VideoLAN</a>
\n
"
);
p
+=
sprintf
(
p
,
"</body>
\n
"
);
p
+=
sprintf
(
p
,
"</html>
\n
"
);
*
pi_data
=
strlen
(
*
pp_data
)
+
1
;
return
(
VLC_SUCCESS
);
}
static
void
_httpd_uri_extract_value
(
char
*
psz_uri
,
char
*
psz_name
,
char
*
psz_value
,
int
i_value_max
)
{
char
*
p
;
p
=
strstr
(
psz_uri
,
psz_name
);
if
(
p
)
{
int
i_len
;
p
+=
strlen
(
psz_name
);
if
(
*
p
==
'='
)
p
++
;
if
(
strchr
(
p
,
'&'
)
)
{
i_len
=
strchr
(
p
,
'&'
)
-
p
;
}
else
{
i_len
=
strlen
(
p
);
}
i_len
=
__MIN
(
i_value_max
-
1
,
i_len
);
if
(
i_len
>
0
)
{
strncpy
(
psz_value
,
p
,
i_len
);
psz_value
[
i_len
]
=
'\0'
;
}
else
{
strncpy
(
psz_value
,
""
,
i_value_max
);
}
}
else
{
strncpy
(
psz_value
,
""
,
i_value_max
);
}
}
static
int
httpd_page_admin_get
(
httpd_file_callback_args_t
*
p_args
,
uint8_t
*
p_request
,
int
i_request
,
uint8_t
**
pp_data
,
int
*
pi_data
)
{
httpd_sys_t
*
p_httpt
=
(
httpd_sys_t
*
)
p_args
;
httpd_connection_t
*
p_con
;
int
i
;
if
(
i_request
>
0
)
{
char
action
[
512
];
_httpd_uri_extract_value
(
p_request
,
"action"
,
action
,
512
);
if
(
!
strcmp
(
action
,
"close_connection"
)
)
{
char
id
[
128
];
void
*
i_id
;
_httpd_uri_extract_value
(
p_request
,
"id"
,
id
,
512
);
i_id
=
(
void
*
)
strtol
(
id
,
NULL
,
0
);
msg_Dbg
(
p_httpt
,
"requested closing connection id=%s %p"
,
id
,
i_id
);
for
(
p_con
=
p_httpt
->
p_first_connection
;
p_con
!=
NULL
;
p_con
=
p_con
->
p_next
)
{
if
(
(
void
*
)
p_con
==
i_id
)
{
/* XXX don't free p_con as it could be the one that it is sending ... */
p_con
->
i_state
=
HTTPD_CONNECTION_TO_BE_CLOSED
;
return
(
_httpd_page_admin_get_success
(
p_args
,
pp_data
,
pi_data
,
"connection closed"
)
);
}
}
return
(
_httpd_page_admin_get_error
(
p_args
,
pp_data
,
pi_data
,
"invalid id"
)
);
}
else
if
(
!
strcmp
(
action
,
"ban_ip"
)
)
{
msg_Dbg
(
p_httpt
,
"requested banning ip"
);
return
(
_httpd_page_admin_get_success
(
p_args
,
pp_data
,
pi_data
,
"ip banned"
)
);
}
else
{
return
(
_httpd_page_admin_get_error
(
p_args
,
pp_data
,
pi_data
,
action
)
);
}
}
else
{
return
(
_httpd_page_admin_get_status
(
p_args
,
pp_data
,
pi_data
)
);
}
return
VLC_SUCCESS
;
return
VLC_SUCCESS
;
}
}
...
@@ -1074,6 +1244,9 @@ static void httpd_ConnnectionNew( httpd_sys_t *p_httpt, int fd, struct sockaddr_
...
@@ -1074,6 +1244,9 @@ static void httpd_ConnnectionNew( httpd_sys_t *p_httpt, int fd, struct sockaddr_
p_con
->
psz_password
=
NULL
;
p_con
->
psz_password
=
NULL
;
p_con
->
p_file
=
NULL
;
p_con
->
p_file
=
NULL
;
p_con
->
i_request_size
=
0
;
p_con
->
p_request
=
NULL
;
p_con
->
i_buffer
=
0
;
p_con
->
i_buffer
=
0
;
p_con
->
i_buffer_size
=
8096
;
p_con
->
i_buffer_size
=
8096
;
p_con
->
p_buffer
=
malloc
(
p_con
->
i_buffer_size
);
p_con
->
p_buffer
=
malloc
(
p_con
->
i_buffer_size
);
...
@@ -1130,10 +1303,10 @@ static void httpd_ConnnectionClose( httpd_sys_t *p_httpt, httpd_connection_t *p_
...
@@ -1130,10 +1303,10 @@ static void httpd_ConnnectionClose( httpd_sys_t *p_httpt, httpd_connection_t *p_
FREE
(
p_con
->
p_buffer
);
FREE
(
p_con
->
p_buffer
);
SOCKET_CLOSE
(
p_con
->
fd
);
SOCKET_CLOSE
(
p_con
->
fd
);
FREE
(
p_con
->
psz_user
);
FREE
(
p_con
->
psz_user
);
FREE
(
p_con
->
psz_password
);
FREE
(
p_con
->
psz_password
);
FREE
(
p_con
->
p_request
);
free
(
p_con
);
free
(
p_con
);
}
}
...
@@ -1251,6 +1424,7 @@ static void httpd_ConnectionParseRequest( httpd_sys_t *p_httpt, httpd_connection
...
@@ -1251,6 +1424,7 @@ static void httpd_ConnectionParseRequest( httpd_sys_t *p_httpt, httpd_connection
//msg_Dbg( p_httpt, "new request=\n%s", p_con->p_buffer );
//msg_Dbg( p_httpt, "new request=\n%s", p_con->p_buffer );
p
=
p_con
->
p_buffer
;
p
=
p_con
->
p_buffer
;
p_end
=
p
+
strlen
(
p
)
+
1
;
p_end
=
p
+
strlen
(
p
)
+
1
;
...
@@ -1259,10 +1433,21 @@ static void httpd_ConnectionParseRequest( httpd_sys_t *p_httpt, httpd_connection
...
@@ -1259,10 +1433,21 @@ static void httpd_ConnectionParseRequest( httpd_sys_t *p_httpt, httpd_connection
httpd_RequestGetWord
(
version
,
32
,
&
p
,
p_end
);
httpd_RequestGetWord
(
version
,
32
,
&
p
,
p_end
);
//msg_Dbg( p_httpt, "ask =%s= =%s= =%s=", command, url, version );
//msg_Dbg( p_httpt, "ask =%s= =%s= =%s=", command, url, version );
if
(
strcmp
(
command
,
"GET"
)
)
p_con
->
p_request
=
NULL
;
p_con
->
i_request_size
=
0
;
if
(
!
strcmp
(
command
,
"GET"
)
)
{
p_con
->
i_method
=
HTTPD_CONNECTION_METHOD_GET
;
}
else
if
(
!
strcmp
(
command
,
"POST"
))
{
p_con
->
i_method
=
HTTPD_CONNECTION_METHOD_POST
;
}
else
{
{
/* unimplemented */
/* unimplemented */
p_con
->
psz_file
=
strdup
(
"/501.html"
);
p_con
->
psz_file
=
strdup
(
"/501.html"
);
p_con
->
i_method
=
HTTPD_CONNECTION_METHOD_GET
;
p_con
->
i_http_error
=
501
;
p_con
->
i_http_error
=
501
;
goto
create_header
;
goto
create_header
;
}
}
...
@@ -1288,6 +1473,10 @@ static void httpd_ConnectionParseRequest( httpd_sys_t *p_httpt, httpd_connection
...
@@ -1288,6 +1473,10 @@ static void httpd_ConnectionParseRequest( httpd_sys_t *p_httpt, httpd_connection
//msg_Dbg( p_httpt, "new line=%s", p );
//msg_Dbg( p_httpt, "new line=%s", p );
httpd_RequestGetWord
(
header
,
1024
,
&
p
,
p_end
);
httpd_RequestGetWord
(
header
,
1024
,
&
p
,
p_end
);
if
(
!
strcmp
(
header
,
"
\r\n
"
)
||
!
strcmp
(
header
,
"
\n
"
)
)
{
break
;
}
if
(
!
strcmp
(
header
,
"Authorization:"
)
)
if
(
!
strcmp
(
header
,
"Authorization:"
)
)
{
{
...
@@ -1316,7 +1505,47 @@ static void httpd_ConnectionParseRequest( httpd_sys_t *p_httpt, httpd_connection
...
@@ -1316,7 +1505,47 @@ static void httpd_ConnectionParseRequest( httpd_sys_t *p_httpt, httpd_connection
}
}
}
}
p_con
->
psz_file
=
strdup
(
url
);
if
(
strchr
(
url
,
'?'
)
)
{
char
*
p_request
=
strchr
(
url
,
'?'
);
*
p_request
++
=
'\0'
;
p_con
->
psz_file
=
strdup
(
url
);
p_con
->
p_request
=
strdup
(
p_request
);
p_con
->
i_request_size
=
strlen
(
p_con
->
p_request
);
}
else
{
p_con
->
psz_file
=
strdup
(
url
);
}
/* fix p_request */
if
(
p_con
->
i_method
==
HTTPD_CONNECTION_METHOD_POST
)
{
char
*
p_request
;
if
(
strstr
(
p_con
->
p_buffer
,
"
\r\n\r\n
"
)
)
{
p_request
=
strstr
(
p_con
->
p_buffer
,
"
\r\n\r\n
"
)
+
4
;
}
else
if
(
strstr
(
p_con
->
p_buffer
,
"
\n\n
"
)
)
{
p_request
=
strstr
(
p_con
->
p_buffer
,
"
\n\n
"
)
+
2
;
}
else
{
p_request
=
NULL
;
}
if
(
p_request
&&
p_request
<
p_end
)
{
p_con
->
i_request_size
=
p_end
-
p_request
;
p_con
->
p_request
=
malloc
(
p_con
->
i_request_size
+
1
);
memcpy
(
p_con
->
p_request
,
p_request
,
p_con
->
i_request_size
);
p_con
->
p_request
[
p_con
->
i_request_size
]
=
'\0'
;
}
}
p_con
->
i_http_error
=
200
;
p_con
->
i_http_error
=
200
;
create_header:
create_header:
...
@@ -1328,11 +1557,18 @@ create_header:
...
@@ -1328,11 +1557,18 @@ create_header:
//vlc_mutex_lock( &p_httpt->file_lock );
//vlc_mutex_lock( &p_httpt->file_lock );
search_file:
search_file:
/* search file */
/* search file */
for
(
i
=
0
,
p_con
->
p_file
=
NULL
;
i
<
p_httpt
->
i_file_count
;
i
++
)
p_con
->
p_file
=
NULL
;
for
(
i
=
0
;
i
<
p_httpt
->
i_file_count
;
i
++
)
{
{
if
(
!
strcmp
(
p_httpt
->
file
[
i
]
->
psz_file
,
p_con
->
psz_file
)
)
if
(
!
strcmp
(
p_httpt
->
file
[
i
]
->
psz_file
,
p_con
->
psz_file
)
)
{
{
p_con
->
p_file
=
p_httpt
->
file
[
i
];
if
(
p_httpt
->
file
[
i
]
->
b_stream
||
(
p_con
->
i_method
==
HTTPD_CONNECTION_METHOD_GET
&&
p_httpt
->
file
[
i
]
->
pf_get
)
||
(
p_con
->
i_method
==
HTTPD_CONNECTION_METHOD_POST
&&
p_httpt
->
file
[
i
]
->
pf_post
)
)
{
p_con
->
p_file
=
p_httpt
->
file
[
i
];
break
;
}
}
}
}
}
...
@@ -1422,17 +1658,20 @@ static void httpd_Thread( httpd_sys_t *p_httpt )
...
@@ -1422,17 +1658,20 @@ static void httpd_Thread( httpd_sys_t *p_httpt )
p_page_401
=
_RegisterFile
(
p_httpt
,
p_page_401
=
_RegisterFile
(
p_httpt
,
"/401.html"
,
"text/html"
,
"/401.html"
,
"text/html"
,
NULL
,
NULL
,
NULL
,
NULL
,
httpd_page_401_fill
,
httpd_page_401_get
,
NULL
,
(
httpd_file_callback_args_t
*
)
NULL
);
(
httpd_file_callback_args_t
*
)
NULL
);
p_page_404
=
_RegisterFile
(
p_httpt
,
p_page_404
=
_RegisterFile
(
p_httpt
,
"/404.html"
,
"text/html"
,
"/404.html"
,
"text/html"
,
NULL
,
NULL
,
NULL
,
NULL
,
httpd_page_404_fill
,
httpd_page_404_get
,
NULL
,
(
httpd_file_callback_args_t
*
)
NULL
);
(
httpd_file_callback_args_t
*
)
NULL
);
p_page_admin
=
_RegisterFile
(
p_httpt
,
p_page_admin
=
_RegisterFile
(
p_httpt
,
"/admin.html"
,
"text/html"
,
"/admin.html"
,
"text/html"
,
"admin"
,
"salut"
,
"admin"
,
"salut"
,
httpd_page_admin_fill
,
httpd_page_admin_get
,
NULL
,
(
httpd_file_callback_args_t
*
)
p_httpt
);
(
httpd_file_callback_args_t
*
)
p_httpt
);
while
(
!
p_httpt
->
b_die
)
while
(
!
p_httpt
->
b_die
)
...
@@ -1463,7 +1702,8 @@ static void httpd_Thread( httpd_sys_t *p_httpt )
...
@@ -1463,7 +1702,8 @@ static void httpd_Thread( httpd_sys_t *p_httpt )
for
(
p_con
=
p_httpt
->
p_first_connection
;
p_con
!=
NULL
;
)
for
(
p_con
=
p_httpt
->
p_first_connection
;
p_con
!=
NULL
;
)
{
{
/* no more than 10s of inactivity */
/* no more than 10s of inactivity */
if
(
p_con
->
i_last_activity_date
+
(
mtime_t
)
HTTPD_CONNECTION_MAX_UNUSED
<
mdate
()
)
if
(
p_con
->
i_last_activity_date
+
(
mtime_t
)
HTTPD_CONNECTION_MAX_UNUSED
<
mdate
()
||
p_con
->
i_state
==
HTTPD_CONNECTION_TO_BE_CLOSED
)
{
{
httpd_connection_t
*
p_next
=
p_con
->
p_next
;
httpd_connection_t
*
p_next
=
p_con
->
p_next
;
...
@@ -1598,8 +1838,14 @@ static void httpd_Thread( httpd_sys_t *p_httpt )
...
@@ -1598,8 +1838,14 @@ static void httpd_Thread( httpd_sys_t *p_httpt )
int
i_len
;
int
i_len
;
/* write data */
/* write data */
i_len
=
send
(
p_con
->
fd
,
p_con
->
p_buffer
+
p_con
->
i_buffer
,
p_con
->
i_buffer_size
-
p_con
->
i_buffer
,
0
);
if
(
p_con
->
i_buffer_size
-
p_con
->
i_buffer
>
0
)
{
i_len
=
send
(
p_con
->
fd
,
p_con
->
p_buffer
+
p_con
->
i_buffer
,
p_con
->
i_buffer_size
-
p_con
->
i_buffer
,
0
);
}
else
{
i_len
=
0
;
}
// msg_Warn( p_httpt, "on %d send %d bytes %s", p_con->i_buffer_size, i_len, p_con->p_buffer + p_con->i_buffer );
// msg_Warn( p_httpt, "on %d send %d bytes %s", p_con->i_buffer_size, i_len, p_con->p_buffer + p_con->i_buffer );
if
(
(
i_len
<
0
&&
errno
!=
EAGAIN
&&
errno
!=
EINTR
)
||
if
(
(
i_len
<
0
&&
errno
!=
EAGAIN
&&
errno
!=
EINTR
)
||
...
@@ -1626,7 +1872,23 @@ static void httpd_Thread( httpd_sys_t *p_httpt )
...
@@ -1626,7 +1872,23 @@ static void httpd_Thread( httpd_sys_t *p_httpt )
if
(
!
p_con
->
p_file
->
b_stream
)
if
(
!
p_con
->
p_file
->
b_stream
)
{
{
p_con
->
i_state
=
HTTPD_CONNECTION_SENDING_FILE
;
// be sure to out from HTTPD_CONNECTION_SENDING_HEADER
p_con
->
i_state
=
HTTPD_CONNECTION_SENDING_FILE
;
// be sure to out from HTTPD_CONNECTION_SENDING_HEADER
p_con
->
p_file
->
pf_fill
(
p_con
->
p_file
->
p_sys
,
&
p_con
->
p_buffer
,
&
p_con
->
i_buffer_size
);
if
(
p_con
->
i_method
==
HTTPD_CONNECTION_METHOD_GET
)
{
p_con
->
p_file
->
pf_get
(
p_con
->
p_file
->
p_sys
,
p_con
->
p_request
,
p_con
->
i_request_size
,
&
p_con
->
p_buffer
,
&
p_con
->
i_buffer_size
);
}
else
if
(
p_con
->
i_method
==
HTTPD_CONNECTION_METHOD_POST
)
{
p_con
->
p_file
->
pf_post
(
p_con
->
p_file
->
p_sys
,
p_con
->
p_request
,
p_con
->
i_request_size
,
&
p_con
->
p_buffer
,
&
p_con
->
i_buffer_size
);
}
else
{
p_con
->
p_buffer
=
NULL
;
p_con
->
i_buffer_size
=
0
;
}
}
}
else
else
{
{
...
@@ -1702,7 +1964,7 @@ static void httpd_Thread( httpd_sys_t *p_httpt )
...
@@ -1702,7 +1964,7 @@ static void httpd_Thread( httpd_sys_t *p_httpt )
p_con
=
p_con
->
p_next
;
p_con
=
p_con
->
p_next
;
continue
;
/* just for clarity */
continue
;
/* just for clarity */
}
}
else
else
if
(
p_con
->
i_state
!=
HTTPD_CONNECTION_TO_BE_CLOSED
)
{
{
msg_Warn
(
p_httpt
,
"cannot occur (Invalid p_con->i_state)"
);
msg_Warn
(
p_httpt
,
"cannot occur (Invalid p_con->i_state)"
);
p_con
=
p_con
->
p_next
;
p_con
=
p_con
->
p_next
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment