23.xhtml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!--
  3. h t t :: / / t /
  4. h t t :: // // t //
  5. h ttttt ttttt ppppp sssss // // y y sssss ttttt //
  6. hhhh t t p p s // // y y s t //
  7. h hh t t ppppp sssss // // yyyyy sssss t //
  8. h h t t p s :: / / y .. s t .. /
  9. h h t t p sssss :: / / yyyyy .. sssss t .. /
  10. <https://y.st./>
  11. Copyright © 2016 Alex Yst <mailto:copyright@y.st>
  12. This program is free software: you can redistribute it and/or modify
  13. it under the terms of the GNU General Public License as published by
  14. the Free Software Foundation, either version 3 of the License, or
  15. (at your option) any later version.
  16. This program is distributed in the hope that it will be useful,
  17. but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. GNU General Public License for more details.
  20. You should have received a copy of the GNU General Public License
  21. along with this program. If not, see <https://www.gnu.org./licenses/>.
  22. -->
  23. <!DOCTYPE html>
  24. <html xmlns="http://www.w3.org/1999/xhtml">
  25. <head>
  26. <base href="https://y.st./en/weblog/2016/01-January/23.xhtml" />
  27. <title>\CURLOPT_NOPROGRESS, \curl_getinfo(), and \parse_url() &lt;https://y.st./en/weblog/2016/01-January/23.xhtml&gt;</title>
  28. <link rel="icon" type="image/png" href="/link/CC_BY-SA_4.0/y.st./icon.png" />
  29. <link rel="stylesheet" type="text/css" href="/link/basic.css" />
  30. <link rel="stylesheet" type="text/css" href="/link/site-specific.css" />
  31. <script type="text/javascript" src="/script/javascript.js" />
  32. <meta name="viewport" content="width=device-width" />
  33. </head>
  34. <body>
  35. <nav>
  36. <p>
  37. <a href="/en/">Home</a> |
  38. <a href="/en/a/about.xhtml">About</a> |
  39. <a href="/en/a/contact.xhtml">Contact</a> |
  40. <a href="/a/canary.txt">Canary</a> |
  41. <a href="/en/URI_research/"><abbr title="Uniform Resource Identifier">URI</abbr> research</a> |
  42. <a href="/en/opinion/">Opinions</a> |
  43. <a href="/en/coursework/">Coursework</a> |
  44. <a href="/en/law/">Law</a> |
  45. <a href="/en/a/links.xhtml">Links</a> |
  46. <a href="/en/weblog/2016/01-January/23.xhtml.asc">{this page}.asc</a>
  47. </p>
  48. <hr/>
  49. <p>
  50. Weblog index:
  51. <a href="/en/weblog/"><abbr title="American Standard Code for Information Interchange">ASCII</abbr> calendars</a> |
  52. <a href="/en/weblog/index_ol_ascending.xhtml">Ascending list</a> |
  53. <a href="/en/weblog/index_ol_descending.xhtml">Descending list</a>
  54. </p>
  55. <hr/>
  56. <p>
  57. Jump to entry:
  58. <a href="/en/weblog/2015/03-March/07.xhtml">&lt;&lt;First</a>
  59. <a rel="prev" href="/en/weblog/2016/01-January/22.xhtml">&lt;Previous</a>
  60. <a rel="next" href="/en/weblog/2016/01-January/24.xhtml">Next&gt;</a>
  61. <a href="/en/weblog/latest.xhtml">Latest&gt;&gt;</a>
  62. </p>
  63. <hr/>
  64. </nav>
  65. <header>
  66. <h1><code>\CURLOPT_NOPROGRESS</code>, <code>\curl_getinfo()</code>, and <code>\parse_url()</code></h1>
  67. <p>Day 00322: Saturday, 2016 January 23</p>
  68. </header>
  69. <p>
  70. I did a bit of searching, and I found that there is a <a href="https://bugs.php.net/bug.php?id=65236">bug in how <code>\xml_parse_into_struct()</code> handles deeply-nested tags</a>.
  71. According to the Red Hat bug report, this bug is capable of <a href="https://bugzilla.redhat.com/show_bug.cgi?id=983689">crashing a script</a>.
  72. Due to the fact that the file that crashes the spider not being an actual <abbr title="Extensible Markup Language">XML</abbr> file, I have no idea how it is being interpreted.
  73. The spider only sends it to that function because it has no way to know if the file is an <abbr title="Extensible Markup Language">XML</abbr>/<abbr title="Hypertext Markup Language">HTML</abbr> file, so it sends all files through that function.
  74. After several more hours of debugging though, I finally found a problem in my spider itself that is making this problem worse: the progress function that I set is not being called! I removed a line that set the <code>\CURLOPT_NOPROGRESS</code> option to false, as I thought that it was leftover code that was not needed.
  75. The <abbr title="PHP: Hypertext Preprocessor">PHP</abbr> manual says that <a href="https://secure.php.net/manual/en/function.curl-setopt.php"><code>\CURLOPT_NOPROGRESS</code> should only be used for debugging</a>, but this is a lie! If <code>\CURLOPT_NOPROGRESS</code> is not set to false, the progress function will never be called.
  76. The <a href="https://stackoverflow.com/questions/17641073/how-to-set-a-maximum-size-limit-to-php-curl-downloads">original instructions for setting up a file size limit</a> were very helpful, as was the fact that my limiting function was set to generate output, though not output was being generated.
  77. Once I had the problem fixed though, too much output was being generated, ,so I had to disable that feature.
  78. I set up a new setting to re-enable it in the configuration file though.
  79. It seems that my file size limit might have been too high though, so I turned it down to eight megabytes.
  80. I am unsure if this file size is low enough to prevent future problems with non-<abbr title="Extensible Markup Language">XML</abbr> files or if the problem is only prevented for now because the file that triggered the error this particular time is larger than this limit.
  81. </p>
  82. <p>
  83. I looked further into the <a href="https://secure.php.net/manual/en/function.curl-getinfo.php"><code>\curl_getinfo()</code> function</a>, but it seems that it is not suitable for use in the spider.
  84. If a single <abbr title="Client for URLs/Client URL Request Library/Curl URL Request Library">cURL</abbr> handle is used for multiple file transfers, the output of this function gets a bit muddled.
  85. Specifically, if this file is called multiple times, any value that the function returned on a previous call will be called again, unless that value is overridden by a new value.
  86. That means that if the function is not yet able to retrieve information on the current download when called from within my <code>curl_limit</code> class, it will reuse the last-known value, which could be from a different download.
  87. I theorize that if I modified the <code>curl_limit</code> class to abort selected downloads based on the Content-Type header, files that the spider attempts to retrieve after the aborted download will also be potentially aborted, as <code>curl_limit</code> objects seem to get called several times before the server actually returns data, so the headers are not yet available.
  88. </p>
  89. <p>
  90. On the topic of optimization of include.d code, I realized today that my <code>CURLOPT_TOR</code> constant has an issue.
  91. It relies on the \CURL* constants, which unless the <abbr title="Client for URLs/Client URL Request Library/Curl URL Request Library">cURL</abbr> extension is installed and loaded, do not exist.
  92. This constant is only useful when the <abbr title="Client for URLs/Client URL Request Library/Curl URL Request Library">cURL</abbr> extension is loaded, but it is defined any time any constant in the name space is needed.
  93. </p>
  94. <p>
  95. We went out to some dunes to do some cooking on the trail, as Cyrus had to do that today to meet one of his Boy Scout requirements.
  96. Unfortunately, he forgot to bring both the metal screen to put over the fire and the pot to cook in, so we had to go back home to get them, using up some of what little time we have.
  97. Upon returning to the dunes, we gathered firewood and sap to build a fire and cook a meal.
  98. We then rushed back into town so that Cyrus could meet up with one of his counselors and get some of his requirements signed off on.
  99. </p>
  100. <p>
  101. While he was meeting with the counselor, Alyssa gave me a calendar and newspaper from the volunteer organization that she works with to look over.
  102. Today was hectic, so I was unable to look them over today, but hopefully they will give me a better idea of what she does.
  103. </p>
  104. <p>
  105. Upon returning home, Cyrus went over a few quick things with us in order to pass off more requirements.
  106. We discussed emergency situations and what to do in them, put together an emergency backpack, then discussed the family finances.
  107. After that, we were off to the local public library to finish our work there.
  108. We finished pruning the analog electronic media (<abbr title="Video Home System">VHS</abbr> cassettes and audio cassettes), then finished moving them all over to a single section to condense them.
  109. We cleaned off the dust on the freed shelves, reconfigured the shelves to have different spacing, and spread the digital electronic media out to allow room for collection growth.
  110. </p>
  111. <p>
  112. Once home from the library, Cyrus worked more on his Boy Scout requirements on his own.
  113. For me, it was time to once again debug the spider.
  114. It was again choking of a supposedly-empty <abbr title="Uniform Resource Identifier">URI</abbr> due to that bug that I intentionally did not fix <a href="/en/weblog/2016/01-January/19.xhtml">the other day</a>.
  115. This time, however, my code was just fine; I had not gotten a blank <abbr title="Uniform Resource Identifier">URI</abbr> due to an error in my code.
  116. I tracked down the hyperlink that caused the issue, and it was pointed at the <abbr title="Uniform Resource Identifier">URI</abbr> &quot;#fn:1&quot;.
  117. I immediately saw the problem: <code>\parse_url()</code> was seeing the colon and getting confused.
  118. To test my theory, I called <code>\parse_url()</code> directly and passed in the troublesome <abbr title="Uniform Resource Identifier">URI</abbr> fragment, and sure enough, the function returned falls.
  119. The next step was clear.
  120. I needed to find out whether the <abbr title="Uniform Resource Identifier">URI</abbr> fragment is valid.
  121. If the formatting is valid, I would know that <code>\parse_url()</code> is broken and I need to rewrite <code>merge_uris()</code> to use some other method or breaking <abbr title="Uniform Resource Identifier">URI</abbr>s into their components.
  122. On the other hand, if that syntax is invalid, this was not a problem in <code>\parse_url()</code>.
  123. Instead of rewriting <code>merge_uris()</code>, I needed to simply fix the bug in the spider.
  124. </p>
  125. <p>
  126. As it turns out, that <abbr title="Uniform Resource Identifier">URI</abbr> fragment is <a href="https://tools.ietf.org/html/rfc3986#section-3.5">completely valid</a>.
  127. I that same document, an example regular expression that parses a <abbr title="Uniform Resource Identifier">URI</abbr> is present in the document, though the <abbr title="Request for Comments">RFC</abbr>s are not under a free license.
  128. Luckily, someone that prefers to remain unmentioned helped me find a document saying that <a href="http://trustee.ietf.org/license-info/IETF-TLP-5.htm"><abbr title="Internet Engineering Task Force">IETF</abbr> document code components are covered by the Modified <abbr title="Berkeley Software Distribution">BSD</abbr> license</a>.
  129. I should be able to construct a working function tomorrow if I have time.
  130. </p>
  131. <p>
  132. In the end, Cyrus was unable to meet his project deadline of midnight tonight.
  133. However, it seems that he has been granted a short extension, allowing him to finish up by nine tomorrow.
  134. </p>
  135. <p>
  136. My <a href="/a/canary.txt">canary</a> still sings the tune of freedom and transparency.
  137. </p>
  138. <hr/>
  139. <p>
  140. Copyright © 2016 Alex Yst;
  141. You may modify and/or redistribute this document under the terms of the <a rel="license" href="/license/gpl-3.0-standalone.xhtml"><abbr title="GNU&apos;s Not Unix">GNU</abbr> <abbr title="General Public License version Three or later">GPLv3+</abbr></a>.
  142. If for some reason you would prefer to modify and/or distribute this document under other free copyleft terms, please ask me via email.
  143. My address is in the source comments near the top of this document.
  144. This license also applies to embedded content such as images.
  145. For more information on that, see <a href="/en/a/licensing.xhtml">licensing</a>.
  146. </p>
  147. <p>
  148. <abbr title="World Wide Web Consortium">W3C</abbr> standards are important.
  149. This document conforms to the <a href="https://validator.w3.org./nu/?doc=https%3A%2F%2Fy.st.%2Fen%2Fweblog%2F2016%2F01-January%2F23.xhtml"><abbr title="Extensible Hypertext Markup Language">XHTML</abbr> 5.1</a> specification and uses style sheets that conform to the <a href="http://jigsaw.w3.org./css-validator/validator?uri=https%3A%2F%2Fy.st.%2Fen%2Fweblog%2F2016%2F01-January%2F23.xhtml"><abbr title="Cascading Style Sheets">CSS</abbr>3</a> specification.
  150. </p>
  151. </body>
  152. </html>