Невозможно передать пользовательский заголовок с помощью модуля perl HTTP::Request::Generator

#perl

#perl

Вопрос:

Я использую atom и тестирую HTTP::Request::Generator модуль PERL. Приведенный ниже код работает по большей части, но я не могу отправлять файлы cookie или заголовки, он отображает только заголовки по умолчанию, даже если я установил их в своем коде.

 use strict;
use warnings;
use HTTP::Request::Generator 'generate_requests';
use LWP::UserAgent;

my $ua = 'LWP::UserAgent'->new;

my $gen = generate_requests(
    method  => 'GET',
    host    => [  'https://abc.ai/' ],
    pattern => 'https://abc.ai',

    headers => {
        "User-Agent" => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64',
        "Cookie" => '_abc',
    },
    wrap    => sub {
        my ( $req ) = @_;
        # Fix up some values
        $req->{'headers'}{'Content-Length'} = 666;
    },
    wrap => amp;HTTP::Request::Generator::as_http_request,
);

while ( my $req = $gen->() ) {
    my $response = $ua->request( $req );
    # print $response->protocol, ' ', $response->status_line, "n";
    print $req->headers->as_string, "n";
    print $req->as_string();
    # Do something with $response here?

    if ($response->is_success) {
        #  print $response->decoded_content;
        print $response ->header('title');
    }
    else {
        die $response->status_line;
    }
}
  

Вывод
User-Agent: libwww-perl/6.31
Login

На title странице указано, что я не зарегистрировался в этом файле cookie, и я протестировал его, используя curl я могу вручную войти в систему и получить требуемый ресурс. Почему он не работает для perl, как получить доступ к моим параметрам заголовка в коде выше. Спасибо.

Решение

 body_params => {
       comment => ['Some comment', 'Another comment, A  '],
   },
  

Решил проблему, добавив приведенный выше код.

Комментарии:

1. Я привел в порядок отступ вашего кода. Пожалуйста, пожалуйста, подумайте о том, чтобы сделать это самостоятельно в следующий раз. Тщательный ввод отступов — мощный инструмент, помогающий людям понять ваш код, и если вы просите группу незнакомых людей прочитать и понять ваш код, вежливо сделать это как можно проще для них.

2. @DaveCross Я согласен, извините за неудобства, в следующий раз я буду осторожен

3. Существует ошибка as_http_request() : он отбросит ваши заголовки, если body_params они не были переданы, чтобы generate_requests() попытаться добавить фиктивный body_params => {comment=>['test']}, файл, и вы, по крайней мере, получите объект HR, содержащий ваши заголовки. Я вижу больше проблем, хотя, например, content_length заканчивается как aref.

Ответ №1:

Вы не можете предоставить один и тот же параметр ( wrap ) дважды:

     wrap    => sub {
        my ( $req ) = @_;
        # Fix up some values
        $req->{'headers'}{'Content-Length'} = 666;
    },
    wrap => amp;HTTP::Request::Generator::as_http_request,
  

Это может сработать, хотя:

     wrap    => sub {
        my ( $req ) = @_;
        # Fix up some values
        $req->{'headers'}{'Content-Length'} = 666;
        
        return HTTP::Request::Generator::as_http_request( $req );
    },
  

Также headers появляется опция для получения arrayref из hashrefs, например:

     headers => [
        {
            "User-Agent" => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
            "Cookie" => '_abc',
        },
    ],
  

Я предполагаю, что причина этого в том, что вы можете предоставить альтернативные наборы заголовков:

     headers => [
        {
            "User-Agent" => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
            "Cookie" => '_abc',
        },
        {
            "User-Agent" => 'Mozilla/1.0 (Hoover Vacuum Cleaner)',
            "Cookie" => '_def',
        },
    ],
  

Таким образом, ваш генератор запросов может генерировать два запроса для каждой страницы, используя разные User-Agent строки или разные файлы cookie (поэтому они вошли в систему как разные пользователи), или разные Accept заголовки, или что-то еще.

Комментарии:

1. я попробовал и получил тот же ответ User-Agent: libwww-perl/6.31 User-Agent: libwww-perl/6.31 Login , я чувствую, что он полностью игнорирует заголовки

2. Ваш анкилоз на месте, да, модуль в основном является генератором шаблонов HTTP-запросов, поэтому есть веская причина использовать этот синтаксис, как вы сказали, например, два запроса на страницу. Позвольте мне попробовать этот новый код.