2017-05-19 2 views
1

J'utilise la bibliothèque net/http dans 'Go' pour faire une demande HTTP GET. Dans la réponse, je reçois 12 en-têtes. Mais quand je lance exactement la même requête par le facteur, je reçois 16 en-têtes. L'un de ceux qui manquent est 'Content-Encoding'. Je comprends que cela doit être un problème CORS.Go: Détecter l'encodage gzip pour décompresser manuellement la réponse, mais l'en-tête 'Content-Encoding' est manquant

Mais comme je n'ai pas défini l'en-tête Accept-Encoding: gzip dans ma requête, et que je reçois toujours le codage gzip en réponse, le transport Go n'est pas automatically decompressing the response for me. Donc, je dois être capable de détecter manuellement l'encodage, puis le décompresser. Mais, je ne peux pas détecter si l'en-tête 'Content-Encoding' est manquant dans la réponse.

Voici mon code où j'essaie de le faire:

func calcDistanceAndDurationWithUberApi(originLat float64, originLon float64, destinationLat float64, destinationLon float64) (float64, float64, error) { 

    endpoint := "https://api.uber.com/v1.2/estimates/price" 
    parameters := fmt.Sprintf("?start_latitude=%v&start_longitude=%v&end_latitude=%v&end_longitude=%v", originLat, originLon, destinationLat, destinationLon) 

    req, err := http.NewRequest("GET", endpoint + parameters, nil) 
    if err != nil { 
     return 0, 0, err 
    } 

    req.Header.Add("Authorization", "Token " + getUberApiKey()) 
    req.Header.Add("Accept-Language", "en_US") 
    req.Header.Add("Content-Type", "application/json") 

    httpClient := &http.Client{} 
    resp, err := httpClient.Do(req) 
    if err != nil { 
     return 0, 0, err 
    } 
    if resp.StatusCode != 200 { 
     return 0, 0, errors.NotFound("Response: %v", resp.StatusCode) 
    } 
    defer resp.Body.Close() 

    pretty.Println("- REQUEST: ") 
    pretty.Println(req) 

    // Check if server sent gzipped response. Decompress if yes. 
    var respReader io.ReadCloser 
    switch resp.Header.Get("Content-Encoding") { 
    case "gzip": 
     fmt.Println("Content-Encoding is gzip") 
     respReader, err = gzip.NewReader(resp.Body) 
     defer respReader.Close() 
    default: 
     fmt.Println("Content-Encoding is Not gzip") 
     respReader = resp.Body 
    } 

    pretty.Println("- RESPONSE HEADER: ") 
    pretty.Println(resp.Header) 

    pretty.Println("- RESPONSE BODY: ") 
    pretty.Println(respReader) 

    return 0, 0, nil 
} 

L'état de réponse est '200 OK'. Voici la sortie (Réponse):

- RESPONSE HEADER: 
http.Header{ 
    "Content-Language":   {"en"}, 
    "Cache-Control":    {"max-age=0"}, 
    "X-Uber-App":    {"uberex-nonsandbox", "optimus"}, 
    "Strict-Transport-Security": {"max-age=604800", "max-age=2592000"}, 
    "X-Content-Type-Options": {"nosniff"}, 
    "Date":      {"Fri, 19 May 2017 07:52:17 GMT"}, 
    "Content-Geo-System":  {"wgs-84"}, 
    "Connection":    {"keep-alive"}, 
    "X-Frame-Options":   {"SAMEORIGIN"}, 
    "X-Xss-Protection":   {"1; mode=block"}, 
    "Server":     {"nginx"}, 
    "Content-Type":    {"application/json"}, 
} 
- RESPONSE BODY: 
&http.gzipReader{ 
body: &http.bodyEOFSignal{ 
    body: &http.body{ 
     src: &internal.chunkedReader{ 
      r: &bufio.Reader{ 
       buf: {0x48, 0x54, .......... } 

Répondre

0

j'ai donné pour l'opiniâtreté de l'api uber et a ajouté une autre tête de requête, req.Header.Add("Accept-Encoding", "gzip").

Maintenant, je reçois l'en-tête de réponse "Content-Encoding": "gzip", bien que je reçois toujours un corps de réponse indéchiffrable, mais c'est au-delà de la portée de cette question.

+0

Il est possible que l'API de Uber soit assez astucieuse pour n'inclure l'en-tête Content-Encoding que si le demandeur accepte gzip, mais pas assez astucieux * pour ne pas gziper la réponse * quand il n'accepte pas gzip. Ce serait définitivement un défaut à la fin d'Uber si c'est le cas. – Adrian

+0

Mais en même temps, ils sont assez têtus pour me donner une réponse gzip-ped si je leur demande de –