3
3
import functools
4
4
import logging
5
5
6
+ from docker_registry .core import compat
7
+ json = compat .json
8
+
6
9
from .. import storage
7
10
from .. import toolkit
8
11
from . import cache
@@ -40,11 +43,12 @@ def lookup_source(path, stream=False, source=None):
40
43
for k , v in flask .request .headers .iteritems ():
41
44
if k .lower () != 'location' and k .lower () != 'host' :
42
45
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
45
48
))
46
49
source_resp = requests .get (
47
50
source_url ,
51
+ params = flask .request .args ,
48
52
headers = headers ,
49
53
cookies = flask .request .cookies ,
50
54
stream = stream
@@ -132,7 +136,8 @@ def wrapper(namespace, repository, *args, **kwargs):
132
136
return wrapper
133
137
134
138
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 ):
136
141
def decorator (f ):
137
142
@functools .wraps (f )
138
143
def wrapper (* args , ** kwargs ):
@@ -144,7 +149,7 @@ def wrapper(*args, **kwargs):
144
149
if index_route and mirroring_cfg .source_index :
145
150
source = mirroring_cfg .source_index
146
151
logger .debug ('Source provided, registry acts as mirror' )
147
- if resp .status_code != 404 :
152
+ if resp .status_code != 404 and not merge_results :
148
153
logger .debug ('Status code is not 404, no source '
149
154
'lookup required' )
150
155
return resp
@@ -163,6 +168,19 @@ def wrapper(*args, **kwargs):
163
168
if not stream :
164
169
logger .debug ('JSON data found on source, writing response' )
165
170
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 )
166
184
if cache :
167
185
store_mirrored_data (
168
186
resp_data , flask .request .url_rule .rule , kwargs ,
0 commit comments