Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Since 2.6.0 ureq hangs for 5 seconds in recvfrom when making GET request to local OSRM server #600

@Arvamer

Description

@Arvamer

Example code:

fn main() -> Result<(), ureq::Error> {
    let req = env::args().nth(1);
    let req = req.as_deref().unwrap_or("http://192.168.59.2:8049/route/v1/driving/21.0122,52.2297;21.1122,52.2097?geometries=polyline&overview=full&continue_straight=true");

    let request = ureq::get(req);
    for key in request.header_names() {
        println!("> {}: {}", key, request.header(&key).unwrap_or_default());
    }

    println!("");

    let response = request.call()?;
    println!("{} {}", response.status(), response.status_text());

    for key in response.headers_names() {
        println!("< {}: {}", key, response.header(&key).unwrap_or_default());
    }

    let body: String = response.into_string()?;

    println!("{body}");

    Ok(())
}

Response:

200 OK
< access-control-allow-origin: *
< access-control-allow-methods: GET
< access-control-allow-headers: X-Requested-With, Content-Type
< content-type: application/json; charset=UTF-8
< content-disposition: inline; filename="response.json"
< connection: keep-alive
< keep-alive: timeout=5, max=512
{"code":"Ok","routes":[{"geometry":"ubx}Hu}f_CFCCIBOF?D?N?B?LCRKXKLERKRI@ABAAGGg@@SMaAMaAEUGWAKQ{A{AwLIo@Ge@AIKs@Gg@Ge@e@oDCYUcBHOCQ?E@CDMACEK`AqBTe@^y@N_@JUEa@C]]{BCOOu@CQAWAMAyCGeEA}AAeAAaC?cA?g@FmE?o@?k@?g@A_@Ca@KuAMsAJGEa@IqAI_A@[?G?A?C?CB]?G?K?I@O?G?Q?OGINuDNm@DUZkA@KJ_@AIh@oBFSf@iB\\}@v@eBz@qBLY@C?ABGf@cAnAsCfBwDJCDEFGCK~@yBZs@LUTg@Ve@h@qABGTi@HQj@qADH@AFCFADAK{ABWv@Q\\IAwA|@a@F?BGHM@OEG\\_AlA_DEa@NIEWW}BG_@E]CWIs@YyBOoBi@eEmD{YeAyIMm@CKCSSeBBCDGb@k@BGl@w@HWr@eAjAeBh@u@f@}@^w@`@}@JSDMP[?M@MD[N]`@aARe@Nc@Na@J]FM^mA^mARs@BM\\qAXoAZ}Ad@eCf@qCRsAPoAPmANsAHu@LkAFg@@MHcAHcAFs@Du@LcCHkBDq@BmADuABiABkA@kA@iA?qE@w@?u@@qD?u@@{B@gABgM@aE@gB?w@?q@@c@?c@@a@?a@@c@?a@@c@@a@@e@@a@@Q?a@Ba@@c@@a@@a@@QBi@@[?K@OBg@Ba@@c@@G@WBe@Bg@Dg@Bm@Di@F{@Fu@Fw@P}BRaCFo@Hw@Fs@JcAFk@Fk@Ho@TmB`@eDDYNiA@MBKBUBSDYD[zByPNeAFi@Hi@Jq@Hc@Fa@Jq@Hc@F[Jc@Jc@Nq@H[Lc@H]Nc@HYHWJ]Ts@N]pAiDhBmE@K@O@Q?MAKRa@x@cB`BuCXg@j@qAZmArDoELMDEr@s@JKJIPU\\g@t@cAf@o@j@iAPYPSDCZ[BCV[Zc@d@o@Xa@Za@X[BERQ@MDEDIFGFIFKNSLSR]\\_@jA}A`@c@BCBCM{@M_AIk@_@qCQyAUyAIq@bEqBr@_@f@Wh@Y~Aw@lBcAiAiI","legs":[{"steps":[],"distance":8168.2,"duration":5900.6,"summary":"","weight":5900.6}],"distance":8168.2,"duration":5900.6,"weight_name":"duration","weight":5900.6}],"waypoints":[{"hint":"4vIGgJYhD4FnAAAAIgAAAP0AAAAAAAAA2eVmQSf1k0CZnAxCAAAAAGcAAAAiAAAA_QAAAAAAAAABAAAAMp9AAUv2HAPonkABRPYcAwIArwoSGgIR","distance":5.116463,"name":"","location":[21.012274,52.229707]},{"hint":"utwQgc_cEIFfAwAAGwMAAAAAAABvAgAAR4HwQvYj3UIAAAAAnGStQl8DAAAbAwAAAAAAAG8CAAABAAAA1CZCAf6lHAOIJUIBJKgcAwAAXwQSGgIR","distance":65.269656,"name":"","location":[21.112532,52.20915]}]}

