Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

post after redirect the response cookie loss #570

Closed
zhaobingss opened this issue Jul 19, 2019 · 4 comments
Closed

post after redirect the response cookie loss #570

zhaobingss opened this issue Jul 19, 2019 · 4 comments

Comments

@zhaobingss
Copy link

I set client_builder.cookie_store(true), and send a post request after redirect the response cookie loss, the res.headers() got noting, please help.

@seanmonstar
Copy link
Owner

Could you provide more details as to what is happening exactly? What code are you using, what requests are you making, what are the server responses, etc?

@pfernie
Copy link
Contributor

pfernie commented Aug 8, 2019

This seems similar to #510 which was addressed in #514 and included in release v.0.9.16 (bf5a268), released around the time this issue was filed.

Can you confirm whether this is another case of the behavior, or if that release addresses it.

@zhaobingss
Copy link
Author

zhaobingss commented Aug 9, 2019

@seanmonstar
@pfernie
my code like this, please

[dependencies]
reqwest = "0.9.18"

the http_client.rs

extern crate reqwest;

use std::collections::HashMap;
use std::fs::OpenOptions;
use std::io::{BufWriter, Write};
use std::path::Path;
use std::sync::mpsc;
use std::sync::mpsc::TryRecvError;
use std::time::Duration;

use reqwest::{Body, Client, Method, Proxy, RedirectPolicy, Request, Response, Url};
use reqwest::header::{HeaderMap, HeaderName, HeaderValue};

static ERR_STATUS: u16 = 9999;

#[derive(Debug)]
pub struct HttpRequest {
    pub url: String,
    pub method: String,
    pub param: String,
    pub charset: String,
    // http://pro.xy
    pub proxy_url: String,
    pub header: HashMap<String, String>,
    // milliseconds
    pub timeout: u64,
    pub redirects: usize,
    pub is_gzip: bool,
    pub is_redirect: bool,
    pub is_raw: bool,
}

impl HttpRequest {
    pub fn new() -> HttpRequest {
        let mut req = HttpRequest {
            url: "".to_string(),
            method: "GET".to_string(),
            param: "".to_string(),
            charset: "".to_string(),
            proxy_url: "".to_string(),
            header: HashMap::new(),
            timeout: 0,
            redirects: 10,
            is_gzip: false,
            is_redirect: false,
            is_raw: false,
        };
        req.header.insert("user-agent".to_string(), "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36".to_string());
        req.header.insert("accept".to_string(), ": text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3".to_string());
        req
    }
}

impl Clone for HttpRequest {
    fn clone(&self) -> Self {
        HttpRequest {
            url: self.url.clone(),
            method: self.method.clone(),
            param: self.param.clone(),
            charset: self.charset.clone(),
            proxy_url: self.proxy_url.clone(),
            header: self.header.clone(),
            timeout: self.timeout,
            redirects: self.redirects,
            is_gzip: self.is_gzip,
            is_redirect: self.is_redirect,
            is_raw: self.is_raw,
        }
    }
}

#[derive(Debug)]
pub struct HttpResponse {
    pub status: u16,
    pub header: HashMap<String, String>,
    pub body: String,
    pub raw: Vec<u8>,
    pub cookie: String,
    pub err: String,
}

impl HttpResponse {
    pub fn new() -> HttpResponse {
        HttpResponse {
            status: ERR_STATUS,
            header: HashMap::new(),
            body: "".to_string(),
            cookie: "".to_string(),
            raw: Vec::new(),
            err: "".to_string(),
        }
    }
}

impl Clone for HttpResponse {
    fn clone(&self) -> Self {
        HttpResponse {
            status: self.status,
            header: self.header.clone(),
            body: self.body.clone(),
            cookie: self.cookie.clone(),
            raw: self.raw.clone(),
            err: self.err.clone(),
        }
    }
}

