33import functools
44import logging
55
6+ from docker_registry .core import compat
7+ json = compat .json
8+
69from .. import storage
710from .. import toolkit
811from . import cache
@@ -40,11 +43,12 @@ def lookup_source(path, stream=False, source=None):
4043 for k , v in flask .request .headers .iteritems ():
4144 if k .lower () != 'location' and k .lower () != 'host' :
4245 headers [k ] = v
43- logger .debug ('Request: GET {0}\n Headers: {1}' .format (
44- source_url , headers
46+ logger .debug ('Request: GET {0}\n Headers: {1}\n Args: {2} ' .format (
47+ source_url , headers , flask . request . args
4548 ))
4649 source_resp = requests .get (
4750 source_url ,
51+ params = flask .request .args ,
4852 headers = headers ,
4953 cookies = flask .request .cookies ,
5054 stream = stream
@@ -132,7 +136,8 @@ def wrapper(namespace, repository, *args, **kwargs):
132136 return wrapper
133137
134138
135- def source_lookup (cache = False , stream = False , index_route = False ):
139+ def source_lookup (cache = False , stream = False , index_route = False ,
140+ merge_results = False ):
136141 def decorator (f ):
137142 @functools .wraps (f )
138143 def wrapper (* args , ** kwargs ):
@@ -144,7 +149,7 @@ def wrapper(*args, **kwargs):
144149 if index_route and mirroring_cfg .source_index :
145150 source = mirroring_cfg .source_index
146151 logger .debug ('Source provided, registry acts as mirror' )
147- if resp .status_code != 404 :
152+ if resp .status_code != 404 and not merge_results :
148153 logger .debug ('Status code is not 404, no source '
149154 'lookup required' )
150155 return resp
@@ -163,6 +168,19 @@ def wrapper(*args, **kwargs):
163168 if not stream :
164169 logger .debug ('JSON data found on source, writing response' )
165170 resp_data = source_resp .content
171+ if merge_results :
172+ mjson = json .loads (resp_data )
173+ pjson = json .loads (resp .data )
174+ for mr in mjson ["results" ]:
175+ replaced = False
176+ for pi , pr in enumerate (pjson ["results" ]):
177+ if pr ["name" ] == mr ["name" ]:
178+ pjson ["results" ][pi ] = mr
179+ replaced = True
180+ if not replaced :
181+ pjson ["results" ].extend ([mr ])
182+ pjson ['num_results' ] = len (pjson ["results" ])
183+ resp_data = json .dumps (pjson )
166184 if cache :
167185 store_mirrored_data (
168186 resp_data , flask .request .url_rule .rule , kwargs ,
0 commit comments