WinInet - ¿Cómo obtener la URL del servidor después de la redirección 301?

Estoy programando con funciones de WinInet en C++ pero encontré un problema.

Mi programa abre una URL con HttpOpenRequest(), HttpSendRequest(), InternetReadFile()... funciona y guarda los datos de salida. Necesito guardar la URL con los datos de salida, pero en algunos casos el servidor me da 301 Moved y InternetReadFile() lee el archivo de la nueva dirección.

Está bien, pero necesito saber qué dirección es. traté de usar HttpQueryInfo con HTTP_QUERY_RAW_HEADERS_CRLF pero no obtuve esta información, solo Content-Type, Cache-Control, Cookies, etc. Cuando uso HTTP_QUERY_CONTENT_LOCATION o algo similar me sale ERROR_HTTP_HEADER_NOT_FOUND.

¿Me puedes ayudar?

preguntado el 22 de mayo de 12 a las 18:05

2 Respuestas

Después de que WinInet recibe una respuesta de redirección, envía automáticamente una nueva solicitud HTTP a la nueva URL de forma predeterminada. Para cuando WinInet esté listo para que comience a leer datos de archivos con InternetReadFile(), los encabezados que están disponibles en ese momento pertenecen a la última URL solicitada, que puede no ser la misma URL que solicitó originalmente. Es por eso que no estás viendo ver un Location encabezamiento. Para procesar los encabezados de una respuesta de redirección, debe especificar el INTERNET_FLAG_NO_AUTO_REDIRECT bandera al llamar HttpOpenRequest(), entonces puedes usar HttpQueryInfo() para detectar un código de estado de redirección y leer su Location encabezado antes de llamar HttpSendRequest() para solicitar la nueva URL a la que se redirigirá.

contestado el 22 de mayo de 12 a las 20:05

Cuando una redirección ocurre automáticamente en wininet, puede obtener la URL de redirección usando un InternetStatusCallback función. Código INTERNET_STATUS_REDIRECT (110) proporcionará un búfer con la nueva URL a la función de devolución de llamada. Puedes usar InternetSetStatusCallback() al HINTERNET handle para establecer una función de devolución de llamada para la solicitud.

Respondido 25 ago 15, 22:08

De hecho, esta es una forma posible, y probablemente sea más fácil de manejar que la respuesta aceptada. - Sergio Ballesta

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.