[Spice-devel] "Expect: 100-continue" not handled properly in PUT
kt programs
ktprograms at gmail.com
Sun Jan 30 08:00:30 UTC 2022
Hi, I'm having a small problem with trying to use curl to upload files
to a shared folder that uses spice-webdavd. (I'm not mounting the
webdav, just trying to use curl to upload a single file).
In libphodav/phodav-method-put.c, lines 77 to 78, if the "Expect" header
if present, a warning is created, but no special handling is done.
Instead, "status" is set to either "SOUP_STATUS_CREATED" or
"SOUP_STATUS_OK".
As per the SoupServer documentation, if "status" if set and the "Expect"
header if present, the status will be returned and no further processing
will be done:
> (At this point, if the request headers contain "Expect: 100-continue",
> and a status code has been set, then SoupServer will skip the
> remaining steps and return the response. If the request headers
> contain "Expect: 100-continue" and no status code has been set,
> SoupServer will return a SOUP_STATUS_CONTINUE status before
> continuing.)
This is a problem because "curl --upload-file" will send a "PUT" request
with a "Expect: 100-continue" header, and instead of phodav sending a
"100" response and waiting for the body, it sends either "200" or "201".
Here is the output of "curl -T test.txt http://localhost:9843 -o
/dev/stdout -vvv", with "spice-webdavd" running on port 9843:
* Trying 127.0.0.1:9843...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to localhost (127.0.0.1) port 9843 (#0)
> PUT /test.txt HTTP/1.1
> Host: localhost:9843
> User-Agent: curl/7.81.0
> Accept: */*
> Content-Length: 14
> Expect: 100-continue
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 201 Created
< Server: PhodavServer libsoup/2.65.1
< Date: Wed, 26 Jan 2022 03:10:06 GMT
< Content-Length: 0
<
0 14 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
* Connection #0 to host localhost left intact
In contrast, when running the "simple-httpd" file from the libsoup
examples, with it listening on port "33467", and running "curl -T
test.txt http://localhost:33467 -o /dev/stdout -vvv", the output is:
* Trying 127.0.0.1:33467...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to localhost (127.0.0.1) port 33467 (#0)
> PUT /test.txt HTTP/1.1
> Host: localhost:33467
> User-Agent: curl/7.81.0
> Accept: */*
> Content-Length: 14
> Expect: 100-continue
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 100 Continue
< Server: simple-httpd libsoup/3.0.4
< Date: Wed, 26 Jan 2022 03:14:19 GMT
} [14 bytes data]
* We are completely uploaded and fine
* Mark bundle as not supporting multiuse
< HTTP/1.1 201 Created
< Content-Length: 0
<
100 14 0 0 100 14 0 11137 --:--:-- --:--:-- --:--:-- 14000
* Connection #0 to host localhost left intact
I have looked at the code, but I'm not sure how it would be possible to
handle this properly, because handling 100-continue needs a two step
process, which the current structure doesn't allow easily.
I'm doing this on an Alpine Linux aarch64 VM
Versions of packages used:
- spice-webdavd: 2.5
- curl 7.81.0
More information about the Spice-devel
mailing list