adnan007d
adnan007d

Reputation: 13

HTTP Redirect giving the same url (original) as Location header

I am trying to fetch data from a website using sockets and I am getting a redirect but the redirect is same as the previous url

The below code works perfectly

import requests
    
r = requests.get('https://links.papareact.com/f90',
                 allow_redirects=False)
    
print(r.status_code)
print(r.headers["location"])

Here is the output Location header is new url

301
http://pngimg.com/uploads/amazon/amazon_PNG11.png

Here is the socket code which behaves weird

import socket

HOST = "links.papareact.com"
PORT = 80
path = "f90"

headers = f"GET /{path} HTTP/1.1\r\n" + \
    f"Host: {HOST}\r\n\r\n"

connection = (HOST, PORT)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect(connection)

s.send(headers.encode())

while True:
    data = s.recv(4096).decode().strip()
    if data.endswith("\r\n\r\n") or not data:
        break
    print(data)

Output

HTTP/1.1 301 Moved Permanently
Date: Tue, 17 Aug 2021 09:15:33 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: max-age=3600
Expires: Tue, 17 Aug 2021 10:15:33 GMT
Location: https://links.papareact.com/f90
Report-To: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=0ptwEG6zbfCPDGYczBruC%2FNuMmmsfwqSd6emUpu2aRIa9JtNvIpV3rcWZjfdMrP7EV9EM94UxTx4XbEk4P6KBk4PIb%2BLxPrwitq1Fo10u%2FtGnJnCFqFFh8XGutpJsIy13zCaUYGf"}],"group":"cf-nel","max_age":604800}
NEL: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
Server: cloudflare
CF-RAY: 6801cc6c5d301d14-BLR
alt-svc: h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400, h3=":443"; ma=86400

Here the Location Header is same as the previous url

Please explain why is this happening and a possible solution to get the expected result ? :(

Upvotes: 1

Views: 922

Answers (1)

Steffen Ullrich
Steffen Ullrich

Reputation: 123270

Here is the socket code which behaves weird

Nothing weird here. The redirect is according to the location header to https:// (encrypted, port 443) while your original request was for http:// (not encrypted, port 80).

This is a pretty common behavior of web sites that they redirect a plain HTTP request to the same path with HTTPS. If you then access this new (HTTPS) location you would likely get the same redirect as you did with your requests.get('https://..., i.e. to http://pngimg.com/uploads/amazon/amazon_PNG11.png.

Upvotes: 2

Related Questions