2009-02-08 4 views
1

pycurl에서 전송을 취소하려면 어떻게해야합니까? 나는 libcurl에서 -1을 반환하는 데 사용하지만 pycurl doesnt는 ("pycurl.error : 쓰기 콜백 -1 17에 대한 잘못된 반환 값) return 0 doesnt work, 나는"error : (23, 'body failed writing body ') ". 또한 어떻게 내가 pycurl 시도/예외합니까? 나는 온라인에서 예제를 볼 수 없으며 사이트의 pycurl 예제를 보지 않는다.pycurl 전송 취소 및 시도 & except

답변

3

예제 코드가 도움이 될 것이다. 오류 메시지로 판단하고 소스 코드에서 grepping을하면 쓰기 콜백이 설정됩니다. 이 CURLOPT_WRITEFUNCTION에 의해, 내 생각, 구성, 그리고 설명서는 말한다 :

Return the number of bytes actually taken care of. If that amount differs from the amount passed to your function, it'll signal an error to the library and it will abort the transfer and return CURLE_WRITE_ERROR.

pycurl 래퍼 코드는 값이 0에 전달 숫자 사이에 있는지 확인합니다. 그것이 -1이 실패한 이유이며, CURLE_WRITE_ERROR를 트리거하는 0이 "실패한 서체"예외를 발생시키는 이유입니다. pycurl 코드는 다음과 같습니다

/* run callback */ 
arglist = Py_BuildValue("(s#)", ptr, total_size); 
if (arglist == NULL) 
    goto verbose_error; 
result = PyEval_CallObject(cb, arglist); 
Py_DECREF(arglist); 
if (result == NULL) 
    goto verbose_error; 

/* handle result */ 
if (result == Py_None) { 
    ret = total_size;   /* None means success */ 
} 
else if (PyInt_Check(result)) { 
    long obj_size = PyInt_AsLong(result); 
    if (obj_size < 0 || obj_size > total_size) { 
     PyErr_Format(ErrorObject, "invalid return value for write callback %ld %ld", (long)obj_size, (long)total_size); 
     goto verbose_error; 
    } 
    ret = (size_t) obj_size; /* success */ 
} 
else if (PyLong_Check(result)) { 
     ... identical code for Long ... 
} 
else { 
    PyErr_SetString(ErrorObject, "write callback must return int or None"); 
    goto verbose_error; 
} 

내가 다른 반환 값을 지원하기 위해이 기능 pycurl에 어떤 식 으로든 표시되지 않습니다. 진행 중단 콜백을 설정하는 것과 같은 다른 방법이있을 수 있습니다. 중단을 허용하는 것처럼 보입니다.

컬 자체에 관련 코드는 다음과 같습니다

/* If the previous block of data ended with CR and this block of data is 
    just a NL, then the length might be zero */ 
if(len) { 
    wrote = data->set.fwrite_func(ptr, 1, len, data->set.out); 
} 
else { 
    wrote = len; 
} 

if(CURL_WRITEFUNC_PAUSE == wrote) 
    return pausewrite(data, type, ptr, len); 

if(wrote != len) { 
    failf(data, "Failed writing body (%d != %d)", (int)wrote, (int)len); 
    return CURLE_WRITE_ERROR; 
} 

그래서 당신은 pycurl 자체가 허용 컬 CURL_WRITEFUNC_PAUSE 반환을 지원하지 않습니다 볼 수 있습니다. 또한 curl은 write 콜백 함수를 통해 중단을 지원할 방법이 없음을 볼 수 있습니다. 다른 것을 사용해야 할 것입니다.