view release on metacpan or search on metacpan
eg/Hello/tmpl/include/header.tt view on Meta::CPAN
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Hello</title>
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<link href="[% uri_for('/static/css/main.css') %]" rel="stylesheet" type="text/css" media="screen" />
</head>
<body>
<div id="Container">
<div id="Header">
<a href="[% uri_for('/') %]">Amon2 Startup Page</a>
</div>
eg/LongPoll/chat.psgi view on Meta::CPAN
__PACKAGE__->enable_middleware('Lint');
__PACKAGE__->to_app(handle_static => 1);
__DATA__
@@ index.tt
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>WS</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" src="https://raw.github.com/beppu/jquery-ev/master/jquery.ev.js"></script>
<link rel="stylesheet" href="http://twitter.github.com/bootstrap/1.4.0/bootstrap.min.css">
</head>
<body>
<div class="container">
<header><h1>WS</h1></header>
<section class="row">
eg/realtime-chat/chat.psgi view on Meta::CPAN
__PACKAGE__->enable_middleware('Lint');
__PACKAGE__->to_app(handle_static => 1);
__DATA__
@@ index.tt
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>WS</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">
</head>
<body data-host_port="[% c().req.uri.host_port %]">
<div class="container">
<header><h1>WS</h1></header>
<div class="row">
<form id="form">
lib/Amon2/Plugin/Web/JSON.pm view on Meta::CPAN
# for IE7 JSON venularity.
# see http://www.atmarkit.co.jp/fcoding/articles/webapp/05/webapp05a.html
my $output = $_JSON->canonical( $conf->{canonical} ? 1 : 0 )->encode($stuff);
$output =~ s!([+<>])!$_ESCAPE{$1}!g;
my $user_agent = $c->req->user_agent || '';
# defense from JSON hijacking
if ((!$c->request->header('X-Requested-With')) && $user_agent =~ /android/i && defined $c->req->header('Cookie') && ($c->req->method||'GET') eq 'GET') {
my $res = $c->create_response(403);
$res->content_type('text/html; charset=utf-8');
$res->content("Your request may be JSON hijacking.\nIf you are not an attacker, please add 'X-Requested-With' header to each request.");
$res->content_length(length $res->content);
return $res;
}
my $res = $c->create_response(200);
my $encoding = $c->encoding();
$encoding = lc($encoding->mime_name) if ref $encoding;
$res->content_type("application/json; charset=$encoding");
$res->header( 'X-Content-Type-Options' => 'nosniff' ); # defense from XSS
$res->content_length(length($output));
$res->body($output);
if (defined (my $status_code_field = $conf->{status_code_field})) {
$res->header( 'X-API-Status' => $stuff->{$status_code_field} ) if exists $stuff->{$status_code_field};
}
return $res;
});
lib/Amon2/Plugin/Web/Streaming.pm view on Meta::CPAN
}
);
}
sub _streaming_json {
my ($self, $code) = @_;
return Amon2::Web::Response::Callback->new(
code => sub {
my $respond = shift;
my $writer = $respond->([200, ['Content-Type' => 'application/json;charset=utf-8']]);
my $longpoll_ctx = Amon2::Plugin::Web::Streaming::Writer->new(
$self,
$writer
);
$code->($longpoll_ctx);
}
);
}
lib/Amon2/Setup/Asset/jQuery.pm view on Meta::CPAN
sub tags {
<<',,,';
<script src="<: uri_for('/static/js/jquery-3.6.1.min.js') :>"></script>
,,,
}
sub files {
return {
'js/jquery-3.6.1.min.js' => '/*! jQuery v3.6.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */
!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof windo...
'
}
;
}
# for backward compatibility
sub run {
warn "THIS METHOD WAS DEPRECATED";
my ($self, $flavor) = @_;
$flavor->mkpath('static/js/');
lib/Amon2/Web.pm view on Meta::CPAN
use Plack::Util;
# -------------------------------------------------------------------------
# Hook points:
# You can override these methods.
sub create_request { Amon2::Web::Request->new($_[1], $_[0]) }
sub create_response { shift; Amon2::Web::Response->new(@_) }
sub create_view { die "This is abstract method: create_view" }
sub dispatch { die "This is abstract method: dispatch" }
sub html_content_type { 'text/html; charset=UTF-8' }
BEGIN {
my $encoding = Encode::find_encoding('utf-8') || die;
sub encoding { $encoding }
}
sub session {
my $self = shift;
my $klass = ref $self || $self;
require Plack::Session;
lib/Amon2/Web.pm view on Meta::CPAN
}
sub create_simple_status_page {
my ($self, $code, $message) = @_;
my $codestr = Plack::Util::encode_html($code);
$message = Plack::Util::encode_html($message);
my $content = <<"...";
<!doctype html>
<html>
<head>
<meta charset=utf-8 />
<title>$codestr $message</title>
<style type="text/css">
body {
text-align: center;
font-family: 'Menlo', 'Monaco', Courier, monospace;
background-color: whitesmoke;
padding-top: 10%;
}
.number {
font-size: 800%;
lib/Amon2/Web.pm view on Meta::CPAN
</head>
<body>
<div class="number">$codestr</div>
<div class="message">$message</div>
</body>
</html>
...
$self->create_response(
$code,
[
'Content-Type' => 'text/html; charset=utf-8',
'Content-Length' => length($content),
],
[$content]
);
}
sub res_403 {
my ($self) = @_;
return $self->create_simple_status_page(403, 'Forbidden');
}
share/flavor/Basic/static/__STATUS__.html view on Meta::CPAN
<!doctype html>
<html>
<head>
<meta charset=utf-8 />
<style type="text/css">
body {
text-align: center;
font-family: 'Menlo', 'Monaco', Courier, monospace;
background-color: whitesmoke;
padding-top: 10%;
}
.number {
font-size: 800%;
font-weight: bold;
share/flavor/Basic/tmpl/include/layout.tx view on Meta::CPAN
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title><: $title || '<%= $dist %>' :></title>
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0" />
<meta name="format-detection" content="telephone=no" />
<% $tags -%>
<link href="<: static_file('/static/css/main.css') :>" rel="stylesheet" type="text/css" media="screen" />
<script src="<: static_file('/static/js/main.js') :>"></script>
<!--[if lt IE 9]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
share/flavor/Large/tmpl/admin/include/layout.tx view on Meta::CPAN
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title><: $title || '<%= $dist %>' :></title>
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0"]]>
<meta name="format-detection" content="telephone=no" />
<% $tags %>
<link href="<: static_file('/static/css/admin.css') :>" rel="stylesheet" type="text/css" media="screen" />
<script src="<: static_file('/static/js/main.js') :>"></script>
<!--[if lt IE 9]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
share/flavor/Minimum/tmpl/index.tx view on Meta::CPAN
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title><% $module %></title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<% $module %>
</body>
</html>
t/600_plugins/007_json.t view on Meta::CPAN
'Web::JSON',
);
sub encoding { 'utf-8' }
}
my $c = MyApp::Web->new(request => Amon2::Web::Request->new(+{}));
# normal
{
my $res = $c->render_json(+{"foo"=>"bar"});
is $res->status, 200;
is $res->header('Content-Type'), 'application/json; charset=utf-8';
is $res->content, '{"foo":"bar"}';
}
# xss
{
my $src = { "foo" => "<script>alert(document.location)</script>" };
my $res = $c->render_json($src);
is $res->status, 200;
is $res->header('Content-Type'), 'application/json; charset=utf-8';
is $res->content, '{"foo":"\u003cscript\u003ealert(document.location)\u003c/script\u003e"}';
is_deeply decode_json($res->content), $src;
}
done_testing;
t/600_plugins/007_json_default_encoding.t view on Meta::CPAN
);
}
my $ua_opera = 'Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; ja) Opera 10.10';
my $ua_safari = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; ja-jp) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16';
my $ua_chrome = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10';
{
my $c = MyApp::Web->new(request => Amon2::Web::Request->new(+{}));
my $res = $c->render_json(+{"foo"=>"bar"});
is $res->status, 200;
is $res->header('Content-Type'), 'application/json; charset=utf-8';
is $res->content, '{"foo":"bar"}';
}
{
my $c = MyApp::Web->new(request => Amon2::Web::Request->new(+{
HTTP_USER_AGENT => $ua_opera
}));
my $res = $c->render_json(+{"foo"=>"bar"});
is $res->status, 200;
is $res->header('Content-Type'), 'application/json; charset=utf-8';
is $res->content, '{"foo":"bar"}';
}
{
my $c = MyApp::Web->new(request => Amon2::Web::Request->new(+{
HTTP_USER_AGENT => $ua_safari
}));
my $res = $c->render_json(+{"foo"=>"bar"});
is $res->status, 200;
is $res->header('Content-Type'), 'application/json; charset=utf-8';
is $res->content, '{"foo":"bar"}';
}
{
my $c = MyApp::Web->new(request => Amon2::Web::Request->new(+{
HTTP_USER_AGENT => $ua_chrome
}));
my $res = $c->render_json(+{"foo"=>"bar"});
is $res->status, 200;
is $res->header('Content-Type'), 'application/json; charset=utf-8';
is $res->content, '{"foo":"bar"}';
}
{
my $c = MyApp::Web->new(request => Amon2::Web::Request->new(+{
HTTP_USER_AGENT => $ua_chrome,
HTTP_X_REQUESTED_WITH => 'XMLHttpRequest'
}));
my $res = $c->render_json(+{"foo"=>"bar"});
is $res->status, 200;
is $res->header('Content-Type'), 'application/json; charset=utf-8';
is $res->content, '{"foo":"bar"}';
}
done_testing;
t/600_plugins/007_json_keysort.t view on Meta::CPAN
__PACKAGE__->load_plugins(
'Web::JSON' => { canonical => 1 }
);
}
my $c = MyApp::Web->new(request => Amon2::Web::Request->new(+{}));
{
my $res = $c->render_json(+{ a=>1, b=>2, c=>3, d=>4, e=>5, f=>6, g=>7, h=>8, i=>9 });
is $res->status, 200;
is $res->header('Content-Type'), 'application/json; charset=utf-8';
is $res->content, q|{"a":1,"b":2,"c":3,"d":4,"e":5,"f":6,"g":7,"h":8,"i":9}|;
}
done_testing;