pub fn do_request(request: &HttpRequest) -> HttpResponse {
    let mut result = HttpResponse::new();

    // set url
    let url = Url::parse(request.url.as_str());
    if url.is_err() {
        result.err.push_str(format!("url is not correct: {:?}", url.unwrap()).as_str());
        return result;
    }

    // set method
    let (method, err) = if request.method == "GET" {
        (Method::GET, None)
    } else if request.method == "POST" {
        (Method::POST, None)
    } else {
        (Method::GET, Some(String::from("not support method")))
    };
    if err != None {
        result.err.push_str(err.unwrap().as_str());
        return result;
    }

    // make request object
    let mut req = Request::new(method, url.unwrap());

    // set request body
    let mut p = String::new();
    p.push_str(request.param.as_str());
    *req.body_mut() = Option::Some(Body::from(p));

    // set request header
    let mut header = HeaderMap::new();
    let req_header = request.header.clone();
    for (key, value) in req_header {// this place may cause crash , because not duplicate from_bytes result !
        header.insert(HeaderName::from_bytes(key.as_bytes()).unwrap(), HeaderValue::from_str(value.as_str()).unwrap());
    }
    *req.headers_mut() = header;

    // make a client builder
    let client_builder = Client::builder();
    let client_builder = client_builder.cookie_store(true);
    let client_builder = client_builder.danger_accept_invalid_hostnames(true);
    let client_builder = client_builder.danger_accept_invalid_certs(true);

    // set redirect
    let redirect_policy = if !request.is_redirect {
        RedirectPolicy::none()
    } else {
        RedirectPolicy::limited(request.redirects)
    };
    let client_builder = client_builder.redirect(redirect_policy);

    // set timeout
    let timeout = if request.timeout == 0 {
        Option::Some(Duration::from_millis(30000))
    } else {
        Option::Some(Duration::from_millis(request.timeout))
    };
    let client_builder = client_builder.timeout(timeout);

    // set auto gzip
    let client_builder = client_builder.gzip(request.is_gzip);

    // set proxy
    let client_builder = if request.proxy_url == "" {
        client_builder
    } else {
        client_builder.proxy(Proxy::all(request.proxy_url.as_str()).unwrap())
    };

    // build client and send request
    let client = client_builder.build().unwrap();
    let response = client.execute(req);
    if response.is_err() {
        result.err.push_str(format!("request error: {:?}", response.unwrap()).as_str());
        return result;
    }

    let mut res: Response = response.unwrap();

    // set response status
    result.status = res.status().as_u16();

    // set response header
    let rsp_header = res.headers();
    for (key, val) in rsp_header.iter() {
        let k = String::from(key.as_str());
        let v = String::from(val.to_str().unwrap());
        result.header.insert(k, v);
    }

    // set response cookie
    let mut cookie = String::new();
    let rsp_cookie = res.cookies();
    for ck in rsp_cookie {
        cookie.push_str(ck.name());
        cookie.push_str("=");
        cookie.push_str(ck.value());
        cookie.push_str(";");
    }
    result.cookie = cookie;

    // set response body
    if request.is_raw {
        let _ = res.copy_to(&mut result.raw);
    }
    let body = if !request.charset.is_empty() {
        res.text_with_charset(request.charset.as_str())
    } else {
        res.text()
    };
    if body.is_err() {
        result.err.push_str(format!("get response body error: {:?}", body.unwrap()).as_str());
        return result;
    }
    result.body = body.unwrap();


    result
}

the main.rs

mod http_client;
use http_client::HttpRequest;

