... | ... |
@@ -2,95 +2,6 @@ package Gitprep::SmartHTTP; |
2 | 2 |
|
3 | 3 |
use Mojo::Base -base; |
4 | 4 |
|
5 |
-use File::Spec::Functions; |
|
6 |
-use Symbol qw(gensym); |
|
7 |
-use IPC::Open3; |
|
8 |
-use IO::Select; |
|
9 |
-use IO::Uncompress::Gunzip qw($GunzipError); |
|
10 |
- |
|
11 |
-use constant BUFFER_SIZE => 8192; |
|
12 |
- |
|
13 | 5 |
has buffer_size => 8192; |
14 | 6 |
|
15 |
-our $VERSION = '0.05'; |
|
16 |
-my @SERVICES = ( |
|
17 |
- [ 'POST', 'service_rpc', qr{(.*?)/git-upload-pack$}, 'upload-pack' ], |
|
18 |
- [ 'POST', 'service_rpc', qr{(.*?)/git-receive-pack$}, 'receive-pack' ], |
|
19 |
-); |
|
20 |
- |
|
21 |
-sub service_rpc { |
|
22 |
- my $self = shift; |
|
23 |
- my $args = shift; |
|
24 |
- |
|
25 |
- my $req = $args->{req}; |
|
26 |
- my $rpc = $args->{rpc}; |
|
27 |
- |
|
28 |
- return $self->return_403 |
|
29 |
- unless $self->has_access( $req, $rpc, 1 ); |
|
30 |
- |
|
31 |
- my @cmd = $self->git_command( $rpc, '--stateless-rpc', '.' ); |
|
32 |
- |
|
33 |
- my $input = $req->input; |
|
34 |
- if ( exists $req->env->{HTTP_CONTENT_ENCODING} |
|
35 |
- && $req->env->{HTTP_CONTENT_ENCODING} =~ /^(?:x-)?gzip$/ ) |
|
36 |
- { |
|
37 |
- $input = IO::Uncompress::Gunzip->new($input); |
|
38 |
- unless ($input) { |
|
39 |
- $req->env->{'psgi.errors'}->print("gunzip failed: $GunzipError"); |
|
40 |
- return $self->return_400; |
|
41 |
- } |
|
42 |
- } |
|
43 |
- my ( $cout, $cerr ) = ( gensym, gensym ); |
|
44 |
- my $pid = open3( my $cin, $cout, $cerr, @cmd ); |
|
45 |
- my $input_len = 0; |
|
46 |
- while ( my $len = $input->read( my $buf, BUFFER_SIZE ) > 0 ) { |
|
47 |
- print $cin $buf; |
|
48 |
- $input_len += $len; |
|
49 |
- } |
|
50 |
- close $cin; |
|
51 |
- if ( $input_len == 0 ) { |
|
52 |
- close $cout; |
|
53 |
- close $cerr; |
|
54 |
- waitpid( $pid, 0 ); |
|
55 |
- return $self->return_400; |
|
56 |
- } |
|
57 |
- |
|
58 |
- return sub { |
|
59 |
- my $respond = shift; |
|
60 |
- my $writer = $respond->( |
|
61 |
- [ |
|
62 |
- 200, |
|
63 |
- [ |
|
64 |
- 'Content-Type' => |
|
65 |
- sprintf( 'application/x-git-%s-result', $rpc ), |
|
66 |
- ] |
|
67 |
- ] |
|
68 |
- ); |
|
69 |
- |
|
70 |
- my ( $out, $err, $buf ) = ( '', '', '' ); |
|
71 |
- my $s = IO::Select->new( $cout, $cerr ); |
|
72 |
- while ( my @ready = $s->can_read ) { |
|
73 |
- for my $handle (@ready) { |
|
74 |
- while ( sysread( $handle, $buf, BUFFER_SIZE ) ) { |
|
75 |
- if ( $handle == $cerr ) { |
|
76 |
- $err .= $buf; |
|
77 |
- } |
|
78 |
- else { |
|
79 |
- $writer->write($buf); |
|
80 |
- } |
|
81 |
- } |
|
82 |
- $s->remove($handle) if eof($handle); |
|
83 |
- } |
|
84 |
- } |
|
85 |
- close $cout; |
|
86 |
- close $cerr; |
|
87 |
- waitpid( $pid, 0 ); |
|
88 |
- |
|
89 |
- if ($err) { |
|
90 |
- $req->env->{'psgi.errors'}->print("git command failed: $err"); |
|
91 |
- } |
|
92 |
- $writer->close(); |
|
93 |
- } |
|
94 |
-} |
|
95 |
- |
|
96 | 7 |
1; |
... | ... |
@@ -1,6 +1,7 @@ |
1 | 1 |
<% |
2 | 2 |
use IPC::Open3 ();; |
3 | 3 |
use Symbol (); |
4 |
+ use IO::Select (); |
|
4 | 5 |
|
5 | 6 |
my $service = param('service') || ''; |
6 | 7 |
my $user = param('user'); |
... | ... |
@@ -18,7 +19,7 @@ |
18 | 19 |
my $pid = IPC::Open3::open3(my $cin, $cout, $cerr, @cmd ); |
19 | 20 |
close $cin; |
20 | 21 |
my ( $refs, $err, $buf ) = ( '', '', '' ); |
21 |
- my $s = IO::Select->new( $cout, $cerr ); |
|
22 |
+ my $s = IO::Select->new($cout, $cerr); |
|
22 | 23 |
my $buffer_size = $sh->buffer_size; |
23 | 24 |
while (my @ready = $s->can_read) { |
24 | 25 |
for my $handle (@ready) { |