mirror of
https://git.gnunet.org/libmicrohttpd.git
synced 2026-09-25 04:09:31 +03:00
fix handler
This commit is contained in:
+85
-48
@@ -474,6 +474,12 @@ struct UploadContext
|
||||
* True once @a tmpfile exists.
|
||||
*/
|
||||
bool have_file;
|
||||
|
||||
/**
|
||||
* True if we had an error handling the upload.
|
||||
*/
|
||||
bool error_file;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -635,6 +641,72 @@ stream_reader (struct MHD_Request *req,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Iterator over POST data.
|
||||
*
|
||||
* The @a data pointer is valid only until return from this function.
|
||||
*
|
||||
* The pointers to the strings in @a data are valid until any MHD_UploadAction
|
||||
* is provided. If the data is needed beyond this point, it should be copied.
|
||||
*
|
||||
* @param cls closure
|
||||
* @param data the element of the post data, the pointer is valid only until
|
||||
* return from this function
|
||||
* @return #MHD_YES to continue iterating,
|
||||
* #MHD_NO to abort the iteration
|
||||
* @ingroup request
|
||||
*/
|
||||
static enum MHD_Bool
|
||||
handle_full_upload (void *cls,
|
||||
const struct MHD_PostField *data)
|
||||
{
|
||||
struct UploadContext *uc = cls;
|
||||
int fd;
|
||||
|
||||
if (0 != strcmp ("upload",
|
||||
data->name.cstr))
|
||||
return MHD_YES;
|
||||
if (uc->have_file)
|
||||
{
|
||||
uc->error_file = true;
|
||||
return MHD_NO;
|
||||
}
|
||||
if (NULL == data->filename.cstr)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"Filename missing for full upload\n");
|
||||
uc->error_file = true;
|
||||
return MHD_NO;
|
||||
}
|
||||
fd = mkstemp (uc->tmpname);
|
||||
if (-1 == fd)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"Error creating temporary file `%s' for upload: %s\n",
|
||||
uc->tmpname,
|
||||
strerror (errno));
|
||||
uc->error_file = true;
|
||||
return MHD_NO;
|
||||
}
|
||||
if (NULL != data->value.cstr)
|
||||
{
|
||||
// FIXME: error handling, ...
|
||||
#if ! defined(_WIN32) || defined(__CYGWIN__)
|
||||
write (fd,
|
||||
data->value.cstr,
|
||||
data->value.len);
|
||||
#else /* Native W32 */
|
||||
write (fd,
|
||||
data->value.cstr,
|
||||
(unsigned int) data->value.len);
|
||||
#endif /* Native W32 */
|
||||
}
|
||||
close (fd);
|
||||
uc->have_file = true;
|
||||
return MHD_NO;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The callback to be called when finished with processing
|
||||
* of the postprocessor upload data.
|
||||
@@ -652,7 +724,6 @@ done_cb (struct MHD_Request *req,
|
||||
const struct MHD_UploadAction *ret;
|
||||
const struct MHD_StringNullable *cat;
|
||||
const struct MHD_StringNullable *lang;
|
||||
const struct MHD_StringNullable *upload;
|
||||
char fn[PATH_MAX];
|
||||
int res;
|
||||
|
||||
@@ -702,52 +773,18 @@ done_cb (struct MHD_Request *req,
|
||||
}
|
||||
/* FIXME: ugly that we may have to deal with upload
|
||||
here as well! */
|
||||
upload = MHD_request_get_value (req,
|
||||
MHD_VK_POSTDATA,
|
||||
"upload");
|
||||
if ( (NULL != upload) &&
|
||||
(NULL != upload->cstr) )
|
||||
#if FIXME_EVGENY
|
||||
MHD_request_get_post_data_cb (req,
|
||||
&handle_full_upload,
|
||||
uc);
|
||||
#endif
|
||||
if (uc->error_file)
|
||||
{
|
||||
if (uc->have_file)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"Upload data provided twice!\n");
|
||||
ret = MHD_upload_action_from_response (req,
|
||||
internal_error_response);
|
||||
goto cleanup;
|
||||
}
|
||||
if (NULL == uc->filename)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"Filename missing for full upload\n");
|
||||
ret = MHD_upload_action_from_response (req,
|
||||
internal_error_response);
|
||||
goto cleanup;
|
||||
}
|
||||
uc->fd = mkstemp (uc->tmpname);
|
||||
if (-1 == uc->fd)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"Error creating temporary file `%s' for upload: %s\n",
|
||||
uc->tmpname,
|
||||
strerror (errno));
|
||||
ret = MHD_upload_action_from_response (req,
|
||||
request_refused_response);
|
||||
goto cleanup;
|
||||
}
|
||||
// FIXME: error handling, ...
|
||||
#if ! defined(_WIN32) || defined(__CYGWIN__)
|
||||
write (uc->fd,
|
||||
upload->cstr,
|
||||
upload->len);
|
||||
#else /* Native W32 */
|
||||
write (uc->fd,
|
||||
upload->cstr,
|
||||
(unsigned int) upload->len);
|
||||
#endif /* Native W32 */
|
||||
close (uc->fd);
|
||||
uc->fd = -1;
|
||||
uc->have_file = true;
|
||||
fprintf (stderr,
|
||||
"Upload data provided twice!\n");
|
||||
ret = MHD_upload_action_from_response (req,
|
||||
internal_error_response);
|
||||
goto cleanup;
|
||||
}
|
||||
/* create directories -- if they don't exist already */
|
||||
#if ! defined(_WIN32) || defined(__CYGWIN__)
|
||||
@@ -765,7 +802,7 @@ done_cb (struct MHD_Request *req,
|
||||
(sizeof (fn) <= (size_t) res) )
|
||||
{
|
||||
fprintf (stderr,
|
||||
"snprintf() failed at %u\n", __LINE__);
|
||||
"snprintf() failed at %d\n", __LINE__);
|
||||
ret = MHD_upload_action_from_response (req,
|
||||
request_refused_response);
|
||||
goto cleanup;
|
||||
@@ -787,7 +824,7 @@ done_cb (struct MHD_Request *req,
|
||||
(sizeof (fn) <= (size_t) res) )
|
||||
{
|
||||
fprintf (stderr,
|
||||
"snprintf() failed at %u\n", __LINE__);
|
||||
"snprintf() failed at %d\n", __LINE__);
|
||||
ret = MHD_upload_action_from_response (req,
|
||||
request_refused_response);
|
||||
goto cleanup;
|
||||
|
||||
Reference in New Issue
Block a user