fn main() {
    let mut req = HttpRequest::new();
    req.url = String::from("https://booking2.airasia.com/LoginAgent.aspx");
    req.header.insert("Accept".to_string(), "text/html, application/xhtml+xml, */*".to_string());
    req.header.insert("Referer".to_string(), "https://www.airasia.com/cn/zh/login/travel-agent.page".to_string());
    req.header.insert("Accept-Language".to_string(), "zh-CN".to_string());
    req.header.insert("User-Agent".to_string(), "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko".to_string());
    req.header.insert("Content-Type".to_string(), "application/x-www-form-urlencoded".to_string());
    req.header.insert("Accept-Encoding".to_string(), "gzip, deflate".to_string());
    req.header.insert("Host".to_string(), "booking2.airasia.com".to_string());
    req.header.insert("Connection".to_string(), "Keep-Alive".to_string());
    req.header.insert("Cache-Control".to_string(), "no-cache".to_string());
    req.param = "TimeZoneDiff=480&__EVENTTARGET=ControlGroupLoginAgentView%24AgentLoginView%24LinkButtonLogIn&__EVENTARGUMENT=&pageToken=&ControlGroupLoginAgentView%24AgentLoginView%24TextBoxUserID=CNCHONGQIN_YC&ControlGroupLoginAgentView%24AgentLoginView%24PasswordFieldPassword=123".to_string();
    req.timeout = 20000;
    req.is_redirect = true;
    req.redirects = 10;
    req.is_gzip = true;
    req.method = "POST".to_string();
    let res = http_client::do_request(&req);
    println!("{:#?}", res);
}

the result

