2016-07-27 5 views
0

ich in den Hafen über etwas ich versucht, in Knoten geschrieben hatte, sieht die Anfrage wie folgt in Knoten (JS):Nicht Location-Header von Golang http Anfrage bekommen

function _initialConnection(user, pass, callback) { 
    let opts = { 
    url: config.loginURL, 
    headers: { 
     "User-Agent": "niantic" 
    } 
    }; 

    request.get(opts, (err, resp, body) => { 
    if (err) return callback(err, null); 

    console.log(resp.headers); 

    let data; 
    try { 
     data = JSON.parse(body); 
    } catch(err) { 
     return callback(err, null); 
    } 
    return callback(null, user, pass, data); 
    }); 
} 

function _postConnection(user, pass, data, callback) { 
    let opts = { 
    url: config.loginURL, 
    form: { 
     'lt': data.lt, 
     'execution': data.execution, 
     '_eventId': 'submit', 
     'username': user, 
     'password': pass 
    }, 
    headers: { 
     'User-Agent': 'niantic' 
    } 
    }; 


    request.post(opts, (err, resp, body) => { 
    if (err) return callback(err, null); 

    let parsedBody; 
    if (body) { 
     try { 
     parsedBody = JSON.parse(body) 
     if (('errors' in parsedBody) && parsedBody.errors.length > 0) { 
      return callback(
      new Error('Error Logging In: ' + paredBody.errors[0]), 
      null 
     ) 
    } 
     } catch(err) { 
     return callback(err, null); 
     } 
    } 

    console.log(resp.headers) 

    let ticket = resp.headers['location'].split('ticket=')[1]; 

    callback(null, ticket); 
    }); 
} 

Wenn ich console.log(resp.headers) ich sehen kann Standortkopf

Ich habe versucht, den besten Weg, dies in Go neu zu erstellen Ich konnte die ich am Ende mit:

// Initiate HTTP Client/Cookie JAR 

jar, err := cookiejar.New(nil) 
if err != nil { 
    return "", fmt.Errorf("Failed to create new cookiejar for client") 
} 
newClient := &http.Client{Jar: jar, Timeout: 5 * time.Second} 

// First Request 

req, err := http.NewRequest("GET", loginURL, nil) 
if err != nil { 
    return "", fmt.Errorf("Failed to authenticate with Google\n Details: \n\n Username: %s\n Password: %s\n AuthType: %s\n", details.Username, details.Password, details.AuthType) 
} 
req.Header.Set("User-Agent", "niantic") 
resp, err := newClient.Do(req) 
if err != nil { 
    return "", fmt.Errorf("Failed to send intial handshake: %v", err) 
} 
respJSON := make(map[string]string) 
err = json.NewDecoder(resp.Body).Decode(&respJSON) 
if err != nil { 
    return "", fmt.Errorf("Failed to decode JSON Body: %v", err) 
} 

resp.Body.Close() 

// Second Request 

form := url.Values{} 
form.Add("lt", respJSON["lt"]) 
form.Add("execution", respJSON["execution"]) 
form.Add("_eventId", "submit") 
form.Add("username", details.Username) 
form.Add("password", details.Password) 
req, err = http.NewRequest("POST", loginURL, strings.NewReader(form.Encode())) 
if err != nil { 
    return "", fmt.Errorf("Failed to send second request authing with PTC: %v", err) 
} 
req.Header.Set("User-Agent", "niantic") 
req.Header.Set("Content-Type", "application/x-www-form-urlencoded") 
resp, err = newClient.Do(req) 
if err != nil { 
    return "", fmt.Errorf("Failed to send second request authing with PTC: %v", err) 
} 
log.Println(resp.Location()) 
ticket := resp.Header.Get("Location") 

if strings.Contains(ticket, "ticket") { 
    ticket = strings.Split(ticket, "ticket=")[1] 
} else { 
    return "", fmt.Errorf("Failed could not get the Ticket from the second request\n") 
} 
resp.Body.Close() 

Aber wenn ich log.Println(resp.Location()) ich <nil>

bekommen, was ich bin wirklich nicht sicher, dass die Unterschiede sind hier (Ich habe mit und ohne die Content-Type Header versucht, aber aus irgendeinem Grund kann ich nur nicht die Location-Header, die ich suche.

Ich kann wirklich nicht eine Diskrepanz zwischen dem Knoten r Equest, gegen die Go-Anfrage, aber jede Hilfe wäre großartig, da ich mir am letzten Tag den Kopf von der Wand geschlagen habe. Vielen Dank.

Antwort

1

Sie können diese URL erhalten, indem Sie resp.Request.URL nach der überprüfen. Es gibt keine wirklich einfache Möglichkeit, Weiterleitungen zu ignorieren, Sie können einen manuellen Anruf über eine http.RoundTripper tun, oder Sie können eine CheckRedirect Funktion auf dem Client festlegen, aber es ist nicht ideal.

+0

Der Aufruf des Roundtrippers, Weiterleitungen zu ignorieren, ist so einfach wie das Aufrufen des Clients. Methode: 'resp, err: = http.DefaultTransport.RoundTrip (req)' –

+0

Beachten Sie jedoch, dass die Cookies nicht hinzugefügt werden zu der Keksdose, Sie würden analysieren und sie manuell hinzufügen müssen –

+0

Oh, vermisste ich die Plätzchen. Yup, es ist nicht einfach. –