Modify changelog per directory and not in top-level directory.
From ba36d7fc0aea4656ec8c2577306fec4c01c9a02d Mon Sep 17 00:00:00 2001
From: Konrad Kleine <kkle...@redhat.com>
Date: Wed, 26 Feb 2020 10:00:43 -0500
Subject: [PATCH] debuginfod: file:// URLs: handle curl resp. code

When file:// is used for DEBUGINFOD_URLS, then the response code for a
successful server query is 0 and not 200.

Using file:// can be helpful when you want to test your
debuginfod-client integration against a mocked file tree that mimics the
HTTP URLs from the debuginfod server. This way you don't have to run the
debuginfod server at all.

Fixes https://sourceware.org/bugzilla/show_bug.cgi?id=25600

Signed-off-by: Konrad Kleine <kkle...@redhat.com>
---
 debuginfod/ChangeLog           |  5 +++++
 debuginfod/debuginfod-client.c | 36 ++++++++++++++++++++++------------
 tests/ChangeLog                |  5 +++++
 tests/run-debuginfod-find.sh   | 18 ++++++++++++++++-
 4 files changed, 50 insertions(+), 14 deletions(-)

diff --git a/debuginfod/ChangeLog b/debuginfod/ChangeLog
index 16e14309..42f30f00 100644
--- a/debuginfod/ChangeLog
+++ b/debuginfod/ChangeLog
@@ -1,3 +1,8 @@
+2020-02-26  Konrad Kleine <kkle...@redhat.com>
+
+	* debuginfod-client.c: handle curl's response code correctly when
+	DEBUGINFOD_URLS begin with file://
+
 2020-02-25  Frank Ch. Eigler  <f...@redhat.com>
 
 	* debuginfod.cxx (parse_opt): Treat -R as if -Z.rpm .
diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c
index 186aa90a..4ab54593 100644
--- a/debuginfod/debuginfod-client.c
+++ b/debuginfod/debuginfod-client.c
@@ -716,20 +716,30 @@ debuginfod_query_server (debuginfod_client *c,
           else
             {
               /* Query completed without an error. Confirm that the
-                 response code is 200 and set verified_handle.  */
-              long resp_code = 500;
-              CURLcode curl_res;
-
-              curl_res = curl_easy_getinfo(target_handle,
-                                           CURLINFO_RESPONSE_CODE,
-                                           &resp_code);
-
-              if (curl_res == CURLE_OK
-                  && resp_code == 200
-                  && msg->easy_handle != NULL)
+                 response code is 200 when using HTTP/HTTPS and 0 when using 
+                 file:// and set verified_handle.  */
+              
+              if (msg->easy_handle != NULL)
                 {
-                  verified_handle = msg->easy_handle;
-                  break;
+                  char *effective_url = NULL;
+                  long resp_code = 500;
+                  CURLcode ok1 = curl_easy_getinfo(target_handle, CURLINFO_EFFECTIVE_URL, &effective_url);
+                  CURLcode ok2 = curl_easy_getinfo(target_handle, CURLINFO_RESPONSE_CODE, &resp_code);
+                  if(ok1 == CURLE_OK && ok2 == CURLE_OK && effective_url)
+                    {
+                      if (strncmp(effective_url, "http", 4) == 0)
+                        if(resp_code == 200)
+                          {
+                            verified_handle = msg->easy_handle;
+                            break;
+                          }
+                      if (strncmp(effective_url, "file", 4) == 0)
+                        if(resp_code == 0)
+                          {
+                            verified_handle = msg->easy_handle;
+                            break;
+                          }
+                    }
                 }
             }
         }
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 32ca1ce0..98e5c954 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,8 @@
+2020-02-26  Konrad Kleine <kkle...@redhat.com>
+
+	* run-debuginfod-find.sh: added tests for DEBUGINFOD_URLS beginning
+	with "file://"
+
 2020-02-21  Mark Wielaard  <m...@klomp.org>
 
 	* Makefile.am (TESTS_ENVIRONMENT): Explicitly unset DEBUGINFOD_URLS.
diff --git a/tests/run-debuginfod-find.sh b/tests/run-debuginfod-find.sh
index 2964e7c0..0facc555 100755
--- a/tests/run-debuginfod-find.sh
+++ b/tests/run-debuginfod-find.sh
@@ -40,7 +40,7 @@ cleanup()
   if [ $PID2 -ne 0 ]; then kill $PID2; wait $PID2; fi
   if [ $PID3 -ne 0 ]; then kill $PID3; wait $PID3; fi
 
-  rm -rf F R D L Z ${PWD}/.client_cache*
+  rm -rf F R D L Z ${PWD}/mocktree ${PWD}/.client_cache*
   exit_cleanup
 }
 
@@ -396,4 +396,20 @@ kill -int $PID3
 wait $PID3
 PID3=0
 
+########################################################################
+# Test fetching a file using file:// . No debuginfod server needs to be run for
+# this test.
+local_dir=${PWD}/mocktree/buildid/aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd/source/my/path
+mkdir -p ${local_dir}
+echo "int main() { return 0; }" > ${local_dir}/main.c
+
+# first test that is doesn't work, when no DEBUGINFOD_URLS is set
+DEBUGINFOD_URLS=""
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find source aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd /my/path/main.c && false || true
+
+# Now test is with proper DEBUGINFOD_URLS
+DEBUGINFOD_URLS="file://${PWD}/mocktree/"
+filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd /my/path/main.c`
+cmp $filename ${local_dir}/main.c
+
 exit 0
-- 
2.24.1

Reply via email to