HttpResponse {
    status: 200,
    header: {
        "x-powered-by": "ASP.NET",
        "x-frame-options": "sameorigin",
        "timing-allow-origin": "*",
        "x-ruxit-js-agent": "true",
        "content-type": "text/html; charset=utf-8",
        "connection": "keep-alive",
        "x-oneagent-js-injection": "true",
        "eagleid": "7ca5db9a15653297841447218e",
        "server": "Tengine",
        "cache-control": "no-cache, no-store",
        "date": "Fri, 09 Aug 2019 05:49:44 GMT",
        "x-aspnet-version": "4.0.30319",
        "vary": "Accept-Encoding",
        "via": "cache29.l2ot7-1[308,0], cache18.l2et2-1[468,0], vcache6.cn1389[589,0]",
        "expires": "-1",
        "pragma": "no-cache",
    },
    body: "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n<html>\r\n  <head>\r\n    <META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\"><script type=\"text/javascript\" src=\"/ruxitagentjs_ICA2SVfhqru_10171190801163814.js\" data-dtconfig=\"rid=RID_1719055406|rpid=-1195079989|domain=airasia.com|reportUrl=/rb_e4072b67-2264-4c3c-93d2-77d59ca2afe5|app=ea7c4b59f27d43eb|featureHash=ICA2SVfhqru|srsr=25000|rdnt=1|uxrgce=1|bp=2|srms=1,1,,,|uxrgcm=100,25,300,3;100,25,300,3|dpvc=1|md=1=cdisplayFare,2=cdisplayFare,3=cdisplayFare,5=cdisplayFare|lastModification=1564760586958|dtVersion=10171190801163814|tp=500,50,0,1|uxdcw=1500|agentUri=/ruxitagentjs_ICA2SVfhqru_10171190801163814.js\"></script><script src=\"https://cdn.optimizely.com/js/2453920098.js\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\"></script><meta name=\"Description\" content=\"Book the lowest fares online and fly with the World\'s Best Low-Cost Airline! The best deals and cheap flight tickets available for Asia and beyond!\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\">\r\n    <title>AirAsia | Booking | Book low fares online</title>\r\n    <link rel=\"icon\" href=\"images/AKBase/favicon.ico\" type=\"image/x-icon\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\">\r\n    <link rel=\"shortcut icon\" href=\"images/AKBase/favicon.ico\" type=\"image/x-icon\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\">\r\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/AKBase/Cultures/en-GB/far-min.css\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\"><!--[if IE 7]><link rel=\"stylesheet\" type=\"text/css\" href=\"css/AKBase/Cultures/en-GB/ie7_standard-min.css\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\"><![endif]--><!--[if IE 8]><link rel=\"stylesheet\" type=\"text/css\" href=\"css/AKBase/Cultures/en-GB/ie8_standard-min.css\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\"><![endif]--><link href=\"https://fonts.googleapis.com/css?family=Roboto:400,500\" rel=\"stylesheet\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\">\r\n    <link rel=\"icon\" href=\"images/AKBase/favicon.ico\" type=\"image/x-icon\">\r\n    <link rel=\"shortcut icon\" href=\"images/AKBase/favicon.ico\" type=\"image/x-icon\">\r\n  </head>\r\n  <body><input type=\"hidden\" id=\"logoutUrlLink\" value=\"https://www.airasia.com/en/en\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\"><div id=\"loadingBar\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\">\r\n      <div id=\"loadingDimmer\" style=\"position: fixed; top: 0; left: 0; background: #ffffff; filter:alpha(opacity=70); -moz-opacity:0.7; opacity: 0.7; z-index:9997; width:100%; height:100%;\"></div>\r\n      <div id=\"loadingBarBox\" style=\" position: fixed; display: none; top: 50%; left: 50%; padding: 20px; margin: auto; width: 300px; padding-top: 40px; height: 90px; text-align: center; margin-left: -200px; margin-top: -100px; background-color:Transparent; filter:alpha(opacity=100); -moz-opacity:1.0; opacity: 1.0;  z-index:9998;\"><img id=\"loadingImage\" src=\"images/AKBase/loading-128x128.gif\" style=\"width: 50px; height: 50px; filter:alpha(opacity=100); -moz-opacity:1.0; opacity: 1.0; z-index:9999;\"></div>\r\n      <div id=\"loadingBarBox2\" style=\"position: fixed; display: none; top: 20%; left: 50%; padding: 100px; margin: auto; padding-top: 40px; text-align: center; margin-left: -300px; margin-top: -100px; background-color:Transparent; filter:alpha(opacity=100); -moz-opacity:1.0; opacity: 1.0;  z-index:9998;\"><img id=\"loadingImage2\" src=\"images/AKBase/en-GB_interstitial1.png\" style=\"filter:alpha(opacity=100); -moz-opacity:1.0; opacity: 1.0; z-index:9999; margin-left: -30%;\"><br><img id=\"loader\" src=\"images/AKBase/Loader.gif\" style=\"filter:alpha(opacity=100); -moz-opacity:1.0; opacity: 1.0; z-index:9999; margin-top: 10px; margin-left: -30%;\"><div id=\"loadingImage2\" style=\"filter:alpha(opacity=100); -moz-opacity:1.0; opacity: 1.0; z-index:9999;\"></div>\r\n      </div>\r\n    </div>\r\n    <div id=\"allWrap\">\r\n      <noscript xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\"><em>\r\n      \r\n\t\t\t\tERROR:\r\n\t\t\t\tThis service makes use of Javascript, which appears to be turned off.\r\n\t\t\t\tClick <a href=\'activateJavascript.htm\' class=\'error\'>here</a> to learn how to activate it.\r\n        \r\n    \t</em></noscript><form method=\"post\" action=\"./AgentHome.aspx\" id=\"SkySales\"  novalidate><input id=\"eventTarget\" type=\"hidden\" value=\"\" name=\"eventTarget\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\"><input id=\"eventArgument\" type=\"hidden\" value=\"\" name=\"eventArgument\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\"><input id=\"viewState\" type=\"hidden\" value=\"/wEPDwUBMGRkkQ7/TK51RccrRyKUliQ2J/7L0h0=\" name=\"viewState\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\"><input type=\"hidden\" name=\"pageToken\" value=\"\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\"><div id=\"header\">\r\n        <div id=\"brand\" style=\"\"><img class=\"logo-print\" src=\"./images/AKNewSkin/logo-print.png\"><a title=\"AirAsia - Now Everyone Can Fly\" href=\"http://www.airasia.com\"><span>AirAsia - Now Everyone Can Fly</span></a></div>\r\n        <div id=\"PromoCode\" class=\"hidden\"></div>\r\n      </div>\r\n      <div class=\"clearAll\"></div>\r\n      <div id=\"memberInfo\">\r\n        <div id=\"memberInfo_assistive\"><a href=\"https://assistive.airasia.com/h5/assistive/r/booking2.airasia.com/AgentHome.aspx\">ACCESSIBLE VIEW</a></div>\r\n        <div id=\"memberInfo_fr\">\r\n          <ul>\r\n            <li class=\"ulMemberBorderLeft\"></li>\r\n            <li>\r\n              <ul class=\"ulMemberBorder\">\r\n                <li class=\"liWithBorder\"><span><strong>HI, </strong></span><span><strong id=\"userID\">CHUANG </strong></span><span><strong></strong></span></li>\r\n                <li class=\"liWithBorder\"><a href=\"#\" onclick=\"javascript:window.open(\'UpdateProfileAgent.aspx\', \'AirAsia\', \'width=600,height=400,toolbar=0,status=0,location=0,menubar=0,scrollbars=1,resizable=1\')\">MY PROFILE</a></li>\r\n                <li class=\"liNoBorder\"><a onclick=\"SKYSALES.DisplayLoadingBar();\" id=\"MemberLoginAgentHomeView_LinkButtonLogOut\" href=\"javascript:__doPostBack(\'MemberLoginAgentHomeView$LinkButtonLogOut\',\'\')\">LOGOUT</a></li>\r\n              </ul>\r\n            </li>\r\n            <li class=\"ulMemberBorderRight\"></li>\r\n          </ul>\r\n        </div>\r\n      </div>\r\n      <div class=\"spacer\"></div>\r\n      <div class=\"spacer\"></div><script language=\"javascript\" type=\"text/javascript\">\n      var tclientid=\"MemberLoginAgentHomeView\";\n      var ttimezone=new Date().getTimezoneOffset() * -1;\n      var timezonecontrol = document.getElementById(tclientid+\"_HFTimeZone\");\n      if (timezonecontrol != null) {\n      timezonecontrol.value = ttimezone;\n      }\n    </script><div id=\"wrapper\">\r\n        <div id=\"wrapper_l\">\r\n          <div id=\"wrapper_r\">\r\n            <div class=\"clearAll\"></div>\r\n            <div id=\"atAGlanceContent\"></div>\r\n            <div id=\"mainContent\" style=\"width: 75%\">\r\n              <div id=\"errorDiv\"></div>\r\n              <div id=\"menuDiv\" class=\"AgentMenu\">\r\n                <ul>\r\n                  <li class=\"&#xA;                  dropDown&#xA;                \"><a id=\"Search\" href=\"/Search.aspx\" onclick=\"SKYSALES.DisplayLoadingBar()\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\"><div class=\"AgentMenuDiv\"><img class=\"AgentMenuIcon\" border=\"0\" src=\"images/AKNewSkin/bookmyflight.png\" alt=\"Book My Flight Image\"><br>\r\n            BOOK<br>MY FLIGHT\r\n          </div></a></li>\r\n                  <li class=\"&#xA;                  dropDown&#xA;                \"><a id=\"MyBookings\" href=\"/BookingList.aspx\" onclick=\"SKYSALES.DisplayLoadingBar()\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\"><div class=\"AgentMenuDiv\"><img class=\"AgentMenuIcon\" border=\"0\" src=\"images/AKNewSkin/managebooking.png\" alt=\"Manage Booking\" title=\"Manage Booking\"><br>\r\n            MANAGE<br>MY BOOKING\r\n          </div></a></li>\r\n                  <li class=\"&#xA;                  dropDown&#xA;                \"><a id=\"UpdateProfileAgency\" href=\"/UpdateProfileAgency.aspx\" onclick=\"SKYSALES.DisplayLoadingBar()\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\"><div class=\"AgentMenuDiv\"><img class=\"AgentMenuIcon\" border=\"0\" src=\"images/AKNewSkin/manageagency.png\" alt=\"Manage Agency Profile\" title=\"Manage Agency Profile\"><br>\r\n            MANAGE<br>AGENCY<br>PROFILE\r\n          </div></a></li>\r\n                  <li class=\"&#xA;                  dropDown&#xA;                \"><a id=\"RegisterOrgAgent\" href=\"/RegisterOrgAgent.aspx\" onclick=\"SKYSALES.DisplayLoadingBar()\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\"><div class=\"AgentMenuDiv\"><img class=\"AgentMenuIcon\" border=\"0\" src=\"images/AKNewSkin/enrollagent.png\" alt=\"Enroll An Agent\" title=\"Enroll An Agent\"><br>\r\n            ENROLL<br>AN AGENT\r\n          </div></a></li>\r\n                  <li class=\"&#xA;                  dropDown&#xA;                \"><a id=\"AgentList\" href=\"/AgentList.aspx\" onclick=\"SKYSALES.DisplayLoadingBar()\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\"><div class=\"AgentMenuDiv\"><img class=\"AgentMenuIcon\" border=\"0\" src=\"images/AKNewSkin/agentmanagement.png\" alt=\"Agency Management\" title=\"Agency Management\"><br>\r\n            AGENT<br>MANAGEMENT\r\n          </div></a></li>\r\n                  <li class=\"&#xA;                  dropDown&#xA;                \"><a id=\"GroupBooking\" href=\"javascript:void(0);SKYSALES.openNewWindow(\'https://gbs.airasia.com/gbs?hashkey=c4927f59b04b8f4e6d4ea94d27376f84e27bad20c35d8974494070ba2d0bdc2b&amp;aid=37921710&amp;aName=CNCHONGQIN_YC\', \'GroupBooking\', \'width=1000,height=500,scrollbars=yes,resizable=yes\');\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\"><div class=\"AgentMenuDiv\"><img class=\"AgentMenuIcon\" border=\"0\" src=\"images/AKNewSkin/bookmyflight.png\" alt=\"Book My Flight Image\"><br>\r\n            GROUP BOOKING\r\n          </div></a></li>\r\n                </ul>\r\n              </div>\r\n              <div class=\"clearAll\"></div>\r\n              <div id=\"dropDownMenu\">\r\n                <div class=\"dropDownItem slideDownUp\">\r\n                  <ul>\r\n                    <li><a href=\"Search.aspx\">Book a Flight</a></li>\r\n                    <li><a href=\"Car.aspx\">Rent a Car</a></li>\r\n                    <li><a href=\"Hotel.aspx\">Book a Hotel</a></li>\r\n                    <li><a href=\"ActivitySearch.aspx\">Find an Activity</a></li>\r\n                  </ul>\r\n                </div>\r\n              </div>\r\n              <div class=\"navDivMMB\" id=\"menuDivMMB\">\r\n                <ul id=\"menu-textMMB\">\r\n                  <li class=\"textLine\" stepnumber=\"1\"><a id=\"AgentHome\">Home</a></li>\r\n                </ul>\r\n              </div>\r\n              <div class=\"clearAll\"></div>\r\n              <div id=\"mainContentHeaderDiv\">\r\n                <div id=\"pageTitle\">\r\n                  <h1>Latest Updates</h1>\r\n                </div>\r\n              </div>\r\n              <div id=\"selectMainBody\" class=\"mainBody form\">\r\n                <div>\r\n                  <iframe src=\"https://www.airasia.com/iframe-portal/travel-agents/en-GB.html\" width=\"100%\" height=\"1200px\" marginwidth=\"10\" marginheight=\"10\" frameborder=\"0\" style=\"overflow:auto;overflow-x:hidden;\"></iframe>\r\n                </div>\r\n                <div class=\"clearBoth\"></div>\r\n              </div>\r\n              <div id=\"mainContentFooterDiv\"></div>\r\n            </div>\r\n            <div class=\"clearAll\"></div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n      <div class=\"clearAll\"></div><script type=\"text/javascript\" src=\"js/AKBase/far-min.js\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\"></script><script type=\"text/javascript\" src=\"js/AKBase/googleAnalytics.js\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\"></script><script type=\"text/javascript\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\">\n      function getQueryStrings() { \n        var assoc  = {};\n        var decode = function (s) { return decodeURIComponent(s.replace(/\\+/g, \" \")); };\n        var queryString = location.search.substring(1); \n        var keyValues = queryString.split(\'&\');\n\n      for(var i in keyValues) {\n      var key = keyValues[i].split(\'=\');\n      if (key.length > 1) {\n      assoc[decode(key[0])] = decode(key[1]);\n      }\n      }\n\n      return assoc;\n      }\n      if(window.location.href.indexOf(\"culture\") != -1) {\n      var qs = getQueryStrings();\n      var myCulture = qs[\"culture\"];\n\n      if(myCulture.toUpperCase() == \"TH-TH\") {\n      var urlRedirect=window.location.href.replace(myCulture,\"en-TT\");\n      window.location = urlRedirect\n      }\n      }\n\n      if ($(\'#imagePath\') != null && $(\'#imagePath\').length > 0 && $(\'#imagePath\').val() != \"\")\n      {\n      SKYSALES.PreLoadImage();\n      SKYSALES.DisplayImageLoadingBar();\n      }\n      else\n      {\n      SKYSALES.DisplayLoadingBar();\n      }\n\n      SKYSALES.checkSSOStatus();\n\n      SKYSALES.datepicker = {};\n      SKYSALES.datepicker.datePickerFormat = \'mdy\';\n      SKYSALES.datepicker.datePickerDelimiter = \'/\';\n\n      if (SKYSALES.datepicker.datePickerFormat.length !== 3)\n      {\n      SKYSALES.datepicker.datePickerFormat = \'mdy\';\n      SKYSALES.datepicker.datePickerDelimiter = \'/\';\n      }\n      SKYSALES.datepicker.closeText = \'Close\';\n      SKYSALES.datepicker.prevText = \'<<\';\n      SKYSALES.datepicker.nextText = \'>>\';\n      SKYSALES.datepicker.currentText = \'Today\';\n    </script><script type=\"text/javascript\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\">\n      var theForm = document.forms[\'SkySales\'];\n      if (!theForm)\n      {\n      theForm = document.SkySales;\n      }\n      </script><div class=\"aspNetHidden\"><input type=\"hidden\" name=\"__VIEWSTATEGENERATOR\" id=\"__VIEWSTATEGENERATOR\" value=\"05F9A2B0\"></div></form><script type=\"text/javascript\" language=\"JavaScript\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\">\n      //defined in common.js\n      $(document).ready(function(){\n      WindowInitialize();\n\n      $(\":input[type=\'submit\']\").attr(\"formnovalidate\",\"formnovalidate\");\n\n      });\n\n      \n\n      var __doPostBack = function (eventTarget, eventArgument)\n      {\n      //added by Linson at 2012-01-09 begin\n      SKYSALES.ReDisplayLoadingBar();\n      //added by Linson at 2012-01-09 end\n      var clearAllValidity = null;\n      var eventTargetElement = window.document.getElementById(\'eventTarget\');\n      var eventArgumentElement = window.document.getElementById(\'eventArgument\');\n      var viewStateElement = window.document.getElementById(\'viewState\');\n      if (!theForm.onsubmit || (theForm.onsubmit() != false))\n      {\n      eventTargetElement.value = eventTarget || eventTargetElement.value;\n      eventTargetElement.name = \'__EVENTTARGET\';\n      if (eventArgument !== null)\n      {\n      eventArgumentElement.value = eventArgument;\n      }\n      eventArgumentElement.name = \'__EVENTARGUMENT\';\n      viewStateElement.name = \'__VIEWSTATE\';\n      if (theForm.checkValidity)\n      {\n      clearAllValidity = function ()\n      {\n      $(this).removeAttr(\"required\");\n      };\n      SKYSALES.common.getAllInputObjects().each(clearAllValidity);\n      }\n      theForm.submit();\n      }\n      };\n\n    </script><script type=\"text/javascript\" language=\"JavaScript\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\">\n      \n      SKYSALES.Resource = new SKYSALES.Class.Resource();\n      SKYSALES.Resource.init(\n      {\n      \"locationInfo\": \n          {}\n        ,\n      \"stationInfo\": {},\n      \"countryInfo\": \n          {}\n        ,\n      \"marketInfo\": \n          {}\n        ,\n      \"multicitymarketInfo\": \n          {}\n        ,\n      \"macInfo\": \n          {}\n        ,\n      \"sourceInfo\": \n          {}\n        ,\n      \"dateCultureInfo\": \n          {}\n        ,\n      \"dateCultureInfo\": \n          {}\n        ,\n      \"datePickerInfo\": \n      {\n      \"datePickerFormat\": \"mdy\",\n      \n          \"datePickerDelimiter\": \"/\",\n          \"datePickerDelimiter\": \"/\",\n        \n      \"closeText\": \"Close\",\n      \"prevText\": \"<<\",\n      \"nextText\": \">>\",\n      \"currentText\": \"Today\",\n      \"controlHeaderDepartText\": \"Select your Depart Date\",\n      \"controlHeaderReturnText\": \"Select your Return Date\"\n      }\n    ,\n      \"currencyCultureInfo\": \n          {}\n        ,\n      \"stateInfo\": \n          {}\n        ,\n      \"insuranceLocationInfo\": \n          {}\n        ,\n      \"carrierInfo\": \n          {}\n        ,\n      \"passengerInfo\": \n          {}\n        ,\n      \"titleInfo\": \n          {}\n        ,\n      \"carInfo\": \n          {}\n        ,\n      \"externalRateInfo\": \n          {}\n        ,\n      \"currencyInfo\": \n          {}\n        \n      }\n      );\n      </script><div id=\"footer\">\r\n        <div class=\"footer\">\r\n          <div class=\"footer-content\">\r\n            <ul class=\"footer-content-left\">\r\n              <li><a href=\"http://support.airasia.com/\" title=\"Customer Support\" target=\"_blank\">Customer Support</a></li>\r\n              <li><a href=\"http://www.airasia.com/my/en/about-us/terms-and-conditions.page\" title=\"Terms and conditions\" target=\"_blank\">Terms and conditions</a></li>\r\n            </ul>\r\n            <div class=\"footer-content-right\">Usage of the AirAsia website states your compliance of our <a href=\"https://www.airasia.com/my/en/about-us/terms-of-use.page\" title=\"Term of use\" target=\"_blank\">Term of use</a> and <a href=\"https://www.airasia.com/my/en/about-us/privacy-policy.page\" title=\"Privacy policy\" target=\"_blank\">Privacy policy</a><br> ©2019 AirAsia Berhad. <label id=\"label_IP\"> 25</label><br> This website is owned and operated by AirAsia Berhad (“AirAsia”).<br><a href=\"http://www.miitbeian.gov.cn\" title=\"粤ICP备17160544号\" target=\"_blank\">粤ICP备17160544号</a></div>\r\n          </div>\r\n        </div>\r\n        <div id=\"culture\" class=\"hidden\">en-GB</div>\r\n      </div>\r\n      <div class=\"clearAll\"></div>\r\n    </div><script type=\"text/javascript\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\">      $(window).load(function(){$(\'#loadingDimmer\').hide(); $(\'#loadingBarBox\').hide(); $(\'#loadingBarBox2\').hide(); SKYSALES.AutoSubmit();})</script><script type=\"text/javascript\" xmlns:AKformatterExtension=\"urn:navitaire:formatters:mcc\" xmlns:AKVMethods=\"urn:navitaire:vmethods\">_satellite.pageBottom();</script></body>\r\n</html>",
    raw: [],
    cookie: "",// not get cookie
    err: "",
}

the postman can get the cookie

QQ截图20190809133303

@WindSoilder
Copy link
Contributor

@zhaobingss I have try to copy your code into my machine and run it.
But what I find is the url you post is just return 200, it doesn't go with any redirect. (try set req.is_redirect = false in your main function, you can find out the site is still return 200)

But what's strange is that, when I run your code, I can see cookie value from response.

Would you please check response header fields in your do_request function?

You can just add println!("Response Header: {:?}", rsp_header); under your set response header comment)

It seems that the site doesn't returns Set-Cookie fields in your header.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants