|
105 | 105 | end |
106 | 106 | end |
107 | 107 | end |
| 108 | + |
| 109 | + describe '.follow_redirects' do |
| 110 | + it 'handles relative URLs in redirects' do |
| 111 | + http_mock = double('http') |
| 112 | + redirect_response = double('redirect_response') |
| 113 | + success_response = double('success_response') |
| 114 | + |
| 115 | + # First request returns redirect with relative URL |
| 116 | + allow(redirect_response).to receive(:kind_of?).with(Net::HTTPSuccess).and_return(false) |
| 117 | + allow(redirect_response).to receive(:kind_of?).with(Net::HTTPRedirection).and_return(true) |
| 118 | + allow(Net::HTTPSuccess).to receive(:===).with(redirect_response).and_return(false) |
| 119 | + allow(Net::HTTPRedirection).to receive(:===).with(redirect_response).and_return(true) |
| 120 | + allow(redirect_response).to receive(:[]).with('location').and_return('/new-path') |
| 121 | + allow(redirect_response).to receive(:code).and_return('302') |
| 122 | + |
| 123 | + # Second request succeeds |
| 124 | + allow(success_response).to receive(:kind_of?).with(Net::HTTPSuccess).and_return(true) |
| 125 | + allow(success_response).to receive(:kind_of?).with(Net::HTTPRedirection).and_return(false) |
| 126 | + allow(Net::HTTPSuccess).to receive(:===).with(success_response).and_return(true) |
| 127 | + allow(Net::HTTPRedirection).to receive(:===).with(success_response).and_return(false) |
| 128 | + allow(success_response).to receive(:body).and_return('success') |
| 129 | + allow(success_response).to receive(:code).and_return('200') |
| 130 | + |
| 131 | + call_count = 0 |
| 132 | + allow(Net::HTTP).to receive(:start) do |host, port, _opts, &block| |
| 133 | + call_count += 1 |
| 134 | + expect(host).to eq('example.com') |
| 135 | + expect(port).to eq(443) |
| 136 | + allow(http_mock).to receive(:request) do |
| 137 | + call_count == 1 ? redirect_response : success_response |
| 138 | + end |
| 139 | + block.call(http_mock) |
| 140 | + end |
| 141 | + |
| 142 | + result = U3d::Utils.follow_redirects('https://example.com/original') do |_request, response| |
| 143 | + response.body |
| 144 | + end |
| 145 | + |
| 146 | + expect(result).to eql('success') |
| 147 | + expect(call_count).to eq(2) |
| 148 | + end |
| 149 | + end |
108 | 150 | end |
109 | 151 | end |
0 commit comments