Print

Print


After upgrading from 5.0.3 to 5.1.0, the Nagios probe used for SAM tests fails:
https://gitlab.cern.ch/lcgdm/nagios-plugins-webdav/-/blob/master/src/check_webdav

I reduced this lengthy, Python2-only reproducer to the following short program (as compared to the probe, it works with Python 3, and enforces chunked transfers also with modern `curl` libraries):
```python
#!/usr/bin/env python

import os
import pycurl

curl = pycurl.Curl()
#curl.setopt(pycurl.FOLLOWLOCATION, 1)

curl.setopt(pycurl.CAINFO, os.getenv("X509_USER_PROXY"))
curl.setopt(pycurl.SSLCERT, os.getenv("X509_USER_PROXY"))
curl.setopt(pycurl.CAPATH, "/etc/grid-security/certificates")
curl.setopt(pycurl.URL, "https://my-server:1094/data/some/path/testfile")
curl.setopt(pycurl.HTTPHEADER, ["Transfer-Encoding: chunked"])

TEST_DATA = "This is some text 0x1d bytes."

curl.setopt(curl.VERBOSE, 1)

def print_traffic(msg_kind, msg):
  if msg_kind < 1 or msg_kind > 4:
    return
  if msg_kind % 2 ==0:
    print("[%2d]> %s" % (msg_kind, str(msg)))
  elif msg_kind % 2 == 1:
    print("[%2d]< %s"  % (msg_kind, str(msg)))

curl.setopt(pycurl.DEBUGFUNCTION, lambda x, y: print_traffic(x, y))

class StringReader:
  def __init__(self, data):
    self.pos = 0
    self.data = data
  def read(self, size):
    ret = self.data[self.pos:self.pos+size]
    self.pos=self.pos+size

    if len(ret) == 0:
      self.pos = 0
    return ret

curl.setopt(pycurl.UPLOAD, 1)
stringreader = StringReader(TEST_DATA)
curl.setopt(pycurl.READFUNCTION, stringreader.read)

curl.perform()

print(curl.getinfo(pycurl.HTTP_CODE))
```

Running this against XRootD 5.0.3 shows:
```
[ 2]> b'PUT /data/some/path/testfile HTTP/1.1\r\nHost: my-server:1094\r\nUser-Agent: PycURL/7.43.0.6 libcurl/7.74.0 (NSS/3.60.1) OpenSSL/1.1.1j zlib/1.2.11 c-ares/1.17.1 libidn2/2.3.0 libssh2/1.9.0_DEV nghttp2/1.41.0 librtmp/2.3\r\nAccept: */*\r\nTransfer-Encoding: chunked\r\nExpect: 100-continue\r\n\r\n'
[ 1]< b'HTTP/1.1 100 Continue\r\n'
[ 1]< b'Connection: Close\r\n'
[ 4]> b'1d\r\nThis is some text 0x1d bytes.\r\n'
[ 4]> b'0\r\n\r\n'
[ 1]< b'HTTP/1.1 200 OK\r\n'
[ 1]< b'Connection: Keep-Alive\r\n'
[ 1]< b'Content-Length: 3\r\n'
[ 1]< b'\r\n'
[ 3]< b':-)'
200
:-)
```

However, against XRootD 5.1.0 I get:
```
[ 2]> b'PUT /data/some/path/testfile HTTP/1.1\r\nHost: my-server:1094\r\nUser-Agent: PycURL/7.43.0.6 libcurl/7.74.0 (NSS/3.60.1) OpenSSL/1.1.1j zlib/1.2.11 c-ares/1.17.1 libidn2/2.3.0 libssh2/1.9.0_DEV nghttp2/1.41.0 librtmp/2.3\r\nAccept: */*\r\nTransfer-Encoding: chunked\r\nExpect: 100-continue\r\n\r\n'
[ 1]< b'HTTP/1.1 100 Continue\r\n'
[ 1]< b'Connection: Close\r\n'
[ 1]< b'HTTP/1.1 400 Unknown\r\n'
[ 1]< b'Connection: Close\r\n'
[ 1]< b'Content-Length: 24\r\n'
[ 1]< b'\r\n'
[ 4]> b'1d\r\nThis is some text 0x1d bytes.\r\n'
[ 3]< b'Invalid chunked encoding'
400
Invalid chunked encoding
```

This breaks EGI SAM tests. 

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/xrootd/xrootd/issues/1411

########################################################################
Use REPLY-ALL to reply to list

To unsubscribe from the XROOTD-DEV list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=XROOTD-DEV&A=1