Roxen.git
/
server
/
plugins
/
protocols
/
prot_https.pike
version
»
Context lines:
10
20
40
80
file
none
3
Roxen.git/server/plugins/protocols/prot_https.pike:1:
// This is a ChiliMoon protocol module. // Copyright © 2001, Roxen IS.
-
// $Id: prot_https.pike,v 2.
8
2003
/
01
/
23
16:
21:
02
mani Exp $
+
// $Id: prot_https.pike,v 2.
9
2004
/
04
/
03
21:
55:18
mani Exp $
// --- Debug defines --- #ifdef SSL3_DEBUG # define SSL3_WERR(X) werror("SSL3: "+X+"\n") #else # define SSL3_WERR(X) #endif inherit SSLProtocol;
Roxen.git/server/plugins/protocols/prot_https.pike:24:
{ string in = ""; string out; string default_prefix; int port; Stdio.File f; void die() { SSL3_WERR(sprintf("fallback_redirect_request::die()"));
+
f->set_blocking();
f->close();
-
destruct(f);
-
destruct(this_object());
+
}
-
void write_callback(
object id
)
+
void write_callback()
{ SSL3_WERR(sprintf("fallback_redirect_request::write_callback()"));
-
int written =
id
->write(out);
+
int written =
f
->write(out);
if (written <= 0) die();
-
+
else {
out = out[written..]; if (!strlen(out)) die(); }
-
+
}
-
void read_callback(
object
id
, string s)
+
void read_callback(
mixed
ignored
, string s)
{
-
SSL3_WERR(sprintf("fallback_redirect_request::read_callback(X,
\"
%
s\"
)\n", s));
+
SSL3_WERR(sprintf("fallback_redirect_request::read_callback(X, %
O
)\n", s));
in += s; string name; string prefix; if (has_value(in, "\r\n\r\n")) { // werror("request = '%s'\n", in); array(string) lines = in / "\r\n"; array(string) req = replace(lines[0], "\t", " ") / " "; if (sizeof(req) < 2)
Roxen.git/server/plugins/protocols/prot_https.pike:99:
} } out = sprintf("HTTP/1.0 301 Redirect to secure server\r\n" "Location: %s%s\r\n\r\n", prefix, name); } f->set_read_callback(0); f->set_write_callback(write_callback); } }
-
void create(
object
socket, string s, string l, int p)
+
void create(
Stdio.File
socket, string s, string l, int p)
{
-
SSL3_WERR(sprintf("fallback_redirect_request(X,
\"
%
s\"
,
\"
%
s\"
, %
d
)", s, l||"CONFIG PORT", p));
+
SSL3_WERR(sprintf("fallback_redirect_request(X, %
O
, %
O
, %
O
)", s, l||"CONFIG PORT", p));
f = socket; default_prefix = l; port = p; f->set_nonblocking(read_callback, 0, die);
-
f->set_id(f);
+
read_callback(f, s); }
-
+
+
string _sprintf(int t) {
+
return t=='O' && sprintf("fallback_redirect_request(%O)", f);
}
-
+
}
class http_fallback {
-
object
my_fd;
+
SSL.sslfile
my_fd;
void ssl_alert_callback(object alert, object|int n, string data) {
-
SSL3_WERR(sprintf("http_fallback(X, %O,
\"
%
s\"
)", n, data));
+
SSL3_WERR(sprintf("http_fallback(X, %O, %
O
)", n, data));
// trace(1);
-
if ( (my_fd->current_write_state->seq_num == 0)
+
if ( (my_fd->
query_connection()->
current_write_state->seq_num == 0)
&& has_value(lower_case(data), "http")) {
-
object
raw_fd = my_fd->
socket
;
-
my_fd->socket = 0;
+
Stdio.File
raw_fd = my_fd->
shutdown()
;
/* Redirect to a https-url */
-
// my_fd->set_close_callback(0);
-
// my_fd->leave_me_alone = 1;
+
fallback_redirect_request(raw_fd, data, my_fd->config && my_fd->config->query("MyWorldLocation"), port);
-
destruct(my_fd);
-
destruct(this_object());
+
} }
-
void ssl_accept_callback(
object
id
)
+
void ssl_accept_callback(
mixed
ignored
)
{ SSL3_WERR(sprintf("ssl_accept_callback(X)"));
-
id
->set_alert_callback(0); /* Forget about http_fallback */
+
my_fd
->set_alert_callback(0); /* Forget about http_fallback */
+
my_fd->set_accept_callback(0);
my_fd = 0; /* Not needed any more */ }
-
void create(
object
fd)
+
void create(
SSL.sslfile
fd)
{ my_fd = fd; fd->set_alert_callback(ssl_alert_callback); fd->set_accept_callback(ssl_accept_callback); }
-
+
+
string _sprintf(int t) {
+
return t=='O' && sprintf("http_fallback(%O)", my_fd);
}
-
+
}
-
object
accept()
+
SSL.sslfile
accept()
{
-
object
q = ::accept();
+
SSL.sslfile
q = ::accept();
if (q) { http_fallback(q); } return q; } int set_cookie, set_cookie_only_once; void fix_cvars( Variable.Variable a ) {