Hello!
I have idea to make possible to send files with CURL from string.
CURL library has few options to make it as easy as possible:
CURLFORM_BUFFER, CURLFORM_BUFFERPTR, and CURLFORM_BUFFERLENGTH.
But I got many problems with integration of this feature in current php
curl file attachment design.
Class CURLFile has one required $filename property, and two optional
properties $mimetype and $postname.
In my case we need two required properties $buffer and $postname, and one
optional $mimetype.
Also we have function curl_file_create, which just like alias function for
CURLFile constructor with same arguments.
So I tried to implement feature by different ways:
1) Create new class CURLFileBuffer by simple copy-paste code from CURLFile.
(pull-request https://github.com/php/php-src/pull/1217 - code was removed,
sorry)
positive:
- No BC break
- API similar to CURLFile
negative:
- A lot of code duplication, hard to support in future.
Thanks to Tony2001 and S.Malyshev for reviewing.
2) Integrate new feature to exists CURLFile class. (pull-request
https://github.com/php/php-src/pull/1283)
positive:
- One class for new and old features
- No code duplication
- No BC break (* except some little not obviously cases)
negative:
- Not clear behavior if developer will set $filename and $buffer in same
time. It require more documentation and not obviously for developers.
- Not clear which values of $filename we must ignore to start use $buffer.
- etc.
Thanks to S.Malyshev for reviewing.
3) Like #2, but make CURLFile immutable after instance creation by
curl_file_create and curl_file_buffer_create functions (or by little
modified constructors).
positive:
- Clear behavior.
negative:
- Great BC break: CURLFile has public properties and setters methods.
I like it, I think it will be great to make CURLFile immutable, but I'm
sure no one want such BC. =(
4) Like #1, but move code duplication to common C code, used by two
classes.
It's impossible, because this classes so simple, so 95% of code like that:
>
/* {{{ proto string CURLFile::getFilename()
Get file name */
ZEND_METHOD(CURLFile, getFilename)
{
curlfile_get_property("name", INTERNAL_FUNCTION_PARAM_PASSTHRU);
}
/* }}} */
So both classes required such doc block ({{{ proto ...) and call
*_property methods.
5) Like #1, but move code duplication to abstract class, for example
CURLFileAbstract.
So we move $mimetype and $postname to abstract class, $filename to
CURLFile, $buffer to CURLFileBuffer class.
They will have own constructors with own arguments requiring.
positive:
- No BC break
- less code duplication
negative:
- new abstract class, used ONLY for less code duplication in curl
extension, it has no sense for developers.
6+) Your variant, please provide it.
As you can see, so little change, like using few simple options from curl
library, require so long mail, few pull-requests and too many time from
internal php people.
But I believe, we can do it.
Thank you, and please help me to finish this small feature.
--
With regards, Alexander Moskalev
irker@irker.net
irker@php.net
a.moskalev@corp.badoo.com