File Coverage

lib/WebService/Gyazo.pm
Criterion Covered Total %
statement 62 74 83.7
branch 19 28 67.8
condition 17 23 73.9
subroutine 14 14 100.0
pod 6 6 100.0
total 118 145 81.3


line stmt bran cond sub pod time code
1             package WebService::Gyazo;
2              
3 5     5   7279 use strict;
  5         8  
  5         325  
4 5     5   26 use warnings;
  5         8  
  5         164  
5              
6 5     5   2537 use WebService::Gyazo::Image;
  5         10  
  5         136  
7              
8 5     5   80173 use LWP::UserAgent;
  5         595569  
  5         182  
9 5     5   8789 use LWP::Protocol::socks;
  5         775784  
  5         185  
10 5     5   5805 use HTTP::Request::Common;
  5         11835  
  5         436  
11 5     5   4181 use URI::Simple;
  5         6199  
  5         267  
12              
13             our $VERSION = 0.03;
14              
15             use constant {
16 5         4610 HTTP_PROXY => 'http',
17             SOCKS4_PROXY => 'socks4',
18             SOCKS5_PROXY => 'socks',
19             HTTPS_PROXY => 'https',
20 5     5   32 };
  5         10  
21              
22             sub new {
23 4     4 1 3713 my ($self, %args) = @_;
24 4         17 $self = bless(\%args, $self);
25              
26 4         13 return $self;
27             }
28              
29             # Получить текст ошибки
30             sub error {
31 95     95 1 1002 my ($self) = @_;
32 95 100       401 return ($self->{error}?$self->{error}:'N/A');
33             }
34              
35             sub isError {
36 2     2 1 3 my ($self) = @_;
37 2 100       10 return ($self->{error}?1:0);
38             }
39              
40             # Установить прокси
41             sub setProxy {
42 88     88 1 46095 my ($self, $proxyStr) = @_;
43            
44             # Если был передан
45 88 50       173 if ($proxyStr) {
46            
47             # Выбираем из него ip и port
48             #my ($protocol, $ip, $port) = $proxyStr =~ m#(\w+)://(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):(\d{1,5})#;
49              
50 88         269 my $proxyUrl = URI::Simple->new($proxyStr);
51 88   50     6958 my ($protocol, $ip, $port) = ( $proxyUrl->protocol, $proxyUrl->host, ($proxyUrl->port || '80') );
52             #print "\n\$protocol=$protocol\n\$ip=$ip\n\$port=$port\n";
53              
54 88 50 33     2289 if ( defined($protocol) and defined($ip) and defined($port) ) {
      33        
55            
56 88 100 100     477 unless ( $protocol eq HTTP_PROXY or $protocol eq HTTPS_PROXY or $protocol eq SOCKS4_PROXY or $protocol eq SOCKS5_PROXY ) {
      100        
      100        
57 36         75 $self->{error} = "Wrong protocol type [".$protocol."]";
58 36         238 return 0;
59             }
60              
61             # Проверяем правильность введённых значений
62 52 100       105 if ( $port <= 65535 ) {
63 40         92 $self->{proxy} = $protocol.'://'.$ip.':'.$port;
64 40         244 return 1;
65             } else {
66 12         25 $self->{error} = 'Error proxy format!';
67 12         309 return 0;
68             }
69            
70             # Иначе возращяем отрицание
71             } else {
72 0         0 $self->{proxy} = 'Wrong proxy protocol, ip or port!';
73 0         0 return 0;
74             }
75            
76             } else {
77             # Иначе возвращяем отрицание
78 0         0 $self->{error} = 'Undefined proxy value!';
79 0         0 return 0;
80             }
81             }
82              
83             # Назнначяем ID
84             sub setId {
85 5     5 1 2610 my ($self, $id) = @_;
86              
87             # Проверяем длинну ID
88 5 100 66     52 if ( defined($id) and $id =~ m#^\w+$# and length($id) <= 14 ) {
      100        
89 3         11 $self->{id} = $id;
90 3         12 return 1;
91             } else {
92             # Иначе возращяем отрицание
93 2         5 $self->{error} = 'Wrong id syntax!';
94 2         8 return 0;
95             }
96             }
97              
98             # Загружаем файл
99             sub uploadFile {
100 1     1 1 543 my ($self, $file) = @_;
101              
102             # Назначаем ID если он не был назначен
103 1 50       11 unless ($self->{id}) {
104 1         9 $self->{id} = time();
105             }
106            
107             # Проверяем был ли передан путь к файлу
108 1 50       5 unless (defined $file) {
109 0         0 $self->{error} = 'Wrong file location!';
110 0         0 return 0;
111             }
112            
113             # Проверяем, файл ли это
114 1 50       30 unless (-f $file) {
115 0         0 $self->{error} = 'It\'s not file!';
116 0         0 return 0;
117             }
118              
119             # Проверяем возможность считать файл
120 1 50       16 unless (-r $file) {
121 0         0 $self->{error} = 'File not readable!';
122 0         0 return 0;
123             }
124              
125             # создаём объект браузера
126 1 50       28 $self->{ua} = LWP::UserAgent->new('agent' => 'Gyazo/'.$VERSION) unless (defined $self->{ua});
127              
128             # Назначаем прокси если он были передан
129 1 50       10052 $self->{ua}->proxy(['http'], $self->{proxy}.'/') if ($self->{proxy});
130              
131             # создаём объект для POST-запроса
132 1         13 my $req = POST('http://gyazo.com/upload.cgi',
133             'Content_Type' => 'form-data',
134             'Content' => [
135             'id' => $self->{id},
136             'imagedata' => [$file],
137             ]
138             );
139              
140             # выполняем POST-запрос и проверяем ответ
141 1         39167 my $res = $self->{ua}->request($req);
142 1 50       1578474 if (my ($id) = ($res->content) =~ m#http://gyazo.com/(\w+)#is) {
143 1         29 return WebService::Gyazo::Image->new(id => $id);
144             } else {
145 0           $self->{error} = "Cent parsed URL in the:\n".$res->as_string."\n";
146 0           return 0;
147             }
148            
149             }
150              
151             1;
152              
153             __END__