curl_formadd возвращает `CURL_FORMADD_OPTION_TWICE` при первом вызове

Я пытаюсь создать форму HTTP, используя libcurl, но не могу заставить ее работать должным образом. Каждый раз звоню curl_formadd это возвращается CURL_FORMADD_OPTION_TWICE, Единственная информация об этой ошибке указывает на то, что libcurl считает, что я пытаюсь добавить два элемента формы с одинаковым именем, хотя это первый вызов curl_formadd и я добавляю только один элемент!

  Declare Function curl_global_init Lib "libcurl" (flags As Integer) As Integer
  Declare Function curl_formadd Lib "libcurl" (FirstItem As Ptr, LastItem As Ptr, Option1 As Integer, Value1 As Ptr, Option2 As Integer, Value2 As Ptr, EndMarker As Integer) As Integer

  Const CURLFORM_COPYCONTENTS = 2
  Const CURLFORM_COPYNAME = 1
  Const CURLFORM_END = 17

  Dim formname, formvalue As MemoryBlock
  formname = "NAME"
  formvalue = "CONTENTS"

  If curl_global_init(3) = 0 Then
    Dim first, last As Ptr
    Dim err As Integer
    err = curl_formadd(first, last, CURLFORM_COPYNAME, formname, CURLFORM_COPYCONTENTS, formvalue, CURLFORM_END)
    Break
    ' err is 2 (CURL_FORMADD_OPTION_TWICE) 
  End If

Что эта ошибка пытается сказать мне?

1 ответ

Решение

Читая страницу man для curl_formadd(), там написано:

Указатели firstitem и lastitem должны указывать на NULL при первом вызове этой функции.

Вы, однако, передаете NULL для этих.

Вы также, кажется, пропускаете строки неправильно. Попробуйте определить параметры Value1 и Value2 "как CString", а затем передать обычные строки, а не блоки памяти.

Наконец, вы дали CURLFORM_COPYCONTENTS неправильный код. Это не 2, а 4. См. Перечисление CURLformoption в curl.h: "CFINIT(NOTHING)" получает значение 0, а каждый прошедший элемент получает на единицу больше, поэтому CFINIT(COPYCONTENTS) получает 4.

Вот код, который работает для меня:

Declare Function curl_global_init Lib "libcurl" (flags As Integer) As Integer
Declare Function curl_formadd Lib "libcurl" (ByRef FirstItem As Ptr, ByRef LastItem As Ptr, Option1 As Integer, Value1 As CString, Option2 As Integer, Value2 As CString, EndMarker As Integer) As Integer

Const CURLFORM_COPYCONTENTS = 4
Const CURLFORM_COPYNAME = 1
Const CURLFORM_END = 17
const CURL_GLOBAL_ALL = 3

Dim formname, formvalue As String
formname = "NAME"
formvalue = "CONTENTS"

If curl_global_init(CURL_GLOBAL_ALL) = 0 Then
  Dim first, last As Ptr
  Dim err As Integer
  err = curl_formadd(first, last, CURLFORM_COPYNAME, formname, CURLFORM_COPYCONTENTS, formvalue, CURLFORM_END)
  Break
  ' err is 0
End If
Другие вопросы по тегам