Strace:

socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 3 <0.000011>
ioctl(3, FIONBIO, [1])                  = 0 <0.000003>
connect(3, {sa_family=AF_INET, sin_port=htons(8049), sin_addr=inet_addr("192.168.59.2")}, 16) = -1 EINPROGRESS (Operation now in progress) <0.000028>
ioctl(3, FIONBIO, [0])                  = 0 <0.000003>
poll([{fd=3, events=POLLOUT}], 1, 29999) = 1 ([{fd=3, revents=POLLOUT}]) <0.026598>
setsockopt(3, SOL_TCP, TCP_NODELAY, [1], 4) = 0 <0.000022>
setsockopt(3, SOL_SOCKET, SO_RCVTIMEO_OLD, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0 <0.000013>
setsockopt(3, SOL_SOCKET, SO_SNDTIMEO_OLD, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0 <0.000011>
sendto(3, "GET /route/v1/driving/21.0122,52"..., 208, MSG_NOSIGNAL, NULL, 0) = 208 <0.000037>
recvfrom(3, "HTTP/1.0 200 OK\r\nContent-Encodin"..., 8192, 0, NULL, NULL) = 1427 <0.030382>
setsockopt(3, SOL_SOCKET, SO_RCVTIMEO_OLD, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0 <0.000058>
brk(0x559e1a61c000)                     = 0x559e1a61c000 <0.000020>
recvfrom(3, "", 8192, 0, NULL, NULL)    = 0 <5.001521>
close(3)                                = 0 <0.000066>

Second recvfrom returns 0 bytes received after 5s.

In 2.5, first recvfrom read less data, so second call to recvfrom also returns something:

socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 3 <0.000012>
ioctl(3, FIONBIO, [1])                  = 0 <0.000004>
connect(3, {sa_family=AF_INET, sin_port=htons(8049), sin_addr=inet_addr("192.168.59.2")}, 16) = -1 EINPROGRESS (Operation now in progress) <0.000036>
ioctl(3, FIONBIO, [0])                  = 0 <0.000003>
poll([{fd=3, events=POLLOUT}], 1, 29999) = 1 ([{fd=3, revents=POLLOUT}]) <0.023238>
setsockopt(3, SOL_TCP, TCP_NODELAY, [1], 4) = 0 <0.000082>
setsockopt(3, SOL_SOCKET, SO_RCVTIMEO_OLD, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0 <0.000029>
setsockopt(3, SOL_SOCKET, SO_SNDTIMEO_OLD, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0 <0.000025>
sendto(3, "GET /route/v1/driving/21.0122,52"..., 208, MSG_NOSIGNAL, NULL, 0) = 208 <0.000037>
recvfrom(3, "HTTP/1.0 200 OK\r\nContent-Encodin"..., 8192, 0, NULL, NULL) = 1313 <0.029888>
setsockopt(3, SOL_SOCKET, SO_RCVTIMEO_OLD, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0 <0.000035>
brk(0x555dfee66000)                     = 0x555dfee66000 <0.000046>
recvfrom(3, "tu\254\375\242^\356+?\211\26\221n\33Kn\rdV\336\7\21\22\357\304\317\30\334X\225\377>"..., 8192, 0, NULL, NULL) = 114 <0.000977>
close(3)                                = 0 <0.000023>

OSRM from this docker image: https://hub.docker.com/r/osrm/osrm-backend/

My guess is on incorrect handling of missing content-length header/HTTP 1.0 .

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions